ARES-SYS/malware-pipeline
GitHub: ARES-SYS/malware-pipeline
一套 17 阶段确定性恶意软件分析流水线,通过哈希、熵值、特征码、沙箱和人工分诊的逐层关卡机制,对外部文件进行深度防御式安全审查。
Stars: 0 | Forks: 0
# 恶意软件分析流水线 — 17 阶段自动化隔离
## 问题所在
每个家庭实验室和企业环境都会引入外部文件:软件更新、容器镜像、研究样本、电子邮件附件。大多数设置只采用以下两种方式之一:
- **什么都不做** — 文件直接落入生产存储中。策略完全靠“侥幸”。
- **单一扫描器** — 运行 ClamAV。如果干净,就信任。如果带毒,就删除。没有中间地带。
两者以同样的方式失败:零日漏洞或加壳样本顺利通过你仅有的那一次检查。没有行为分析。没有关联分析。没有审计追踪。你不知道进入了什么、何时进入的,或者它试图做什么。
## 解决方案:深度防御,逐个文件进行
```
FILE INTAKE ──► [HASH] ──► [ENTROPY] ──► [SIGNATURE] ──► [SANDBOX] ──► [TRIAGE] ──► APPROVE/QUARANTINE
│ │ │ │ │
SHA-256 Deviation ClamAV+YARA Behavioral Human
dedup from normal pattern match analysis decision
```
每个阶段都是下一个阶段的关卡。未通过阶段 3 的文件永远不会到达阶段 4。通过了所有检查的文件仍需等待人工批准。永远不会有自动信任。
## 17 个阶段
### 阶段 1 — 接收与隔离
文件通过任何途径(下载、USB、电子邮件附件、研究样本)到达。立即移动到非可执行文件系统挂载(`noexec`、`nosuid`)上的隔离暂存目录中。没有进程可以从暂存区执行它。
### 阶段 2 — 密码学哈希
计算并记录 SHA-256 哈希值。这有三个目的:去重(跳过已分析的文件)、完整性验证(检测阶段之间的修改)和 IOC 生成(与威胁情报源共享哈希)。
### 阶段 3 — 文件类型检测
检查 Magic byte,而不是信任扩展名。无论文件名是什么,包含 ELF 二进制文件的 `.pdf` 都会被标记。声明的类型与实际 Magic byte 不匹配 → 提升风险评分。
### 阶段 4 — 熵值计算
对整个文件计算香农熵。压缩、加密或加壳的可执行文件的熵值高于 7.0。合法的文本和代码位于 4.5-6.5 之间。这可以在特征码扫描器甚至进行查看之前就捕获到加壳的恶意软件。
### 阶段 5 — 熵偏差评分
将熵值与按文件类型划分的基线进行比较。熵值为 7.8 的 PNG 是正常的(已压缩)。而熵值为 7.8 的 `.txt` 文件则不正常。偏离预期范围 → 即使没有匹配到特征码也会标记为有风险。
### 阶段 6 — 结构分析
对于已知格式(PE、ELF、Mach-O、PDF、OLE),解析节头和结构。检测:可疑的节名称、节上的 RWX 权限、重叠的头、异常的入口点、EOF 标记后追加的数据。
### 阶段 7 — 特征码扫描 (ClamAV)
标准的基于特征码的检测。每日更新。捕获已知的恶意软件、商业化 RAT 和常用工具。误报率低 — 可作为第一道筛选过滤器,但绝不能作为唯一的检查手段加以信任。
### 阶段 8 — YARA 规则匹配
应用自定义和社区的 YARA 规则。这可以捕获:特定的威胁参与者的工具、加壳特征、挖矿木马模式,以及特征码 AV 遗漏的行为识别型恶意软件家族。规则从威胁情报源进行更新。
### 阶段 9 — 字符串提取与模式匹配
提取 `strings`,最小长度为 4。应用 Regex 模式查找:IP 地址、URL、base64 块、PowerShell 命令、shell 调用、注册表路径和已知的恶意函数名。任何匹配都会增加该文件的风险评分。
### 阶段 10 — 沙箱引爆
在隔离的容器中执行文件,具有以下条件:
- 无网络访问(隔离的网桥)
- 2 分钟的执行窗口期
- `strace`/`ltrace` 捕获
- 文件系统 overlay(在容器销毁时丢弃写入)
- 资源限制(CPU、内存上限)
分析完成后容器将被销毁。任何数据都不会持久化。
### 阶段 11 — 系统调用捕获
沙箱执行期间记录每一个系统调用。分析会查找:`execve`、`fork`、`ptrace`、`connect`、`sendto`、`unlink`、`mount`。一个调用了 `execve` 的 PDF → 无论其他结果如何,立即隔离。
### 阶段 12 — 网络行为(模拟)
即使没有真实的网络访问权限,连接尝试也会被捕获。DNS 解析尝试、socket 创建以及目标 IP/端口都会被记录。一个尝试连接到 `:4444` 或 `:1337` 的文件,其评分会高于连接到 `:443` 的文件。
### 阶段 13 — 文件系统更改检测
捕获文件系统 overlay 差异:执行期间创建、修改或删除的文件。即使在沙箱中,持久化机制(cron、systemd 单元、`.bashrc` 修改)也会被标记。
### 阶段 14 — 行为风险评分
来自阶段 2-13 的所有发现都会输入到一个加权评分模型中:
| 信号 | 权重 |
|--------|--------|
| 熵值 > 7.0 | +15 |
| 文件类型不匹配 | +20 |
| RWX 节头 | +30 |
| ClamAV 命中 | +40 |
| YARA 匹配 | +35 |
| `execve` syscall | +50 |
| 尝试网络连接 | +25 |
| 持久化机制 | +40 |
| 编码的 payload 字符串 | +20 |
评分 ≥ 50 → 自动隔离。评分 20-49 → 需要人工审查。评分 < 20 → 低风险,但仍需人工批准把关。
### 阶段 15 — 人工分诊队列
每个文件 — 无论评分如何 — 都会进入人工审查队列。操作员将看到:
- 文件哈希、类型、熵值
- 每个阶段的评分明细
- 提取的字符串(已截断)
- Syscall 摘要(调用次数前列)
- 判定建议(自动生成,可覆盖)
批准的文件移至生产环境。拒绝的文件保留在隔离区。
### 阶段 16 — IOC 提取与威胁情报
从隔离的文件中提取 IOC:哈希、C2 IP/域名、互斥锁名称、注册表项、文件路径。这些将输入到:
- 本地威胁情报数据库
- 防火墙黑名单(自动丢弃 C2 IP)
- DNS Sinkhole 规则(自动阻止 C2 域名)
- 未来的 YARA 规则生成
### 阶段 17 — 审计与报告
每个文件 — 无论批准还是隔离 — 都会生成一条审计记录:
- 时间戳、来源、哈希、文件类型
- 风险评分和贡献信号
- 人工决策(批准/拒绝)及操作员备注
- 提取的 IOC(如有)
- 应用的保留策略(隔离清除计划)
完整的流水线:17 个阶段。每个文件的平均耗时:3-5 分钟(自动化)+ 人工审查。没有经过人工查看报告的文件绝对不会接触生产环境。
## 设计决策
### 为什么选择确定性,而不是基于机器学习
基于去年恶意软件训练的 ML 分类器将会漏掉今年的。它需要重新训练,会产生削弱操作员信任的误报,并且它本身就是一个攻击面(模型投毒、对抗样本)。
确定性规则 — 熵值数学、Magic byte、syscall 模式、字符串 regex — 不会过期。今天加壳的可执行文件与 2015 年的加壳文件具有相同的熵值。PDF 中的 `execve` 代表的含义一如既往。
### 为什么顺序很重要
熵值在特征码之前。特征码在沙箱之前。沙箱会消耗 CPU 时间并带来风险 — 你不应该引爆一个已经被 ClamAV 识别为已知恶意的文件。早期阶段是廉价的过滤器。后期阶段代价高昂,但仅在通过了廉价关卡的文件上才会运行。
### 为什么总是需要人工批准
自动化减少了工作量,但永远无法取代判断。一个低风险的文件可能是针对你特定基础设施的有针对性攻击。评分模型不了解你的威胁模型。但人类了解。
## 当前实现
- 编排:具有结构化日志的 Python
- 哈希:Python `hashlib` (SHA-256)
- 熵:基于 256 字节窗口的自定义香农实现
- 特征码:带有每日特征码更新的 ClamAV daemon
- 沙箱:具有 seccomp 配置、`noexec` 挂载和资源限制的 Docker 容器
- 队列:带有操作员 CLI 的 SQLite 支持的分诊数据库
- 日志记录:结构化 JSON,兼容 Grafana 的格式
## 局限性
- 沙箱引爆仅限于 Linux ELF 二进制文件。PE 文件需要 Windows 沙箱(已规划)。
- 网络模拟是被动的 — 没有实际的 C2 交互。主动 C2 分析需要具有完整数据包捕获的隔离 VLAN(已在第二阶段规划)。
- 行为评分权重针对关注基础设施的威胁进行了调整。不同的环境可能需要重新校准。
## 许可证
MIT
标签:DAST, DNS 反向解析, XXE攻击, YARA, 云资产可视化, 恶意软件分析, 文件安全, 无线安全, 沙箱, 知识库安全, 网络信息收集, 自动化分析流水线, 请求拦截, 逆向工具, 防御纵深