HalaAli198/MEM-SBOM
GitHub: HalaAli198/MEM-SBOM
基于Volatility 3的内存取证插件,可直接从Python进程内存转储中提取运行时软件物料清单并生成CycloneDX标准SBOM。
Stars: 0 | Forks: 0
# MEM-SBOM:基于 Python 进程内存的运行时 SBOM 生成工具
- MEM-SBOM 是一套作为 Volatility 3 插件套件实现的内存取证工具,可直接从 Python 进程内存中重构软件物料清单 (SBOM)。
- 它从 Python 解释器结构、垃圾回收器列表和堆区域中提取运行时模块,解析包版本,分析 Python 字节码以重构依赖关系,并将结果序列化为符合 CycloneDX 标准的 SBOM。
- 这使得 MEM-SBOM 在事件响应、恶意软件分析和软件供应链调查中非常有用,特别是在原始系统不再可访问或其文件系统工件不可信的情况下。
## 为什么选择 MEM-SBOM?
- 大多数现有的 SBOM 工具依赖于包元数据或文件系统工件,这可能无法准确反映 Python 应用程序在运行时实际加载和执行的内容。
- 运行时 SBOM 方法试图在执行期间观察加载的组件,但这要求系统保持活动状态且可被观察。
- 在 Python 中,运行时依赖集可能与安装的包有显著差异,因为模块可能通过动态导入、延迟加载、自定义加载器或多进程执行被引入。
## 研究基础
MEM-SBOM 实现了以下文献中描述的技术:
**What You See Is Not What You Execute: Memory-Based Runtime SBOM Generation for Supply Chain Security** 正在 *Computers & Security* 审稿中
## 核心功能
- **多层模块提取** 结合解释器状态 (sys.modules)、GC 链表遍历和暴力堆扫描,查找每个已加载的 Python 模块,包括隐藏、未链接和 GC 未跟踪的对象。
- **跨进程提取** 自动发现子进程(worker、fork)并合并整个应用树中的模块列表。
- **从活动对象提取版本** 直接从内存中的模块字典读取 __version__、VERSION、version_info 和其他属性,并回退到已安装的包元数据。
- **依赖图生成** 分析函数字节码 (IMPORT_NAME, IMPORT_FROM, CALL 目标)、模块字典、类层次结构和 func_module 指针,以构建完整的依赖图。
- **CycloneDX SBOM 输出** 生成符合标准的 SBOM(组件、依赖关系和内存提取来源),可与现有的漏洞和供应链分析工具集成。
- **支持 Python 3.6–3.15** 具备版本感知的字节码解码器、GC 布局处理(分代式 → 增量式)以及跨所有现代 CPython 版本的解释器状态解析。
- **跨平台分析流水线** 支持 Linux 和 Windows 操作系统。
# 环境要求
- Python 3.8 或更高版本
- Volatility 3 Framework
- `dwarf2json`
- Linux 内核调试符号 (`vmlinux`)
- 与内存镜像中使用的 Python 版本匹配的 Python 调试符号
# 安装说明
## 1. 克隆本仓库
git clone https://github.com/HalaAli198/MEM-SBOM.git
## 2. 安装 Volatility 3
由于 MEM-SBOM 插件构建在 **Volatility 3 Framework** 之上:请克隆 Volatility3 仓库并按照以下地址的安装说明进行操作:
https://github.com/volatilityfoundation/volatility3
## 3. 安装 dwarf2json 工具
- 使用 `dwarf2json` 工具生成适用于 Linux 和 Python 内部的 Python 符号表。
- 克隆 dwarf2json 仓库,将其放置在 Volatility 3 目录中,并按照以下地址的安装说明进行操作:
https://github.com/volatilityfoundation/dwarf2json
### 4. 生成符号表
#### 对于 Linux 内核:
- 命令:```./dwarf2json linux --elf /path/to/vmlinux > vmlinux-VERSION.json```
- 示例:为 Linux (kernel-5.15.0-126) 生成符号表:```./dwarf2json linux --elf vmlinux-5.15.0-126-generic > vmlinux-5.15.0-126-generic.json```
- 将 (.json) 文件放入 ``` /path/to/Volatility3/symbols/ directory```。
#### 对于 Python:
1. 安装带符号的 Python 调试版本:
- 命令:```sudo apt-get install python3.*-dbg ```
- 示例:针对 Python3.8:```sudo apt-get install python3.8-dbg```
- 注意:符号表取决于目标系统上安装的 Python 版本。
2. 定位调试版本库:``` find /usr/lib/debug -name "libpython3*.so*"```
3. 生成符号文件:
- 命令:```/dwarf2json linux --elf /path/to/libpython3*.so* > output_filename.json```
- 示例:为 Python3.8 生成符号表:``` ./dwarf2json linux --elf /usr/lib/debug/usr/lib/libpython3.8d.so.1.0 > python_data_structures.json```
4. 创建所需目录并移动文件:
- 在 /path/to/volatility3/framework/symbols/generic/types/ 中创建文件夹 ('python')
- 将 (.json) 文件放入 'python' 文件夹中
### 5. 放置插件:
#### 对于 Linux 插件:
将插件和 Core 脚本复制到 Volatility Linux 插件目录(例如,```/path/to/volatility3/volatility3/framework/plugins/linux/```)。
#### 对于 Windows 插件:
将插件和 Core 脚本复制到 Volatility Windows 插件目录(例如,```/path/to/volatility3/volatility3/framework/plugins/windows/```)。
# 使用方法
### 从内存转储生成完整的 SBOM:
``` python3 vol.py -f dump.vmem linux.mem_sbom.MEM_SBOM --pid 22162```
### 生成带有依赖图的 SBOM:
```python3 vol.py -f dump.vmem linux.mem_sbom.MEM_SBOM --pid 22162 --dep```
### 根据调查人员的需求跳过来源:
- 跳过堆扫描(最快)
```python3 vol.py -f dump.vmem linux.mem_sbom.MEM_SBOM --pid 22162 --skip-heap```
- 跳过 GC 遍历
```python3 vol.py -f dump.vmem linux.mem_sbom.MEM_SBOM --pid 22162 --skip-gc```
- 仅解释器(最快,可能会遗漏隐藏模块)
```python3 vol.py -f dump.vmem linux.mem_sbom.MEM_SBOM --pid 22162 --skip-gc --skip-heap```
### 运行单个组件进行针对性分析:
- 提取进程树中的所有模块
```python3 vol.py -f dump.vmem linux.module_extractor.Module_Extractor --pid 22162```
- 遍历单个进程的 GC 列表
```python3 vol.py -f dump.vmem linux.py_gc.Py_GC --pid 22162```
- 扫描堆以查找隐藏/未链接的模块
```python3 vol.py -f dump.vmem linux.py_heap.Py_Heap --pid 22162```
- 转储解释器状态 (sys.modules)
```python3 vol.py -f dump.vmem linux.py_interpreter.Py_Interpreter --pid 22162```
# 仓库结构
仓库分为几个目录,包含 MEM-SBOM 插件、支持组件和示例输出。
## Core
- **module_classifier.py**
将模块分类为应用程序、第三方、内部或标准库。
- **dependency_generator.py**
通过分析模块字典和 Python 字节码生成模块间的依赖关系。
- **bytecode_decoder.py**
处理跨多个 Python 版本的 CPython 字节码解码。
## Python Handlers
CPython 3.6–3.15 的逐版本内存结构定义。
每个处理程序定义如何从原始进程内存中读取和解释 CPython 内部结构。
## Symbol Tables
通过 dwarf2json 从 CPython 调试符号生成的 ISF JSON 文件。
定义每个 CPython 版本内部对象(PyObject, PyInterpreterState, PyCodeObject 等)的结构布局(字段偏移量、大小、类型)。
## Linux Plugins
此目录包含 **MEM-SBOM 插件的 Linux 版本**。
- **mem_sbom.py**
主编排插件。运行完整流水线并生成最终 SBOM 输出。
- **module_extractor.py**
使用多种来源(GC、解释器注册表和堆)从进程内存中发现 Python 模块。
- **py_interpreter.py**
提取在解释器 (`sys.modules`) 中注册的模块。
- **py_gc.py**
遍历 Python 垃圾回收器结构以定位被跟踪的 Python 对象。
- **py_heap.py**
扫描进程堆内存以识别未跟踪或隐藏的 Python 模块。
- **elf_symbols.py**
辅助插件,用于在分析期间定位 ELF 二进制文件内的 `_PyRuntime` 符号。
## Windows Plugins
此目录包含 **MEM-SBOM 插件的 Windows 版本**。
- **mem_sbom.py**
主编排插件。运行完整流水线并生成最终 SBOM 输出。
- **module_extractor.py**
使用多种来源(GC、解释器注册表和堆)从进程内存中发现 Python 模块。
- **py_interpreter.py**
提取在解释器 (`sys.modules`) 中注册的模块。
- **py_gc.py**
遍历 Python 垃圾回收器结构以定位被跟踪的 Python 对象。
- **py_heap.py**
扫描进程堆内存以识别未跟踪或隐藏的 Python 模块。
- **pe_parsing.py**
辅助插件,用于在分析期间定位 PE 二进制文件内的 `_PyRuntime` 符号。
## 示例
`Examples/` 目录包含来自两个具有多进程架构的真实 Python 应用程序(Celery 和 Apache Airflow)的 MEM-SBOM 输出,包括完整流水线输出和生成的 CycloneDX SBOM。详情请参阅 [示例 README](Examples/README.md)。
标签:CycloneDX, DAST, IP 地址批量处理, Python, SBOM, SecList, Volatility 3, 云资产清单, 内存取证, 动态导入, 垃圾回收, 堆扫描, 恶意软件分析, 数字取证, 无后门, 版本提取, 硬件无关, 自动化脚本, 跌倒检测, 跨进程分析, 软件物料清单, 运行时分析, 进程内存, 逆向工程