Harry-Zhang121/pdfsani

GitHub: Harry-Zhang121/pdfsani

pdfsani 是一款基于 Rust 的确定性 PDF 清理工具,通过物理移除恶意结构、不可见文本和危险字符,保护 LLM 和 RAG 管道免受间接提示注入攻击。

Stars: 0 | Forks: 0

# pdfsani **用于 LLM 和 RAG 管道的确定性 PDF 提示注入清理工具。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/aaeffde926212848.svg)](https://github.com/Harry-Zhang121/pdfsani/actions/workflows/ci.yml) [![Release](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/d0967d3633212849.svg)](https://github.com/Harry-Zhang121/pdfsani/releases) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Rust](https://img.shields.io/badge/Rust-stable-orange.svg)](https://www.rust-lang.org) [English](README.md) | [中文](README_CN.md) 通过 PDF 进行的间接提示注入是一种日益增长的攻击向量。攻击者在 PDF 中嵌入不可见的指令——白底白字文本、1pt 字体、零宽 Unicode 字符、隐藏层、元数据载荷——当 AI 系统读取该 PDF 时,它会默默地遵循攻击者的指令而非用户的指令。`pdfsani` 在内容到达 AI 系统之前,从字节级别物理剥离 PDF 中所有已知的攻击面,从而使此类攻击成为不可能。
## 亮点
### 确定性 无 ML 模型,无启发式方法,无概率评分。每次运行对相同输入产生完全相同的输出。物理结构移除 + 严格字符黑名单 = **100% 可预测的结果**。 ### 极速 单个 **2.5MB** 的静态优化 Rust 二进制文件。在 **个位数毫秒** 内处理典型 PDF。无运行时依赖,无解释器,无容器。 ### Agent 就绪 内置 **agent skill**,教 AI 编码 agent 自动使用 `pdfsani`。直接放入,你的 AI 读取的每个 PDF 都会先经过清理——**零配置**。
## 安装 ### 下载预构建二进制文件 从 [GitHub Releases](https://github.com/Harry-Zhang121/pdfsani/releases) 获取你平台的最新版本:
Linux (x86_64) ``` curl -LO https://github.com/Harry-Zhang121/pdfsani/releases/latest/download/pdfsani-x86_64-unknown-linux-gnu.tar.gz tar xzf pdfsani-x86_64-unknown-linux-gnu.tar.gz sudo mv pdfsani /usr/local/bin/ ```
macOS (Apple Silicon) ``` curl -LO https://github.com/Harry-Zhang121/pdfsani/releases/latest/download/pdfsani-aarch64-apple-darwin.tar.gz tar xzf pdfsani-aarch64-apple-darwin.tar.gz sudo mv pdfsani /usr/local/bin/ ```
macOS (Intel) ``` curl -LO https://github.com/Harry-Zhang121/pdfsani/releases/latest/download/pdfsani-x86_64-apple-darwin.tar.gz tar xzf pdfsani-x86_64-apple-darwin.tar.gz sudo mv pdfsani /usr/local/bin/ ```
Windows (x86_64) 从 [releases page](https://github.com/Harry-Zhang121/pdfsani/releases) 下载 `pdfsani-x86_64-pc-windows-msvc.zip`,解压,并将其添加到你的 PATH 中。
### cargo install ``` cargo install pdfsani ``` ### 从源码构建 ``` git clone https://github.com/Harry-Zhang121/pdfsani.git cd pdfsani cargo build --release # 二进制文件位于 target/release/pdfsani ``` ## Agent Skill `pdfsani` 附带一个 agent skill 文件,教 AI 编码 agent 在读取 PDF 之前自动对其进行清理。安装方法如下: ``` cp -r .agents/skills/pdfsani ~/.agents/skills/ ``` 安装完成后,当你要求 AI agent 读取、总结或分析 PDF 时,它将知道运行 `pdfsani`——无需任何手动步骤即可保护你免受提示注入攻击。 该 skill 涵盖:何时清理、使用哪个子命令、如何解读移除统计信息、用于纵深防御的数据标记、错误处理以及管道模式。 ## 快速开始 ``` # 从 PDF 中提取清理后的文本 pdfsani extract input.pdf -o clean.txt # 提取为 JSON 并包含完整的移除报告 pdfsani extract input.pdf --format json -o result.json # 输出清理后的 PDF(保留视觉效果,移除威胁) pdfsani clean input.pdf -o sanitized.pdf # 为 LLM 提示词中的纵深防御添加 datamark 边界 pdfsani extract input.pdf --datamark -o safe.txt # 从 stdin 管道输入,输出到 stdout cat input.pdf | pdfsani extract - # 详细模式(处理细节输出到 stderr) pdfsani extract input.pdf -v -o clean.txt ``` ## 移除内容 `pdfsani` 在三个防御层级上运行,确保没有任何攻击向量能够存活:
结构层级——切除危险的 PDF 对象 | 移除项 | 原因 | |---------|-----| | Metadata (/Info, /Metadata, XMP) | 可能携带隐藏指令 | | Forms (/AcroForm) | 可能包含可执行内容 | | Bookmarks and annotations | 可能携带隐藏文本载荷 | | Hidden layers (OCG with visibility OFF) | 对人类不可见,对解析器可见 |
内容流层级——过滤不可见文本 | 攻击 | 检测 | 风险 | |--------|-----------|------| | White text | RGB > 0.90 | 在白色背景上不可见 | | Micro font | Size < 3pt | 人类无法阅读 | | Off-page text | Outside MediaBox | 放置在可见区域之外 | | Hidden layer text | OCG BDC/EMC markers | 位于已关闭的图层中 |
字符层级——剥离危险的 Unicode | 类别 | 范围 | |----------|-------| | Zero-width characters | U+200B-200F, U+2060-2064, U+FEFF, U+00AD, U+180E | | Unicode tag block | U+E0000-E007F | | RTL/bidi control | U+202A-202E, U+2066-2069 | | Private Use Area | U+E000-F8FF | | C0 control (except \n \r \t) | U+0000-001F | | C1 control | U+0080-009F | 所有文本均经过 NFKC 标准化(全角转半角、同形字解析)。
## JSON 输出 使用 `--format json` 获取包含移除统计信息的结构化输出: ``` { "success": true, "text": "Sanitized text content...", "removed": { "metadata": true, "forms": 0, "annotations": 5, "hidden_layers": 1, "characters": { "zero_width": 3, "unicode_tags": 0, "bidi_control": 0, "private_use_area": 0, "control_chars": 1 }, "content_filtered": { "white_text": 2, "micro_text": 0, "offpage_text": 1, "ocg_text": 1 } }, "processing_time_ms": 42 } ``` ## License MIT
标签:Agent, AI安全, Chat Copilot, CISA项目, DLL 劫持, DNS 反向解析, LLM, PDF, PDF解析, RAG, RuleLab, Rust, Unmanaged PE, 可视化界面, 大语言模型, 字节级操作, 安全, 恶意软件防护, 搜索语句(dork), 攻击向量, 数据清洗, 检索增强生成, 网络安全, 网络流量审计, 自动化防御, 超时处理, 通知系统, 隐写术, 隐私保护, 零依赖