SecurityRonin/journald-forensic

GitHub: SecurityRonin/journald-forensic

用纯 Rust 从零解析 systemd .journal 二进制文件的取证读取器,无需 journalctl 即可提取日志条目并检测篡改迹象。

Stars: 0 | Forks: 0

# journald-forensic [![journald-core](https://img.shields.io/crates/v/journald-core.svg?label=journald-core)](https://crates.io/crates/journald-core) [![Docs.rs](https://img.shields.io/docsrs/journald-core)](https://docs.rs/journald-core) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Sponsor](https://img.shields.io/badge/sponsor-h4x0r-ea4aaa?logo=github-sponsors)](https://github.com/sponsors/h4x0r) **直接读取 systemd `.journal` 文件——无需 `journalctl`,无需运行 systemd,无需实时主机——并暴露出表明日志被篡改的序列缺失、时间戳倒退以及截断情况。** DFIR 分析师在拿到磁盘镜像(或单个提取出的 `.journal`)时,需要在不启动嫌疑系统的情况下获取日志的内容及其完整性情况。`journalctl` 会拒绝读取非其自身写入的文件,并且需要匹配的 systemd 环境;而本项目则使用纯 Rust 从头解析磁盘上的二进制格式,直接处理任意字节切片。 ## 30 秒内生成日志时间线 ``` cargo install --git https://github.com/SecurityRonin/journald-forensic jd-cli ``` ``` # 按时间顺序的 JSONL 时间线 — 每行一个条目,保留所有字段 jd timeline system.journal # 文件中包含的每个字段名称(了解您可以依据哪些字段进行 pivot) jd fields system.journal # 提取与字段 filter 匹配的每个条目 jd search system.journal PRIORITY=3 ``` ``` {"seqnum":1042,"realtime_us":1718900000000000,"_PID":"1","MESSAGE":"Started Session 3 of user root.","PRIORITY":"6","_SYSTEMD_UNIT":"session-3.scope"} ``` ## 完整性信号 `journald-integrity` 会遍历解析后的条目,并标记出一个干净、仅追加的日志绝不应出现的情况。每一项都是一个**观察结果(observation)**——具体结论由检查者得出。 | `IntegrityKind` | 观察内容 | |---|---| | `SequenceGap` | 出现序列断档 `[A, B]` 且 `B > A + 1`——即在两条幸存的记录之间删除了 `B − A − 1` 条目 | | `TimestampRegression` | 实时时间戳出现倒退,而在日志保证单调非递减的情况下(时钟回拨或拼接) | | `Truncation` | 文件在 `tail_object_offset` + 最后一个对象的大小之前结束——日志被异常截断 | | `InvalidState` | 文件头的 `state` 为 `ONLINE`——发生了非正常关机,或文件仍在写入中 | ``` use journald_integrity::{detect_sequence_gaps, detect_timestamp_regressions}; for gap in detect_sequence_gaps(&seqnums) { println!("{:?}: {}", gap.kind, gap.detail); } ``` ## 相关 crate 一个读取器栈外加一个分析器,同属一个 workspace: | Crate | 职责 | |---|---| | [`journald-core`](https://crates.io/crates/journald-core) | 领域类型——`JournalEntry`、`JournalField`、`JournalCursor`——附带字段访问器(`message`、`priority`、`pid`、`syslog_identifier`、`realtime_as_datetime`) | | `journald-binary` | 磁盘读取器:`parse_journal_magic`、`parse_header`、`parse_object_header` 以及八种 `JournalObjectType`(Data / Field / Entry / EntryArray / hash tables / Tag) | | `journald-carver` | 数据恢复:`scan_for_journal_magic` 和 `scan_for_entry_objects` 可从未分配空间和损坏的文件中提取(carve)日志结构 | | `journald-integrity` | 审计工具:`detect_sequence_gaps` / `detect_timestamp_regressions` / `detect_truncation` / `detect_online_state` → `IntegrityIndicator` | | `jd` (`jd-cli`) | 面向终端用户的 CLI:`timeline`、`fields`、`search` | ## 信任,但验证 `journald-forensic` 专为读取可能来自受感染主机的不可信日志文件而构建: - **无需 `journalctl`,无需 systemd,无需实时主机**——它直接在任何 `&[u8]` 上自行解析二进制格式,因此适用于 `journalctl` 拒绝处理的提取碎片和磁盘镜像提取物。 - **边界检查解析**——文件中的每个长度和偏移量在使用前都会进行范围检查;格式错误的输入会产生结构化的 `JournalError`,而不会导致 panic。 - **无网络,无遥测**——分析完全在本地进行;请参阅[隐私政策](https://securityronin.github.io/journald-forensic/privacy/)。 ``` cargo test ``` ## 适用场景 `journald-forensic` 是 SecurityRonin 取证家族中用于读取 systemd-journal LOG-FORMAT 的工具:它通过游标(序列号 + boot id)导航日志流 → 结构化条目字段,是 Windows 平台上 [`winevt-forensic`](https://github.com/SecurityRonin/winevt-forensic) 的 Linux 对应版本。分析结果会统一映射到共享的 [`forensicnomicon`](https://crates.io/crates/forensicnomicon) 报告词汇表中,以便与集群中的其他数据汇总。 [隐私政策](https://securityronin.github.io/journald-forensic/privacy/) · [服务条款](https://securityronin.github.io/journald-forensic/terms/) · © 2026 Security Ronin Ltd
标签:Rust, systemd, 可视化界面, 子域名变形, 完整性校验, 数字取证, 数据恢复, 网络流量审计, 自动化脚本, 通知系统