t-bench/Malware-analysis-sandbox

GitHub: t-bench/Malware-analysis-sandbox

一个轻量级的 Windows 恶意软件静态分析沙箱,提供可解释的风险评分、监管链管理和 STIX/MISP 导出,在不执行样本的前提下完成可疑文件的快速分诊。

Stars: 0 | Forks: 0

# 恶意软件分析沙箱 本仓库是一个用于 Windows 上可疑文件的实用静态分析沙箱。目前的基线重点关注以下四个方面: 1. 可疑文件的安全本地静态分类(分诊)——绝不执行任何样本。 2. 可解释、可辩护的风险评分,分析人员可以据此向评估人员进行讲解。 3. 证据处理功能:监管链元数据和防篡改报告。 4. 以 STIX 2.1 格式导出调查结果,供威胁情报平台使用。 它有意设计为轻依赖,因此您可以在干净的分析工作站上运行它,而无需立即引入庞大的工具链。 ## 当前功能 - 计算 `MD5`、`SHA1` 和 `SHA256` - 提取 ASCII 和 UTF-16LE 字符串 - 测量文件的整体熵和分块熵 - 通过 magic bytes 识别常见文件类型 - 解析核心 PE 头字段和节元数据 - 提取更丰富的分析数据,例如 URL、域名、IP、电子邮件、注册表路径、文件路径、命令行、互斥锁名称、可疑导入、附加数据和 PE 节异常 - 根据 IANA TLD 列表验证提取的域名和电子邮件地址,确保导入名(如 `ADVAPI32.dll`)不会被误认为是域名 - 行业标准的 `imphash`(与 `pefile`/VirusTotal 匹配,包括 ws2_32/oleaut32 的序号解析) - 检测加壳工具(UPX、MPRESS、ASPack、Petite、VMProtect、Themida)和自解压安装程序(NSIS、Inno Setup、7-Zip/WinRAR/cabinet SFX),并据此调整熵值的权重 - 生成可解释的风险评分:列出每条触发的规则及其权重,这些条目的总和即为报告的评分 - 在每份报告中记录监管链元数据(分析人员、来源、获取时间、分析主机、工具版本) - 使用防篡改的 SHA-256 摘要密封每份报告,可通过 `verify-report` 进行校验 - 使用 minisign (Ed25519) 对报告进行签名,将完整性扩展到作者身份;`verify-report --pubkey` 可同时校验两者 - 将调查结果导出为 STIX 2.1 bundle(在分析时使用 `--stix` 或之后使用 `export-stix`) - 将调查结果导出为 MISP event(在分析时使用 `--misp` 或之后使用 `export-misp`) - 直接从 PE 安全目录中标记 Authenticode 签名的存在 - 安装 `yara-python` 后可选进行 YARA 扫描(通过配置中的 `--yara-rules` 或 `yara_rules_path` 指定规则集路径) - 启动无需依赖的 `tkinter` GUI 进行交互式分析 - 通过 `--verbose`/`--quiet` 进行结构化的 `stderr` 日志记录 - 通过配置中的 `--max-size-mb` 或 `max_sample_size_mb` 进行样本大小限制 ## 项目布局 ``` . |-- CHANGELOG.md |-- README.md |-- configs/ | `-- sandbox.example.json |-- docs/ | `-- architecture.md |-- pyproject.toml |-- scripts/ |-- src/malware_analysis_sandbox/ | |-- analysis/ | |-- cli.py | |-- config.py | |-- gui.py | |-- models.py | |-- pipeline.py | |-- reporting.py | `-- stix_export.py `-- tests/ ``` ## 快速开始 ### 1. 创建虚拟环境 ``` python -m venv .venv .venv\Scripts\Activate.ps1 python -m pip install -e . ``` ### 2. 创建本地配置 ``` malware-sandbox init-config ``` 这会写入 `configs/sandbox.local.json`。请保留该文件,用于存储特定于工作站的值,例如报告目录、分析人员姓名和 YARA 规则集路径。 ### 3. 启动 GUI ``` malware-sandbox gui ``` ### 4. 从 CLI 分析样本 ``` malware-sandbox analyze .\samples\suspicious.bin --config .\configs\sandbox.local.json --analyst "T. Bench" --source "case-1234" ``` ### 5. 验证报告是否被篡改 ``` malware-sandbox verify-report .\reports\_suspicious.bin.json ``` ### 6. 将调查结果导出为 STIX 2.1 或 MISP event ``` malware-sandbox analyze .\samples\suspicious.bin --stix .\reports\suspicious.stix.json --misp .\reports\suspicious.misp.json # 或者,从现有报告中: malware-sandbox export-stix .\reports\_suspicious.bin.json malware-sandbox export-misp .\reports\_suspicious.bin.json ``` MISP event 会将样本哈希标记为 `to_ids`,但对于静态提取的网络 IOC 则保留为非 `to_ids` 状态,并附带说明性注释——在启用检测之前请对其进行审查。 ### 7. 对报告进行签名,将完整性扩展到作者身份 安装一次 minisign(`winget install jedisct1.minisign`),生成密钥对(`minisign -G`),然后执行: ``` # 在分析时签名,或之后: malware-sandbox analyze .\samples\suspicious.bin --sign malware-sandbox sign-report .\reports\_suspicious.bin.json # 当提供 public key 时,verification 会检查 digest 和 signature: malware-sandbox verify-report .\reports\_suspicious.bin.json --pubkey $env:USERPROFILE\.minisign\minisign.pub ``` 签名后会在报告旁边生成一个独立的 `.minisig` 文件。之所以选择 minisign 而不是 Sigstore,是因为分析工作站通常受到网络限制;而 minisign 支持完全离线验证。如果报告是在无人值守的情况下签名的,请使用 `minisign -G -W` 生成未加密的密钥,并妥善保护该密钥文件。 ## GUI 工作流 GUI 是一个轻量级的桌面层,使用了与 CLI 相同的分析流水线。 - 选择一个样本文件。 - 可选择一个配置 JSON 文件。 - 可选择一个报告目录覆盖项。 - 点击 `Analyze Sample` 生成 JSON 报告并预览。 - `Summary` 显示分类汇总(监管链块、评分明细),并带有样式化的标题。 - `Evidence` 是一个按类别(IOC、能力、PE 事实、节、导入)分组的可折叠树,确保长列表易于浏览。 - `JSON Preview` 显示原始报告。 - `Assessment` 面板包含一个颜色编码的风险横幅(根据级别显示为红/黄/绿)、一个“为什么是这个评分”的表格(列出每条触发的规则及其权重),以及行为叙述。 - 在应用程序内部使用 `Create Local Config` 写入特定于工作站的配置文件。 - 如果您需要当前显示 JSON 的副本,请使用 `Save JSON Preview As...`。 侧边栏被特意标记为静态推断。它并不宣称提供运行时遥测数据。 ## 可解释的评分 报告的 `indicators.score_breakdown` 列出了对评分有贡献的每一条规则: ``` Score Breakdown - + 18 Network Communication: 36 matching string(s) (base 14 + evidence bonus 4) - + 8 2 suspicious API import(s) in the PE import table - + 8 5 PE structural heuristic(s) flagged = 88 ``` 评分具备加壳感知能力:当检测到自解压安装程序(NSIS、Inno Setup、SFX 归档文件)时,会将高熵值视为预期的压缩 payload 数据,其权重从 10 降至 2。而真正的加壳工具签名(UPX、VMProtect 等)则会增加权重。报告的 `risk_score` 始终是这些明细条目的封顶总和。 ## 报告契约 报告包含 `schema_version`(目前为 `1.0`),并由 [schemas/report-v1.schema.json](schemas/report-v1.schema.json) 描述;测试流程会根据该架构验证每份流水线报告。分类结果位于一个稳定的顶层 `verdict` 块中: ``` "verdict": { "risk_score": 88, "raw_score": 88, "risk_level": "Critical", "summary": "Static evidence suggests critical analyst interest. ...", "score_breakdown": [ {"rule": "network_communication", "points": 18, "detail": "..."} ] } ``` `risk_score` 始终是 `score_breakdown` 的封顶总和。使用者应依赖于 `schema_version` 并容忍额外字段;破坏性的结构变更会提升主版本号。 ## 监管链与报告完整性 每份报告都包含一个 `custody` 块:分析人员(来自 `--analyst`、配置或 OS 用户)、来源(`--source`)、获取时间戳(`--acquired` 或文件的创建时间——会记录其依据)、分析主机、工具版本以及样本 SHA-256。 每份写入的报告都会使用一个 `integrity` 块进行密封:这是一个基于所有其他字段的规范 JSON 计算出的 SHA-256 摘要。`malware-sandbox verify-report` 会重新计算该摘要,如果不匹配则以非零状态退出。这证明了报告在写入后未被篡改;但这并不能证明作者身份——如果需要证明作者身份,请将其与签名或 WORM 存储结合使用。 ## 配置 从 `configs/sandbox.example.json` 开始。重要的键包括: - `reports_dir`:写入静态分析 JSON 的目录。 - `strings_min_length`:提取字符串的最小长度。 - `entropy_chunk_size`:计算分块熵的字节窗口。 - `max_sample_size_mb`:工具将读取的样本上限(MB)。 - `yara_rules_path`:YARA 规则文件或目录的可选路径。 - `analyst`:监管链块的默认分析人员姓名。 - `default_source`:监管链块的默认样本来源。 - `defang_iocs` / `suppress_benign_strings`:输出格式的默认设置。 现有配置中遗留的 `vm` 段落将被忽略并发出警告。 ## 构建 EXE 安装可选的构建依赖并运行 PowerShell 构建脚本: ``` python -m pip install -e .[build] powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\Build-Exe.ps1 ``` 可执行文件将写入 `dist\MalwareAnalysisSandbox.exe`。 ## 安全模型 此工具仅执行静态分析。它绝不执行样本,并且早期版本中存在的 VM 引爆规划器已被移除。请使用常规的恶意软件处理规范来处理样本:将它们存储在专用目录中,谨慎设置实时的 AV 排除项,并且不要双击样本。 已知的 IOC 注意事项:一些已注册的 TLD 与文件扩展名(`.zip`、`.md`、`.sh`)冲突,因此带有这些扩展名的文件名可能仍然会显示为域名。STIX 指示器列表反映了报告中按类型划分的预览上限。 ## AI 工作流 本仓库的结构设计使得 AI agent 能够快速重新介入: - 阅读 `README.md` 了解当前的行为和工作流程。 - 阅读 `CHANGELOG.md` 获取面向机器的变更和升级历史。 - 阅读 `docs/architecture.md` 了解组件边界和预期的扩展点。
标签:DAST, DNS 反向解析, PE文件分析, 云安全监控, 威胁情报, 开发者工具, 恶意软件分析, 网络信息收集, 逆向工具, 静态分析