Leeyoonjoo/Malware_triage

GitHub: Leeyoonjoo/Malware_triage

一个将恶意软件分析流程标准化、可复现化的团队协作学习框架,通过统一的 JSON Schema 和六阶段分析流水线实现从样本输入到自动报告生成的完整闭环。

Stars: 0 | Forks: 0

# Malware_triage ## 项目定义 ### 概要 将恶意软件分析从“单独样本解谜”转变为可重现分析流程(pipeline)标准化的项目式学习 ### 目的 不仅仅是为了“通过工具得出结果”,而是要同时为团队和成员个人确立以下能力: - 个人能力 - 能够基于证据通过静态/动态分析判断风险等级。 - 能够将产出物制作成**结构化数据(JSON)**,并以此为依据撰写简明准确的报告。 - 能够提取并规范化 IOC,实现从“分析 -> 响应”的衔接。 - 团队能力 - 任何人都能通过相同的步骤执行,生成相同目录结构的报告。(可重现性) - 使用统一的 schema 整合静态/动态/IOC,创建可比较、可扩展的数据资产。 - 通过实战型产出物(checklist/README/template)建立可协作、可交接的体系。 ### 达成目标 使用相同流程处理 3~5 个样本,自动生成具有相同章节结构的报告。
- input : 样本 - ouput : checklist + 模块化 JSON + 最终报告(基于模板自动生成) 静态/动态/IOC 产出物整合为通用的 JSON schema。
环境、流程通过 README + checklist 文档化,即使团队成员变更也能重现。 💡使用 Schema 的原因
- Schema 是“关于数据存储格式的约定” - 本项目中的 Schema 用于以下 3 点 1. **整合**:如果静态/动态/IOC 格式不一致,则无法自动生成报告 2. **可重现性**:只有当每个人都在相同的字段中记录相同含义的内容时,才能进行比较和自动化 3. **扩展性**:即使将来工具/日志发生变化,Schema 作为“契约”也能保证整体架构不崩塌 ## 2. 整体流程定义 各阶段旨在同时生成**个人学习产出物**和**团队通用产出物**。 ### 2.1 Stage 0. Governance(治理/安全/可重现性基础) - 产出物: - 样本处理策略(隔离/保管/禁止共享范围) - 执行环境标准(虚拟环境/快照) - 版本记录(工具版本、OS、配置) - 意义:分析质量的 50% 取决于“流程”。 ### 2.2 Stage 1. Intake(导入/识别/记录) - 输入: 样本文件(PE)+ 可选日志/PCAP - 处理: - 分配 SHA256/文件元数据/样本 ID - 分离原始文件与工作副本,自动记录工作日志 - 输出(JSON): - `sample` 部分(哈希、大小、类型、提交日期、存储路径等) ### 2.3 Stage 2. Static(静态分析) - 处理: - PE 头/节/导入/签名/熵/资源 - 字符串提取及分类(URL/域名/路径/注册表键候选) - 加壳怀疑(基于证据规则,可进行简单评分) - 输出(JSON): - `static` 部分(节/导入/熵/字符串 artifacts/假设) ### 2.4 Stage 3. Dynamic(动态分析) - 原则: 禁止环境复杂化,固定最小项目 - 处理: - 进程树、文件/注册表变更、网络连接 - 执行前后快照对比(以变更点为中心) - 输出(JSON): - `dynamic` 部分(process_tree, file_ops, reg_ops, net_ops, timeline) ### 2.5 Stage 4. IOC/Signature(规范化/提升至检测视角) - 处理: - 从静态/动态中提取 IOC → 按类型规范化/去重 - (可选)YARA 草案:以稳定特征为中心 + 简单测试记录 - 输出(JSON): - `iocs` 部分(域名/IP/URL/路径/哈希/注册表键等) - (可选) `signatures` 部分(YARA, 测试结果) ### 2.6 Stage 5. Assessment & Recommendations(判断/处置) - 处理: - 风险等级(LOW/MED/HIGH)、置信度、依据 - 建议(Containment/Eradication/Hardening) - 输出(JSON): - `assessment`, `recommendations` 部分 ### 2.7 Stage 6. Report(基于模板自动生成) - 处理: - 通用 JSON → 模板渲染 - 输出: - 最终报告 + 附录(日志链接/工具版本/环境) # 1周
1week
## 第1周 : 团队通用结构达成共识 目标 : 各自准备 schema 草案材料,在第1周会议上确定 v0.1 ### 1) 制作 1 个 Minimal v0.1 虚拟 JSON 目的 : 让每个人提出能够支撑自动报告的最小结构
方法 : 无需实际分析,可用虚拟值填充(未知值使用 null/[])
提交物 : analysis_result.json 1个(虚拟数据) #### 我的 Minimal v0.1 的基本原则 1. 仅包含必填字段 2. 最小化嵌套结构 3. 类型明确 4. 看起来像真实值,但示例保持简单 - 字段说明 - schema/version : 确保将来格式变更时的解析/兼容性 - sample_id : 样本识别(内部 ID) - hashes : 重新识别同一样本的核心 - source : 样本来源(如邮件、EDR、URL、取证等) - timstamps : 记录何时接收、何时分析 - triage : 当前阶段的结论、优先级、状态 - artifacts : 最基本的 1~2 个 IOC,如文件名路径 ### 2) 编写 10 个字段字典 编写 10 个你认为必须的字段 1. `shema_version`(string) → Triage JSON schema 版本,用于将来结构变更时保持兼容性 2. `sample_id`(string) → 内部 Triage 系统中使用的样本唯一标识符 3. `sha256`(string) → 恶意软件样本的 SHA-256 哈希值,用于样本再识别和去重 4. `file_name`(string) → 分析对象的原始文件名 5. `file_path`(string) → 样本在系统中被发现的路径 6. `source`(string) → 样本流入途径 7. `ingested_at`(string) → 样本被收集到 Triage 系统的时间 8. `verdict`(string) → 1 次 Triage 判定结果(benign, suspicious, malicious, unknow) 9. `severity`(string) → 威胁严重程度 10. `analyst_note` → 分析师留下的简要判断依据或备注 # Team Common v0.1
Team Common v0.1
这是第1周时整合各队员 schema 后的版本。 本 schema 并非 DB schema,而是将恶意软件分析结果标准化为 analysis_result.json 格式, 旨在共享和比较团队内结果,自动生成报告,并为后续 v0.2 扩展提供数据契约
### v0.1 的设计目标 - 固定报告不崩溃所需的 10 个最小必填字段 - 区分“分析失败/未确定”与“无结果”,使用 null vs [] - 禁止省略字段以最小化解析器异常 ## 1. 数据类型规则 - `string`: UTF-8 字符串 - `number`: 允许整数/实数(分数建议使用整数) - `array`: JSON 数组 - `null`: 表示未产出/未确定/失败 ## 2. 顶层结构(固定) v0.1 中以下字段必须全部存在! - `meta` - `sample` - `summary` - `static` - `dynamic` - `iocs` - `assessment`
注意:v0.1 仅强制“必填 10 项”,但这些字段所属的上级对象(如 meta/sample/summary/static/dynamic/iocs/assessment)也必须同时存在,报告才能稳定。 ## 3. 必填字段定义 | # | field_path | type | meaning | example | missing_rule | | --- | --- | --- | --- | --- | --- | | 1 | meta.schema_version | string | 此 JSON 遵循的 schema 版本 | `"0.1.0"` | 必填,禁止省略,禁止 null | | 2 | sample.sha256 | string | 样本唯一识别哈希 | `"0123...cdef"` | 必填,禁止省略,禁止 null | | 3 | sample.filename | string | null | 原始文件名 | `"invoice.exe"` | 如未知则 `null`(禁止省略) | | 4 | summary.verdict | string | 最终判定(用于标签) | `"unknown"` | 必填,无法产出时为 `"unknown"` | | 5 | summary.malicious_score | number | null | 风险/恶意分数(区分 0 和 null) | `72` | 未定/未产出则为 `null` | | 6 | static.imports | array | 静态分析 Import 列表(至少包含 DLL/函数名) | `["kernel32.dll"]` | 无结果则 `[]` | | 7 | dynamic.process_tree | array | 动态分析进程树 | `[{"pid":1234,"name":"sample.exe"}]` | 无结果则 `[]` | | 8 | dynamic.network.connections | array | 观察到的网络连接列表 | `[{"dst_ip":"1.2.3.4","dst_port":443,"protocol":"TCP"}]` | 无结果则 `[]` | | 9 | iocs.domains | array | 域名 IOC 列表 | `["samplesite.com"]` | 无结果则 `[]` | | 10 | assessment.severity | string | 最终危险等级 | `"HIGH"` | 必填,无法判断时为 `"UNKNOWN"` | ## 4. 缺失规则(团队通用) — 详细版本 ### 4.1 使用 null 的情况(unknown / not-yet / failed) - 字段**必须存在**,但因以下原因值未确定时使用 `null`。 - 未产出(尚未计算/提取) - 分析失败(工具崩溃、权限不足、超时) - 环境限制(沙箱未配置、网络阻断等) - 主要在**标量字段**中使用。 例如: `summary.malicious_score: null`, `sample.filename: null` ### 4.2 使用 [] 的情况 - 分析/收集正常执行,但**确认该事项不存在**时使用空数组 `[]`。 - 例如:未观察到网络通信 → `dynamic.network.connections: []` ### 4.3 省略 - v0.1 中 **10 个必填字段禁止省略** - 此外,上级块的基本原则也是不省略。 ## 5. 推荐枚举/规范化规则 - `summary.verdict`: `malicious | suspicious | benign | unknown` - `assessment.severity`: `LOW | MEDIUM | HIGH | CRITICAL | UNKNOWN` ## 6. 扩展规则(可选) 为便于 v0.1 后扩展,建议将工具依赖字段或实验性结果按以下形式添加。
- 添加在 `extensions..<...>` 下 - 保持独立命名空间,不破坏 v0.1 必填字段
# 2周
2week
## 第2周 : PE 静态分析通用理解 + 基于 v0.1 schema 的 1 次实践 ### 1) “PE 静态分析能告诉我们什么” 总结(参考 report/2주차_report.pdf) 以以下 4 个观点为中心,各项目总结 3~6 行左右。 #### ① 节 - 代码/数据如何分布,节名/数量/权限是否正常 - **异常节名、异常多/少的节数量**可能成为信号 #### ② 导入表 - 基于使用的 DLL/API 推测**可能的行为(网络/注册表/进程/加密等)** - 但导入表与其说是“证据”,不如视为**生成假设的线索** #### ③ 签名 - 数字签名是判断信任的线索,但**并非绝对标准** - (有签名 ≠ 一定正常 / 无签名 ≠ 一定恶意) #### ④ 熵 - 指示压缩/加密/加壳可能性的指标 - **高熵 ≠ 确定加壳,仅作为‘怀疑线索’**使用 ### 2) “通过导入表推测功能” 选择整理 10 项(参考 report/2주차_report.pdf) 按以下格式选择整理 10 个导入(或 DLL)
目标 : 让团队快速共享“看到这个导入表该怀疑什么”
- import(or dll) - 推测功能 - 为什么这样看(依据) - 误判可能性/注意事项 ### 3) 加壳怀疑规则 v0.1初学者用) - 基于证据的标志提议 (参考 report/2주차_report.pdf) 不使用“结论”,仅使用基于证据的标志。
从以下示例中至少选择 2 个,说明“为什么要怀疑”。
- 存在高熵节 - 节名异常(看起来像无意义字符串/随机数) - 导入表过于贫乏(几乎没有可分析的 API) - 字符串过少(显著低于平均值) ### 4) 实践(1) - “填充 static 结果” (参考 report/2주차_report_1.pdf) 对 1 个自选样本(必选)执行 Intake + Static,并按团队通用 v0.1 schema 编写 JSON
(实际值不确定的字段应用 null/[] 规则)
- 提交物: `v0.1_<姓名>_analysis_result.json` (1 个) #### 推荐检查点 - `meta.schema_version`, `sample.sha256` 必填是否存在 - `static.imports` / `dynamic.*` / `iocs.*` 等处 **[] vs null 规则是否一致** - 生成报告时是否有会导致解析器崩溃的字段缺失(必填 10 项禁止省略) ### 5) 实践(2) - 填充 static 结果 (参考 report/2주차_report_1.pdf) 对通用样本(`study_sample.exe`)也尽可能执行 Static,并用相同 schema(v0.1)编写 JSON
(目标:对比观察同一样本时,队员们的“基于导入表的假设”和“加壳怀疑标志”有何不同)
- 提交物(可选): `v0.1_<姓名>_common_sample_analysis_result.json`
标签:Conpot, DAST, HTTPX, IOC提取, JSON Schema, PE文件分析, Windows安全, 云安全监控, 分析报告自动化, 可重现分析, 合规性检查, 威胁情报, 安全团队协作, 安全工作流, 安全数据分析, 库, 应急响应, 开发者工具, 恶意软件分析, 标准化流程, 样本分析, 结构化数据, 网络安全, 自动化分析管道, 逆向工具, 隐私保护, 静态分析