SecurityRonin/ext4fs-forensic
GitHub: SecurityRonin/ext4fs-forensic
这是一个基于纯安全 Rust 编写的取证级 ext4 文件系统解析库,支持已删除文件恢复、日志分析、时间线生成及剩余空间检查。
Stars: 0 | Forks: 0
# ext4fs-forensic
**取证级 ext4 文件系统解析器。纯安全 Rust。MIT 许可证。**
解析 ext4 镜像并获取完整的取证元数据 —— 五种时间戳(纳秒级精度)、已删除文件恢复、日志历史重构、剩余空间分析以及字节级块搜索。
## 为什么存在这个项目
本项目站在巨人的肩膀上。The Sleuth Kit、libext2fs 和 Linux 内核的 ext4 实现开创了 ext4 文件系统的取证分析,并教会了社区我们所知道的关于磁盘结构的所有知识。如果没有他们几十年的工作、文档和开源贡献,这个 crate 就不可能存在。
ext4fs-forensic 将这些相同的取证能力带入了 Rust 生态系统,作为一个 **纯安全 Rust 库** (`#![forbid(unsafe_code)]`)。它从第一性原理解析 ext4 磁盘结构 —— 没有 C 绑定,没有不安全代码,MIT 许可证 —— 使其易于嵌入到现代取证工具链、商业产品和法庭认可的工作流程中。
## 你将获得
```
let mut fs = Ext4Fs::open(file)?;
// Standard filesystem access
let data = fs.read_file("/etc/passwd")?;
let entries = fs.read_dir("/")?;
let meta = fs.metadata("/var/log/auth.log")?;
// Forensic operations
let deleted = fs.deleted_inodes()?; // Find all deleted files
let recovered = fs.recover_file(deleted[0].ino)?; // Recover file data
let timeline = fs.timeline()?; // Full forensic timeline
let journal = fs.journal()?; // jbd2 journal parsing
let history = fs.inode_history(ino)?; // Metadata over time
let slack = fs.slack_space(ino)?; // File slack analysis
let hits = fs.search_blocks(b"password", All)?; // Keyword search
let hashes = fs.hash_file(ino)?; // BLAKE3+SHA-256+MD5+SHA-1
let xattrs = fs.xattrs(ino)?; // Extended attributes
let dirs = fs.recover_dir_entries(2)?; // Deleted filename recovery
let backups = fs.verify_superblock_backups()?; // Tampering detection
```
## 取证能力
| 能力 | 功能描述 |
|-----------|-------------|
| **已删除文件检测** | 扫描 inode 表以查找删除标记 (`dtime`) 和孤立节点(崩溃残留物) |
| **文件恢复** | 遍历 extent 树以重建已删除文件的数据,报告可恢复百分比 |
| **取证时间线** | 全部五种时间戳(atime/mtime/ctime/crtime/dtime),纳秒级精度,按时间顺序排序 |
| **日志解析** | 完整的 jbd2 事务历史 —— 描述符块、提交时间戳、已撤销块 |
| **Inode 历史** | 从日志记录的元数据块重建先前的 inode 状态 |
| **剩余空间** | 读取文件 EOF 之后、最后分配块中的数据 —— 这里隐藏着先前文件的片段 |
| **关键字搜索** | 在已分配、未分配或所有块中进行字节模式搜索,具有可配置的上下文 |
| **文件哈希** | 通过 [blazehash](https://crates.io/crates/blazehash) 实现 BLAKE3 + SHA-256 + MD5 + SHA-1 —— 兼容 NSRL/HashKeeper |
| **已删除目录恢复** | 从目录块中的 `rec_len` 间隙恢复文件名 |
| **Xattr 解析** | 内联 和块存储的扩展属性 —— SELinux 标签、ACL、用户元数据 |
| **超级块备份** | 将备份超级块与主超级块进行比较,以检测篡改/损坏 |
| **CRC32C 验证** | 对超级块、组描述符和 inode 校验和进行验证 |
| **Extent 雕刻** | 扫描未分配块以查找 extent 树签名 (0xF30A) |
## 架构
六层自底向上设计 —— 每一层都构建在下一层之上:
| 层级 | 模块 | 用途 |
|-------|--------|---------|
| 0 | `ondisk/` | 从原始 `&[u8]` 切片进行字节级结构体解析 |
| 1 | `block.rs` | 基于 `Read+Seek` 的块设备抽象 |
| 2 | `inode.rs` | Inode 读取、extent 树遍历、间接块 |
| 3 | `dir.rs` | 目录解析、路径解析、符号链接跟踪 |
| 4 | `forensic/` | 10 个取证分析模块 |
| 5 | `lib.rs` | `Ext4Fs` 公共 API —— 第 1 层(标准)+ 第 2 层(取证) |
接受 **任何 `Read + Seek` 源** —— 原始镜像文件、EWF/E01 镜像(通过 [ewf](https://crates.io/crates/ewf) crate)或自定义读取器。
## 安装
```
[dependencies]
ext4fs = "0.1"
```
## 测试覆盖率
- **220 个测试**,涵盖单元测试和集成测试套件
- **98.85% 函数覆盖率**,87.86% 行覆盖率
- 已针对真实的取证镜像进行验证,包含已知的已删除文件、xattrs、符号链接和日志事务
## 对取证至关重要的设计决策
- **`#![forbid(unsafe_code)]`** —— 纯安全 Rust,无未定义行为,无缓冲区溢出
- **校验和不匹配是警告,而非错误** —— 取证工具必须处理损坏的文件系统
- **ext4 是小端序,jbd2 日志是大端序** —— 两者均正确处理
- **无 chrono 依赖** —— 时间戳作为原始 `(i64 seconds, u32 nanoseconds)` 元组,无时区假设
- **MIT 许可证** —— 将其用于商业工具、政府系统或法庭提交的报告,无需担心 GPL 问题
## 配合使用
- [**ewf**](https://crates.io/crates/ewf) — 读取 E01/EWF 取证磁盘镜像作为 `Read+Seek` 源
- [**blazehash**](https://crates.io/crates/blazehash) — 取证文件哈希(BLAKE3, SHA-256, MD5, SHA-1)
- [**4n6mount**](https://github.com/SecurityRonin/4n6mount) — FUSE 挂载,支持 ro/rw 视图、已删除文件浏览和证据过滤
## 致谢
如果没有构建取证分析学科及其工具的人们的奠基工作,本项目就不可能存在:
- **Brian Carrier** — 感谢 [The Sleuth Kit](https://www.sleuthkit.org/)、[Autopsy Forensic Browser](https://www.autopsy.com/) 以及 *File System Forensic Analysis*(《文件系统取证分析》)一书,该书教会了一代从业者(包括作者)现代文件系统如何在字节级别工作
- **Rob T. Lee** — 感谢 [SANS FOR508](https://www.sans.org/cyber-security-courses/advanced-incident-response-threat-hunting-training/)(高级事件响应、威胁搜寻和数字取证),它塑造了我对取证时间线、证据处理和事件响应的思考方式
- **Linux 内核 ext4 开发者** — 感谢他们在 [kernel.org](https://www.kernel.org/doc/html/latest/filesystems/ext4/) 上对磁盘结构的详尽文档
- **Theodore Ts'o 和 e2fsprogs 团队** — 感谢 debugfs、dumpe2fs 以及几十年的 ext4 工具,它们作为我们的验证参考
## 许可证
MIT
标签:BLAKE3, ext4, forensic, JBD2, Journal解析, Linux文件系统, MD5, MIT协议, Rust, SHA-1, SHA-256, Slack空间分析, 元数据, 内存安全, 删除文件恢复, 取证, 可视化界面, 哈希计算, 块搜索, 域渗透, 安全Rust, 开源, 扩展属性, 数字取证, 数据恢复, 文件系统, 法务分析, 电子数据取证, 磁盘分析, 网络流量审计, 自动化脚本, 通知系统