alexd-24/revelio
GitHub: alexd-24/revelio
Revelio 是一款 PDF 静态取证扫描器,用于揭示文档中隐藏的文本、结构性风险、保存后的篡改痕迹以及来源凭证的真实性。
Stars: 0 | Forks: 0
# Revelio
[](https://github.com/alexd-24/revelio/actions/workflows/tests.yml)
一款针对 PDF 的静态取证扫描器。它能揭示出文档向读者隐藏的内容、它可能对计算机执行的操作、在最终定稿后被更改的内容,以及它关于自身来源的声明——所有这些都无法仅仅通过打开文件来看到。
免费的“修订检查器”工具只能处理一种简单的情况(黑色框下的文本)。Revelio 则在它们停止的地方继续深入。
## 它检查的内容
**1. 隐藏文本** — 视觉上已消失但仍在字节流中的内容,可通过复制粘贴或解析器恢复:
| 类型 | 捕获内容 | 严重性 |
|-----------|---------------------------------------------------|----------|
| covered | 深色填充/修订框下的真实文本 | HIGH |
| invisible | 使用会融入背景的颜色绘制的文本 | HIGH |
| microfont | 低于可读性下限的文本(默认 < 4pt) | MEDIUM |
| ocr-covered | 隐藏在*扫描*修订(绘制在页面图像中的黑条)下的不可见 OCR 层文本 | HIGH |
`invisible` 检查具有对比度感知能力:它会对每个文本块背后的实际渲染像素进行采样,因此彩色标题或图表图像上的白色文本会被正确忽略,而白底白字则会被标记。
**2. 结构风险** — 可以对您采取操作的对象:`/JavaScript`、`/JS`、`/Launch`、`/OpenAction`、`/AA`、`/EmbeddedFile`、`/GoToR`、`/GoToE`、`/SubmitForm`。通过 PyMuPDF 解析,因此它可以识别压缩对象流中的对象,此外还有一个原始字节扫描过程,可以捕获十六进制转义的名称(`/J#61vaScript`),否则解析器会将这些名称规范化掉。
**3. 版本差异比对** — 通过在连续的 `%%EOF` 标记处截断文件来重建每个增量更新版本,然后比对各版本之间的文本,以揭示在原始保存*之后*添加或删除的内容(例如,签名后被修改的值)。单次保存的 PDF 在此报告中不会显示任何内容。
**4. 来源信号** — 报告文件关于自身来源的*声明*:在 producer/creator 元数据中指定的生成工具、XMP 中的 AI 生成标记(IPTC `trainedAlgorithmicMedia`),以及文档及其嵌入图像上的 Content Credentials (C2PA)。如果安装了可选的 `c2pa` 库,它会更进一步,对每个清单进行*加密验证*——报告 `Valid`(包含签名者和声明生成器),当签名或内容哈希失败时(即文件在签名后被更改——篡改检测)报告 `INVALID`,或者标记存在但无法读取的标记。来自不在信任列表中的签名者的有效签名会如实报告,而不会被报告为“受信任”。这是关于来源的验证,而不是统计性的“是否为 AI”猜测。
## 严重性
严重性反映了某个发现应引起您关注的程度,而不是检测的置信度。每一个发现都是字节中经过验证的事实;严重性关乎它*意味着*什么。
- **HIGH** — 可能是真正的问题:对读者隐藏的可恢复文本(`covered`、`ocr-covered`、`invisible`)、代码或启动能力(`javascript`、`launch`)、十六进制混淆的名称、原始保存后更改的内容(`rev-added`、`rev-removed`),或失败/伪造的签名(`c2pa-invalid`)。
- **MEDIUM** — 值得一看,可能是良性的:微小的 `microfont` 文本、自动运行操作(`auto-action`)、嵌入的文件,或无法验证的 Content Credentials 标记(`c2pa-unreadable`)。
- **LOW** — 声明性上下文,其本身不是问题:文件关于其来源的*说法*(`ai-tool-metadata`、`ai-declared`、有效的 `c2pa-valid` 签名)、保存的次数(`revisions`)以及远程/提交引用。
- **INFO** — 工具说明,例如提示安装 `c2pa-python` 进行验证。
## 用法
```
pip install pymupdf # core
pip install c2pa-python # optional — enables C2PA signature validation
python revelio.py document.pdf # human-readable
python revelio.py document.pdf --json # machine-readable, for pipelines
python make_test.py # regenerate a planted test fixture
```
当有发现时退出代码为 1,干净时为 0——可将其放入 CI 或发送前钩子中。
### Web UI
喜欢拖拽操作?运行本地服务器并打开页面:
```
python serve.py # then visit http://127.0.0.1:8000
```
它完全在您的机器上运行——PDF 绝不会离开您的设备——并且仅使用标准库(无需额外安装)。拖入一个 PDF,四个模块的发现将按模块和严重性分组呈现。
### 部署(免费)
`serve.py` 会读取 `$PORT`,并在主机设置它时绑定 `0.0.0.0`,因此它可以在平台上直接运行。包含的 `render.yaml` 将其部署在 [Render](https://render.com) 的免费层上:**New → Blueprint**,将其指向此仓库,即大功告成。免费构建仅安装 PyMuPDF(关闭 C2PA 验证,以保持在 512 MB 限制内),并且 `MAX_UPLOAD_MB` 限制上传大小,因此大型扫描不会耗尽主机资源。注意:公共实例接受陌生人的上传——PDF 解析是一个攻击面,因此在将其从演示提升之前,必须进行强化(沙箱化、更严格的限制)。
## 测试
```
pip install pytest
pytest
```
14 个行为测试断言了每个模块在植入夹具上的发现——并且对照组(彩色标题上的白字、良性 OCR 层、干净文件)不会产生误报。它们在每次推送时通过 GitHub Actions 运行。如果未安装 `c2pa-python`,C2PA 验证测试将被干净地跳过。
## 诚实的局限性
“干净”意味着*未发现任何东西*,而不是*验证安全*。隐藏文本检查只能看到可提取的文本,因此仅包含图像的扫描页面可能会隐藏 Revelio 尚无法读取的内容。对于来源,存在并不代表证据(元数据是可编辑的),并且永远不会将缺失报告为“人类制造”。
## 路线图
- **包装器/分发。** 托管版本、PyPI 上的打包发行版,以及用于将检查嵌入其他流水线的库 API。
标签:DNS 反向解析, PDF分析, Python, 安全规则引擎, 恶意文档检测, 搜索语句(dork), 数字取证, 文件安全, 无后门, 自动化脚本, 逆向工具, 隐写分析