SecurityRonin/luks-forensic

GitHub: SecurityRonin/luks-forensic

纯 Rust 实现的 LUKS1/LUKS2 加密容器取证解析与解密库,无需 cryptsetup 依赖即可解锁并读取明文数据。

Stars: 0 | Forks: 0

# luks-forensic [![Crates.io: luks-core](https://img.shields.io/crates/v/luks-core.svg?label=luks-core)](https://crates.io/crates/luks-core) [![Crates.io: luks-forensic](https://img.shields.io/crates/v/luks-forensic.svg?label=luks-forensic)](https://crates.io/crates/luks-forensic) [![Docs.rs](https://img.shields.io/docsrs/luks-core?label=docs.rs)](https://docs.rs/luks-core) [![Rust 1.81+](https://img.shields.io/badge/rust-1.81%2B-blue.svg)](https://www.rust-lang.org) [![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![Sponsor](https://img.shields.io/badge/sponsor-h4x0r-ea4aaa?logo=githubsponsors)](https://github.com/sponsors/h4x0r) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/SecurityRonin/luks-forensic/actions/workflows/ci.yml) [![Coverage](https://img.shields.io/badge/coverage-100%25%20lines-brightgreen.svg)](docs/validation.md) [![unsafe forbidden](https://img.shields.io/badge/unsafe-forbidden-success.svg)](https://github.com/rust-secure-code/safety-dance) [![Security advisories](https://img.shields.io/badge/advisories-clean-success.svg)](https://rustsec.org) **通过密码解锁 LUKS 容器并读取明文 —— 一个从零开始构建的纯 Rust LUKS1/LUKS2 解密器,已在真实容器上与 `cryptsetup` 进行了逐扇区的验证。** 无需 `cryptsetup` 的 C 依赖,无需 `dm-crypt`,无需挂载,无需 root:这是一个解析磁盘头、通过 PBKDF2 或 Argon2 从密码派生主密钥,并使用 AES-XTS 解密扇区的单一库。 ``` use std::fs::File; use luks::LuksVolume; // Auto-detects LUKS1 vs LUKS2 from the header. let mut vol = LuksVolume::unlock_with_passphrase(File::open("container.luks")?, b"luks-TEST")?; let mut first = [0u8; 512]; vol.read_at(0, &mut first)?; // decrypted payload sector 0 # Ok::<(), Box>(()) ``` ## 适用范围 此版本解析 **LUKS1** 分区头以及 **LUKS2** 的二进制文件头 + JSON 元数据,并支持通过密码使用 `aes-xts-plain64` 密码(AES-128/256-XTS)解锁两者 —— 这也是 `cryptsetup` 的默认设置。LUKS1 密钥槽使用 **PBKDF2** 派生;LUKS2 密钥槽使用 **PBKDF2 或 Argon2i/Argon2id** 派生。两种格式版本均已通过 `cryptsetup` 2.7.0 预言机验证: | 版本 | 密码 (Cipher) | KDF | 预言机 (层级) | |---|---|---|---| | LUKS1 | `aes-xts-plain64` (AES-256-XTS) | PBKDF2-sha256 | 自行生成的 `luks1.img` 对比 `cryptsetup` (层级 2) | | LUKS2 | `aes-xts-plain64`, 4096-B 扇区 | Argon2id | 自行生成的 `luks2.img` 对比 `cryptsetup` (层级 2) | 不支持的密码/模式/哈希将被**识别并附带命名错误拒绝**(直接显示导致问题的原始值)—— 在设计上绝不会对其进行解密。详见 [`docs/RESEARCH.md`](docs/RESEARCH.md)。 ## 双 crate 结构划分 遵循读取器/分析器分离的标准模式: | Crate | 角色 | 输出 | |---|---|---| | **`luks-core`** | 读取器 / 解密器 (`pbkdf2` · `argon2` · `aes` · `xts-mode` · `hmac` · `sha2`) | 明文 `Read + Seek` 视图 + 类型化头部元数据 | | **`luks-forensic`** | 针对头部的异常分析器 | 严重性分级发现 | ### 分析器发现项 | 代码 | 严重性 | 含义 | |---|---|---| | `LUKS-WEAK-CIPHER-MODE` | 低 | 密码模式为 `cbc`/`ecb`(比 `xts-plain64` 弱) | | `LUKS-WEAK-KDF-HASH` | 低 | KDF/AF 哈希为 `sha1` | | `LUKS-LOW-KDF-ITERATIONS` | 中 | 活动密钥槽的 PBKDF2 迭代次数 < 1000(存在暴力破解风险) | | `LUKS-KEYSLOT-INVENTORY` | 信息 | 活动密钥槽数量(共 8 个) | 发现项**仅作为观察结果,而非最终结论** —— 需由检查人员自行得出结论。 ## 信任但验证 - **所有加密原语均为经过审计的 RustCrypto crate**(`pbkdf2`、`argon2`、`aes`、`xts-mode`、`hmac`、`sha1`、`sha2`)—— 绝无手工编写的内容。唯一定制化的例程是 LUKS 的**反取证合并**(TKS1 分离器),且**仅**通过在真实容器上与独立的 `cryptsetup` 预言机进行对比验证,绝不依赖自编写的往返测试。 - **无 panic 且经过边界检查**的不受信任容器解析;在生产代码中禁止使用 `unwrap`/`expect`(`#![forbid(unsafe_code)]`);LUKS1/LUKS2 头解析器、AF 合并以及完整的解锁管道均已经过模糊测试。 - **层级 2 验证**:在 LUKS1 和 LUKS2 中,解密后的扇区与 `cryptsetup` 的输出逐字节匹配 —— 详见 [`docs/validation.md`](docs/validation.md)。 [隐私政策](https://securityronin.github.io/luks-forensic/privacy/) · [服务条款](https://securityronin.github.io/luks-forensic/terms/) · © 2026 Security Ronin Ltd
标签:LUKS, Rust, 可视化界面, 密码学, 开发库, 手动系统调用, 数字取证, 磁盘加密, 网络流量审计, 自动化脚本, 通知系统