SecurityRonin/apm-partition-forensic

GitHub: SecurityRonin/apm-partition-forensic

一个纯 Rust 实现的只读 Apple Partition Map 解析器与取证异常审计库,用于读取磁盘分区布局并按严重程度分级标记结构异常。

Stars: 0 | Forks: 0

# apm-partition-forensic [![Crates.io: core](https://img.shields.io/crates/v/apm-partition-core.svg?label=apm-partition-core)](https://crates.io/crates/apm-partition-core) [![Crates.io: forensic](https://img.shields.io/crates/v/apm-partition-forensic.svg?label=apm-partition-forensic)](https://crates.io/crates/apm-partition-forensic) [![docs.rs](https://img.shields.io/docsrs/apm-partition-forensic)](https://docs.rs/apm-partition-forensic) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/51d7e275e7092514.svg)](https://github.com/SecurityRonin/apm-partition-forensic/actions) [![Sponsor](https://img.shields.io/badge/sponsor-h4x0r-ea4aaa?logo=github-sponsors)](https://github.com/sponsors/h4x0r) **读取 Apple Partition Map —— 然后将其结构异常评定为按严重程度排名的取证发现。** 一个只读的 APM 读取器(Driver Descriptor Map + 分区条目:名称、类型、边界),搭配一个异常审计器,专门标记取证审查员所关注的内容:映射计数不一致、重叠或越界的分区、残留(隐藏)条目,以及可能隐藏数据的未映射内部区域。纯 Rust 实现,无 `unsafe`。 ``` use apm_forensic::analyse; let report = analyse(&std::fs::read("disk.img")?)?; for a in &report.anomalies { println!("[{}] {}: {}", a.severity, a.code, a.note); } # Ok::<(), apm_forensic::Error>(()) ``` ``` APM Forensic Analysis block size : 512 bytes device blocks : 6144 Partition map (2 entries): [0] Apple Apple_partition_map blocks 1..=63 [1] disk image Apple_HFS blocks 64..=6143 Anomalies: none Highest severity: none (clean) ``` `apm-partition-forensic` 是一个**库**。如需一个现成的、能自动检测方案并为*任何*磁盘打印此信息的命令行工具,请安装统一的 [`disk4n6`](https://github.com/SecurityRonin/disk-forensic) 工具 (`cargo install disk-forensic`)。 ## 两个 Crate | Crate | 导入为 | 角色 | |---|---|---| | [`apm-partition-core`](https://crates.io/crates/apm-partition-core) | `apm` | 只读读取器:Driver Descriptor Map + 分区条目 (`parse`, `ApplePartitionMap`, `ApmPartition`) | | [`apm-partition-forensic`](https://crates.io/crates/apm-partition-forensic) | `apm_forensic` | 异常审计器:`analyse` / `analyse_reader` → 生成评定等级的 `Anomaly` 发现,构建于读取器之上 | forensic crate 重新导出了读取器的 `parse`、`ApplePartitionMap`、`ApmPartition` 和 `Error`,因此仅依赖它即可获得这两层功能。 ## 安装 ``` [dependencies] apm-partition-forensic = "0.4" # analyzer + re-exported reader # 或者,仅 reader: apm-partition-core = "0.4" ``` ## 快速开始 ``` // `data` begins at the device's first byte (block 0 = Driver Descriptor Map). let data: Vec = std::fs::read("disk.img")?; if let Some(map) = apm_forensic::parse(&data) { println!("{}-byte blocks, {} partitions", map.block_size, map.partitions.len()); for p in &map.partitions { println!(" {:<24} {} start {} ({} blocks)", p.type_name, p.name, p.start_block, p.block_count); } if let Some(hfs) = map.hfs_partition() { println!("Apple_HFS at block {}", hfs.start_block); } } ``` ## 解析内容 | 功能 | 说明 | |---|---| | Driver Descriptor Map | `ER` 签名,设备块大小 | | 分区条目 | `PM` 条目:名称、类型、起始块、块数量 | | HFS 查找 | `hfs_partition()` 查找首个 `Apple_HFS` 切片 | ## 取证异常检测 `parse()` 为您提供布局;`analyse()`(字节切片)和 `analyse_reader()` (任何 `Read + Seek`,用于与容器 crate 组合)添加了按严重程度排名的 异常检查: ``` let report = apm_forensic::analyse(&std::fs::read("disk.img")?)?; for a in &report.anomalies { println!("[{}] {}: {}", a.severity, a.code, a.note); } # Ok::<(), apm_forensic::Error>(()) ``` | 异常 | 代码 | 严重程度 | |---|---|---| | 重叠分区 | `APM-PART-OVERLAP` | Critical | | 分区越界 | `APM-PART-OOB` | High | | 残留(已删除)条目 | `APM-PART-RESIDUAL` | High | | 缺少 `Apple_partition_map` 自身条目 | `APM-NO-MAP-ENTRY` | High | | `pmMapBlkCnt` 不一致 | `APM-MAP-COUNT` | Medium | | 未映射区域(可能隐藏数据) | `APM-UNMAPPED` | Medium | | 零长度分区 | `APM-PART-ZEROLEN` | Low | | 未知分区类型 | `APM-PART-UNKNOWN` | Info | 分区类型字符串会根据 [`forensicnomicon`](https://github.com/SecurityRonin/forensicnomicon) 知识库 进行评定。每项异常都是一种*观察结果*(“与……一致”),绝不是最终判定 — 结论由审查员做出。 ## 信任,但要验证 这些 crate 会解析不受信任的、可被攻击者控制的磁盘镜像,因此标准是 *永不 panic,永不越界读取,永不信任长度字段*: - **无 panic** — 生产代码不包含 `unwrap`/`expect`/`panic!`,由工作区 lint 作为硬性 `deny` 强制执行;整数通过边界检查辅助函数读取,在切片过短时返回 `0` 而不是 panic;条目计数设有上限 (`MAX_PARTITIONS`) 以防止映射损坏。 - **模糊测试** — `cargo fuzz` 目标驱动 `parse` 读取器和完整的 `analyse` 审计流水线;不变量是对于任何输入都“绝不 panic”。 - **真实工件验证** — 针对由真实的 `hdiutil` 创建的 APM(`Apple_partition_map` + `Apple_HFS` 条目)进行了测试,因此布局是对照真实的 Apple 输出进行检查的,而不仅仅是合成夹具。 - **无 `unsafe`** — 整个工作区内强制 `unsafe_code = "forbid"`。 ## 相关项目 [Security Ronin](https://github.com/SecurityRonin) 取证工具包的一部分。同级的分区读取器:[`gpt-forensic`](https://github.com/SecurityRonin/gpt-forensic)、[`mbr-forensic`](https://github.com/SecurityRonin/mbr-forensic)。[`disk-forensic`](https://github.com/SecurityRonin/disk-forensic) 编排器可自动检测方案,并分发给这三者中合适的一个。文件系统:[`hfsplus-forensic`](https://github.com/SecurityRonin/hfsplus-forensic)、[`udf-forensic`](https://github.com/SecurityRonin/udf-forensic)。被 [`iso9660-forensic`](https://github.com/SecurityRonin/iso9660-forensic) 用于处理 Apple 混合光盘。 [隐私政策](https://securityronin.github.io/apm-partition-forensic/privacy/) · [服务条款](https://securityronin.github.io/apm-partition-forensic/terms/) · © 2026 Security Ronin Ltd
标签:Rust, 可视化界面, 数字取证, 数据隐藏检测, 文件系统解析, 磁盘分析, 网络流量审计, 自动化脚本, 通知系统