Zannu-Opeyemi/Malware-Static-Analysis-Sandbox
GitHub: Zannu-Opeyemi/Malware-Static-Analysis-Sandbox
一个纯静态、零执行的 Python 恶意软件分析学习沙箱,通过哈希、元数据、熵、字符串提取和受限 YARA 风格匹配为文件生成保守的风险分诊报告。
Stars: 0 | Forks: 0
# 恶意软件静态分析沙箱
一个防御性的 Python 沙箱,用于在不执行提交文件的情况下,检查文件元数据、哈希值、可读字符串、上下文指标以及受限的 YARA 风格字面量规则。
## 项目概述
恶意软件静态分析沙箱提供了一个透明的学习工作流程:
1. 接收一个明确的本地文件。
2. 强制执行可配置的大小限制。
3. 仅以字节形式读取文件。
4. 计算 MD5、SHA-1 和 SHA-256。
5. 识别基本的文件签名和元数据。
6. 计算字节熵。
7. 提取有边界的可读 ASCII 和 UTF-16LE 字符串。
8. 检测上下文可疑关键词。
9. 应用受限的 YARA 风格字面量规则。
10. 计算保守的审查分数。
11. 导出 JSON 和 Markdown 报告。
内置的样本是无害的文本文件。
## 静态分析说明
静态分析在不运行文件的情况下对其进行检查。
本项目可以揭示:
- 加密标识符
- 文件大小和文件扩展名
- 基本的 magic-byte 签名
- MIME 猜测
- 熵
- 人类可读的字符串
- 需要分析师关注的关键词
- 字面量规则匹配
静态分析无法可靠地确定文件被执行后的所有行为。编码、压缩、加密、打包、动态加载或依赖环境的内容可能会保持隐藏状态。
## 安全架构
```
flowchart LR
File["Explicit local file"]
Limit["Size and existence validation"]
Bytes["Read bytes only"]
Static["Hashes / metadata / strings / literals"]
Score["Heuristic review score"]
Reports["JSON / Markdown"]
File --> Limit
Limit --> Bytes
Bytes --> Static
Static --> Score
Score --> Reports
Execute["Execution / import / subprocess / detonation"]
Execute -. "Prohibited" .-> Bytes
```
分析路径不会:
- 执行文件
- 将其作为代码导入
- 启动子进程
- 调用 shell
- 发起网络请求
- 解压归档文件
- 模拟指令
- 修改被分析的文件
## 功能
- Python 3.11+
- MD5 计算
- SHA-1 计算
- SHA-256 计算
- 流式哈希读取
- 文件名、扩展名和大小元数据
- 基本的 magic-byte 文件类型
- MIME 类型猜测
- 熵计算
- 扩展名/签名不匹配检测
- 有边界的 ASCII 字符串提取
- 有边界的 UTF-16LE 字符串提取
- 上下文可疑关键词检测
- 受限的 YARA 风格字面量匹配器
- 保守的风险评分
- JSON 报告
- Markdown 报告
- 良性样本
- 文件大小安全限制
- 单元测试
- 架构、安全、法律、威胁模型和作品集文档
## 项目结构
```
malware-static-analysis-sandbox/
├── sandbox/
│ ├── __init__.py
│ ├── hashing.py
│ ├── strings.py
│ ├── file_metadata.py
│ ├── yara_scan.py
│ ├── risk_score.py
│ └── report_generator.py
├── sample_files/
│ └── benign/
│ ├── sample.txt
│ └── indicator_training.txt
├── rules/
│ └── sample_rules.yar
├── reports/
├── tests/
├── docs/
│ ├── architecture.md
│ ├── legal-scope.md
│ ├── safe-handling-guide.md
│ ├── threat-model.md
│ └── portfolio-writeup.md
├── README.md
├── requirements.txt
├── main.py
├── AGENTS.md
└── .gitignore
```
## 安装
### 环境要求
- Python 3.11 或更高版本
- Git
克隆:
```
git clone https://github.com/YOUR-USERNAME/malware-static-analysis-sandbox.git
cd malware-static-analysis-sandbox
```
Windows PowerShell:
```
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
```
Linux 或 macOS:
```
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
```
运行时环境使用 Python 标准库。Pytest 是开发依赖项。
## 用法
### 生成 JSON
```
python main.py analyze --file sample_files/benign/sample.txt --output reports/sample_report.json
```
### 生成 Markdown
```
python main.py analyze --file sample_files/benign/sample.txt --markdown reports/sample_report.md
```
### 生成两种格式
```
python main.py analyze --file sample_files/benign/sample.txt --output reports/sample_report.json --markdown reports/sample_report.md
```
### 演示上下文指标
```
python main.py analyze --file sample_files/benign/indicator_training.txt --output reports/indicator_training_report.json --markdown reports/indicator_training_report.md
```
该样本是无害的文本。它特意提及了一些审查关键词,以演示误报和上下文处理。
### 禁用受限规则匹配
```
python main.py analyze --file sample_files/benign/sample.txt --no-rules --output reports/no_rules.json
```
### 调整安全限制
```
python main.py analyze --file sample_files/benign/sample.txt --max-size-mb 10 --min-string-length 6 --max-strings 100 --output reports/custom.json
```
默认最大文件大小为 25 MiB。
## 报告字段
### 文件元数据
- 文件名
- 扩展名
- 文件大小
- 检测到的文件类型
- MIME 猜测
- 熵
- 创建和修改时间戳
- 扩展名不匹配
### 哈希值
- MD5
- SHA-1
- SHA-256
包含 MD5 和 SHA-1 是为了识别和互操作性。SHA-256 因其更强的完整性识别能力而成为首选。
### 字符串
- 最小长度
- 最大报告数量
- 去重后的可读字符串
字符串会被截断并限定边界。它们不会被执行。
### 可疑指标
检测器会寻找以下审查类别:
- 命令解释器名称
- 签名二进制代理名称
- 选定的进程/内存 API 名称
- 网络 URL 标记
- 编码内容标记
- Office 自动运行标记名称
关键词的存在并不能证明其行为。
### 受限的 YARA 风格匹配
内置的匹配器仅支持:
- 带引号的字面量字符串
- `nocase`
- `ascii`
- `any of them`
- `all of them`
它不支持:
- 正则表达式
- 十六进制模式
- 模块
- 导入
- 回调
- 完整的 YARA 语义
对于生产环境的 YARA 使用,请在适当的实验室内单独安装并验证官方引擎。
### 风险评估
评分会考虑:
- 关键词类别的数量
- 字面量规则匹配的数量
- 扩展名不匹配
- 熵
- 可执行签名
该分数是一种分诊辅助工具,而不是恶意软件的最终判定。
## 样本结果
普通的良性样本预计会:
- 被识别为纯文本
- 匹配训练标记规则
- 产生较低的审查分数
- 不包含可疑关键词类别
指标训练样本预计会:
- 保持为纯文本
- 匹配两条训练规则
- 显示上下文关键词指标
- 产生中等审查分数
- 保持明确的良性
## 测试
```
python -m pytest -q
```
验证结果:
```
9 passed
```
测试验证:
- MD5、SHA-1 和 SHA-256
- ASCII 和 UTF-16LE 字符串
- 关键词计数和注意事项
- 风险评分
- 受限规则匹配
- 拒绝不支持的规则功能
- 必需的报告部分
- 非执行策略字段
- 拒绝过大的文件
## 截图占位符
捕获:
| 截图 | 证据 |
|---|---|
| `01-cli-help.png` | 安全警告和 CLI |
| `02-benign-analysis.png` | 良性样本分析 |
| `03-hashes.png` | MD5、SHA-1 和 SHA-256 |
| `04-metadata.png` | 文件类型、大小、熵和不匹配 |
| `05-strings.png` | 有边界的可读字符串 |
| `06-indicators.png` | 上下文关键词发现 |
| `07-rule-matches.png` | 受限的训练规则 |
| `08-risk-score.png` | 评分原因和注意事项 |
| `09-markdown-report.png` | 完整的静态报告 |
| `10-tests-passing.png` | 单元测试 |
在公开截图中仅使用内置的良性样本。
## 法律和安全范围
仅在以下情况下使用本项目:
- 内置的良性样本
- 您创建的文件
- 您获得明确授权进行分析的文件
- 为合法防御性教育提供的培训工件
不要:
- 执行未知文件
- 分析非法材料
- 处理被盗文件
- 将私有文件上传到公共服务
- 分享未经脱敏的可疑样本
- 创建或修改恶意软件
请阅读 [docs/legal-scope.md](docs/legal-scope.md) 和 [docs/safe-handling-guide.md](docs/safe-handling-guide.md)。
## 局限性
- 无动态分析
- 无执行或引爆
- 无反汇编
- 无 PE 导入表解析器
- 无归档文件提取
- 无文档宏解析器
- 无反混淆
- 无网络行为
- 仅支持受限的规则语法
- 熵和关键词可能会产生误报
- 低分不能证明安全
- 高分不能证明是恶意软件
- 不能替代经过认证的恶意软件分析实验室
## 未来改进
- 添加无需执行的 PE/ELF 头安全解析
- 添加加密报告签名
- 添加确定性样本 ID
- 添加在显式配置背后的可选官方 YARA 集成
- 添加导入和节元数据
- 添加仅限本地的报告查看器
- 添加特定文件类型的静态解析器
- 添加模糊测试
- 添加 CI 依赖项审查
未来的改进必须保留默认的非执行和无网络策略。
## 作品集说明
本项目演示了:
- Python 二进制文件处理
- 加密哈希
- Magic-byte 签名
- 熵
- 字符串提取
- 指标分诊
- YARA 规则概念
- 风险沟通
- JSON 和 Markdown 报告
- Pytest
- 威胁建模
- 安全的恶意软件处理
使用 [docs/portfolio-writeup.md](docs/portfolio-writeup.md) 作为可直接展示的案例研究。
## 免责声明
本项目用于防御性教育。它无法确定文件是安全的还是恶意的,并且绝不能作为执行未知文件的理由。
标签:DAST, DNS 反向解析, Python, YARA, 云安全监控, 云资产可视化, 恶意软件分析, 文件分析, 无后门, 逆向工具, 静态分析