SecurityRonin/iso9660-forensic

GitHub: SecurityRonin/iso9660-forensic

SecurityRonin/iso9660-forensic:基于Rust的ISO 9660光盘镜像取证分析工具。

Stars: 0 | Forks: 0

[![Crates.io](https://img.shields.io/crates/v/iso9660-forensic.svg)](https://crates.io/crates/iso9660-forensic) [![docs.rs](https://img.shields.io/docsrs/iso9660-forensic)](https://docs.rs/iso9660-forensic) [![许可: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/480014a2a5203708.svg)](https://github.com/SecurityRonin/iso9660-forensic/actions) [![赞助](https://img.shields.io/badge/sponsor-h4x0r-ea4aaa?logo=github-sponsors)](https://github.com/sponsors/h4x0r) **将光盘镜像传递给 `analyse()` 并获取一个按篡改、损坏和隐藏发现排序的列表——以及表明谁、什么和何时构建它的来源面包屑。** 一个纯 Rust ISO 9660 读取器 *和* 法医分析器。读取器处理让基本解析器困惑的扩展(多会话、Rock Ridge、Joliet、El Torito、原始 2352 字节 CD 扇区)。分析器将解析转换为 **23 个异常发现**——ISO 9660 在每个地方都保留冗余副本,并对每个非文件字节进行雕刻。 ## 30 秒到一个发现 ``` [dependencies] iso9660-forensic = "0.4" ``` ``` use iso9660_forensic::analyse; use std::fs::File; let mut img = File::open("evidence.iso")?; let report = analyse(&mut img)?; // Provenance — what a report leads with (observed facts, never conclusions) let v = &report.volume; println!("label={:?} mastered-by={:?} created={:?}", v.volume_label, v.data_preparer_id, v.creation_time); // Anomalies — ranked by severity, each with a stable code and a plain-language note for a in &report.anomalies { println!("[{}] {} — {}", a.severity, a.code, a.note); } ``` ``` label="INSTALL_CD" mastered-by="MKISOFS 2.01" created=Some("2026-01-14 09:02:11") [High] ISO-PATHTABLE-ENDIAN — path-table entry 3: LBA mismatch L=412 M=88231 … [High] ISO-DISGUISED-EXEC — `docs/readme.txt` content begins with a PE executable … [Medium] ISO-TRAILING-DATA — 1.2 MB of non-zero data past the declared volume end … [Medium] ISO-SUPERSEDED-FILE — `setup.ini` exists in session 0 but not the active tree … ``` 每个发现都从单个分类的 `kind` 中获得其 `severity`、`code` 和 `note`,因此它们不会漂移——与兄弟 `gpt-forensic` / `mbr-forensic` 集装箱使用的相同形状,准备好折叠到一个统一的报告中。 ## 它检测什么 引擎是 **冗余 + 松弛**:ISO 9660 大多数东西都存储两次(两端字节序字段、两个路径表、主 + Joliet 树、每个会话描述符)——比较每个副本;然后雕刻每个非文件字节。每个发现区分一个 *观察到的事实* 和一个 *"与...一致"* 推理,并将结论留给检查员。 | 类别 | 发现 | |----------|----------| | **交叉冗余**(篡改) | 两端字节序字段不匹配 · L↔M 路径表 · 路径表↔树(幽灵/鬼目录) · 主↔Joliet 树 | | **松弛和附加数据** | 非零文件松弛 · 体积结束后的尾部有效负载 · 系统区域前的有效负载 · 非零 PVD 保留字段 | | **结构** | 超出范围的扩展 · 扩展重叠 · 目录循环 · 孤儿(未链接)文件 | | **时间** | 文件记录在体积之后 · 混合时区 · 不可能的体积日期(1985 年前/未来) · ISO ↔ Rock Ridge 时间不匹配 | | **历史** | 会话间的替代/可恢复内容 | | **身份和逃逸** | 符号链接路径遍历 & 绝对目标泄露 | | **隐藏和真实性** | Rock Ridge ↔ Joliet 文件名差异 · 通过文档扩展名伪装的执行文件 · 无效/零 EDC · 无效的里德-所罗门 P/Q ECC | …来源摘要还显示了母盘工具指纹、体积时间戳、创作时间窗口、Rock Ridge 所有者 UIDs/GIDs/inodes、El Torito 启动平台 + 启动图像 SHA-256,以及 Rock Ridge / Joliet / ISO 9660:1999 扩展标志。 它还可以 **在损坏的证据上优雅地降级**:超出范围的扩展、目录循环和截断图像被 *报告为发现* 而不是崩溃分析。 ## 提供任何光盘容器 `open()` 将常见的图像容器解析为 ISO 9660 数据轨道上的 `Read + Seek`,因此相同的 `analyse()` 可以在所有这些上工作: ``` use iso9660_forensic::{analyse, open}; let mut src = open("image.cue")?; // .iso .cue .ccd .nrg .mds .toc let report = analyse(&mut src)?; ``` ## 浏览体积 除了分析之外,`IsoReader` 是一个完整的导航器: ``` use iso9660_forensic::IsoReader; use std::fs::File; let mut reader = IsoReader::open(File::open("image.iso")?)?; println!("sessions={} rock_ridge={} joliet={}", reader.session_count(), reader.has_rock_ridge(), reader.has_joliet()); for entry in reader.walk()? { println!(" {} ({} bytes, LBA {})", entry.path, entry.record.size, entry.record.lba); } let entry = reader.find_entry("docs/readme.txt")?; let bytes = reader.read_file_entry(&entry)?; ``` | 扩展 | 基本读取器 | `iso9660-forensic` | |-----------|:-----------:|:------:| | 多会话 / 多轨道 | 仅最后会话 | 所有会话(+ 每个会话遍历) | | Rock Ridge (RRIP) NM / PX / TF / SL | 否 | 是 | | Joliet UCS-2 文件名 | 否 | 是 | | El Torito 启动目录 | 否 | 是(BIOS + UEFI,多部分) | | ISO 9660:1999 增强体积描述符 | 否 | 是 | | 原始 2352 字节 Mode-1 扇区 | 否 | 是(自动检测) | | 路径遍历 / 循环 / OOB 保护 | 很少 | 总是 | `serde` 在 `serde` 功能之后——每个输出类型都继承 `Serialize` 以进行 JSON / DFXML 报告。 ## 验证 - 与来自不同来源的独立真实世界图像进行了验证,因此解析器不会与任何单个固定生成器共享盲点——Microsoft VL 压缩(普通 ISO 9660)、TinyCore Linux(Rock Ridge + Joliet + El Torito)、Debian netinst(BIOS+UEFI 混合启动)和真实的 CloneCD / Alcohol / CDRDAO 容器。 - 在发货之前,每个异常都在干净的语料库上进行了验证,并且 EDC/ECC 算法都经过往返 + 已知答案测试,以 ECMA-130 参考为基准。 - 大图像在缺失时自动跳过;运行 `bash corpus/fetch.sh` 以在本地启用它们。 有关支持的格式矩阵,请参阅 [docs/formats.md](
标签:CD 镜像, El Torito, ISO 9660, Joliet, MIT 许可, Rock Ridge, Rust 编程, Zenmap, 代码审查, 可视化界面, 多会话支持, 开源框架, 异常检测, 持续集成, 数字取证, 数据完整性, 数据恢复, 文件分析, 溯源, 漏洞分析, 磁盘镜像, 篡改检测, 自动化脚本, 证据链, 路径探测, 通知系统