1PoPTRoN/fake-pdf-redaction
GitHub: 1PoPTRoN/fake-pdf-redaction
一个只读的 PDF 脱敏审计工具,用于检测文档中被遮盖的内容是否真正被移除,帮助发现因不当脱敏操作导致的敏感信息泄露。
Stars: 0 | Forks: 0
# 虚假 PDF redaction
你在 PDF 里涂黑了一些内容。它真的消失了吗?大概率没有。
这是一个只读审计工具,用于检查 PDF 中被遮盖处背后是否包含可恢复的内容。六个检测器会对文档进行扫描,并通过 `evidence` 字段中的恢复字节,准确地告诉你泄露了什么。它不会修改文件,也不会进行任何网络上报。
## 它能检测什么
- `covered_text` — 黑框下方仍可提取的文本
- `hidden_text` — 白底白字、零号字体、图片背后的文本
- `revision_history` — 增量更新本应删除的早期 PDF 版本中的内容
- `embedded_files` — 脱敏处理未触及的附件
- `metadata` — 不应该存在的作者、标题、XMP 字段
- `redact_annotations` — 实际上并未执行任何脱敏操作的脱敏注解
使用 `--only` 选择一个子集。
## 三个层级
这个仓库是一个 monorepo。每一层都是独立的,你可以单独使用它们中的任何一个。
### 1. Python 库和 CLI (`src/pdfaudit/`)
```
uv sync
uv run pdfaudit scan some.pdf
```
Exit codes 可以直接接入 CI:
- `0` — 干净,或低于你的阈值
- `2` — 发现达到或超过 `--fail-on` 的问题(默认值:`high`)
- `3` — 检测器报错,因此无法证明是“干净”的。如果你信任部分扫描结果,可以使用 `--no-fail-on-error` 抑制该错误
- `1` — 用法或 I/O 错误
只需加一个标志即可输出 JSON:`pdfaudit scan some.pdf --json`。需要更严格的准入门槛?使用 `--fail-on medium`。想要限制内存,以免解压缩炸弹耗尽运行器资源?使用 `--max-memory 1024`。
### 2. FastAPI 后端 (`backend/`)
同样的引擎,通过 HTTP 提供服务。四个 endpoint:
- `GET /api/v1/health` — 存活检测
- `GET /api/v1/vectors` — 包含单行描述的检测器名称
- `POST /api/v1/scan` — multipart 上传,返回 JSON 报告
- `POST /api/v1/scan/pdf` — 同上,但会渲染一份单页 PDF 摘要供下载
```
cd backend
uv sync --extra dev
uv run uvicorn app.main:app --port 8001
```
### 3. React 前端 (`frontend/`)
Vite + TypeScript + Tailwind,采用 neubrutalism 风格。三种状态:引导加载、带拖拽区的主页、报告。只有在扫描完全干净时才会触发彩带特效——毕竟庆祝数据泄露感觉不太对劲。
```
cd frontend
npm install
npm run dev # http://localhost:5174
```
Vite 开发服务器将 `/api/*` 代理到 `:8001` 端口的后端。
## 快速演示
如果你没有真实的 PDF 文件可供测试,这是最快发现问题的方式:
```
# make_boxed.py
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("boxed.pdf", pagesize=letter)
c.setFont("Helvetica", 14)
c.drawString(72, 720, "SSN123-45-6789")
c.setFillColorRGB(0, 0, 0)
c.rect(70, 715, 200, 18, fill=1, stroke=0)
c.showPage()
c.save()
```
然后:
```
uv run pdfaudit scan boxed.pdf
```
你应该会看到一条来自 `covered_text` 的 `critical` 级别的发现,其中 `evidence` 里包含了 SSN。那个黑矩形并没有进行任何脱敏;文本依然存在于内容流中,并且完全可以被选中。
## 隐私
只读。无文件存储。无遥测。无 auth。后端会将上传内容写入临时文件,并在扫描完成后将其删除。浏览器除了通过 Vite 代理与你本地的后端通信外,绝不会与任何其他对象进行交互。
## 布局
```
fake-pdf-redaction/
├── src/pdfaudit/ # Python library and CLI
├── backend/ # FastAPI service
├── frontend/ # React UI
├── tests/ # pytest suite (covers all six detectors)
├── pyproject.toml # workspace
└── uv.lock
```
## 测试
```
uv run pytest -v
```
测试用例语料库涵盖了典型的脱敏错误:文本上方的黑框、白底白字、微小字体、残留的增量更新、隐藏的附件以及元数据泄露。
## 许可证
MIT。
标签:AV绕过, FastAPI, LNA, PDF工具, Python, React, StruQ, Syscalls, 安全规则引擎, 数据泄露, 无后门, 逆向工具