alexd-24/revelio

GitHub: alexd-24/revelio

Revelio 是一款 PDF 静态取证扫描器,用于揭示文档中隐藏的文本、结构性风险、保存后的篡改痕迹以及来源凭证的真实性。

Stars: 0 | Forks: 0

# Revelio [![测试](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/9d643865a1143141.svg)](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), 数字取证, 文件安全, 无后门, 自动化脚本, 逆向工具, 隐写分析