ak4hit/OCR-Zen

GitHub: ak4hit/OCR-Zen

一款红队安全研究工具,用于生成可绕过 AI 视觉模型但被传统 OCR 读取的对抗性文档图像,以测试内容过滤和文档处理 pipeline 的安全盲区。

Stars: 1 | Forks: 0

# OCR-Zen 🔮 ![OCR-Zen 横幅](https://raw.githubusercontent.com/ak4hit/OCR-Zen/master/assets/ocr_zen_banner.png) [![License: MIT](https://img.shields.io/badge/License-MIT-cyan.svg)](LICENSE) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/) [![Security Research](https://img.shields.io/badge/purpose-security%20research-red.svg)]() **作者**: [ak4hit](https://github.com/ak4hit) **类型**: 进攻性安全 / 红队研究 **核心引擎**: Tesseract OCR + 多 LLM 视觉 API 测试 ## 什么是 OCR-Zen? CAPTCHA 生成的是人类可读而机器无法读取的图像。 主要用例: - 绕过扫描提取文本的**内容过滤器**、**WAF** 和 **DLP 工具** - 测试 **AI 文档 pipeline**(发票处理器、合同解析器)是否存在通过图像进行 prompt 注入的风险 - 在处理文档前进行 OCR 的**红队评估** ## 安装 ``` # 1. Clone the repo git clone https://github.com/ak4hit/OCR-Zen cd OCR-Zen # 2. 安装 Python dependencies pip install -r requirements.txt # 3. 安装 Tesseract(local OCR 必需) # Ubuntu/Debian: sudo apt install tesseract-ocr tesseract-ocr-eng # macOS: brew install tesseract # Windows: https://github.com/UB-Mannheim/tesseract/wiki # 4. 复制 .env 并添加你的 API keys(全部可选 —— 可以使用 Tesseract 离线工作) cp .env.example .env ``` ## 快速开始 ``` # 离线模式(仅限 Tesseract,不需要 API keys) python main.py --offline # 使用自定义 payload(在运行时提供你自己的) python main.py --payload "id && whoami" --innocent "Invoice #1234" --offline # 测试所有技术并评分 divergence(需要在 .env 中配置 API keys) python main.py --payload "id && whoami" --techniques all # 从 wordlist 进行 batch mode python main.py --payload-file wordlists/shell_commands.txt --offline # HTML + JSON 报告 python main.py --offline --format both ``` ## CLI 参数 | 参数 | 默认值 | 描述 | |------|---------|-------------| | `--payload TEXT` | `id && whoami` | 隐藏在图像中的 payload | | `--innocent TEXT` | `Invoice #1234 - Total: $500` | 可见的掩护文本 | | `--techniques TEXT` | `all` | 逗号分隔的列表或 `all` | | `--engine TEXT` | `tesseract` | 用于校准的引擎 | | `--offline` | off | 仅限 Tesseract,无 API 调用 | | `--calibrate-remote URL` | -- | 针对活动的目标 endpoint 进行校准 | | `--skip-calibration` | off | 使用默认值,跳过参数扫描 | | `--skip-divergence` | off | 跳过多引擎评分 | | `--rate-limit INT` | `4` | API 调用之间的间隔秒数 | | `--payload-file PATH` | -- | 字典文件,每行一个 payload | | `--output-dir PATH` | `output/` | 保存图像和报告的位置 | | `--format TEXT` | `both` | `json` \| `html` \| `both` | ## 技术 | 技术 | 描述 | 备注 | |-----------|-------------|-------| | `color_manipulation` | 无辜文本下方接近白色(灰色=230)的 payload | 最强 —— 在测试中达到 92% 的差异率 | | `texture_overlay` | 作为无辜文本上微妙抖动叠加层的 payload | 固定值:抖动 +/-3px,2 个偏移量 | | `ambiguous_text` | 欺骗文本过滤器的西里尔/Unicode 同形字 | 适用于简单的 payload | | `context_hijacking` | 文档中作为低对比度“内部备注”的 payload | 固定值:灰色 220->150,保留下划线 | | `font_trickery` | 300 DPI 下的微小 payload 字体 —— 在屏幕分辨率下不可见 | 固定值:8px->14px @300DPI | | `channel_isolation` | 仅在红色通道中的 payload;人类看到淡粉色色调 | 新增 —— 需要红色通道预处理 | | `resolution_split` | 仅在全 OCR 分辨率下可见的 payload,缩略图不可见 | 新增 —— Nyquist 阈值渲染 | ## 校准如何工作 在生成真实的 payload 图像之前,OCR-Zen 会针对目标引擎扫描 `grey_level x font_size` 组合,并锁定在 payload 可读性方面得分最高的参数。 - 每次校准运行生成 **45 张测试图像**(9 个灰度级别 x 5 种字体大小) - 为 Tesseract **预设结果**(瞬间返回,无需扫描) - **缓存**:结果保存至 `output/calibration/{engine}_{hash}.json`,有效期为 7 天 - **远程模式**:`--calibrate-remote URL` 针对实际目标 endpoint 进行测试 ## 差异评分如何工作 每个生成的图像都会同时通过所有可用引擎运行。 ``` OCR-Zen computes: payload_sim = how closely the engine's reading matches the payload innocent_sim = how closely the engine's reading matches the innocent text Target state: Tesseract -> payload_sim HIGH, innocent_sim LOW (OCR reads the payload) LLMs -> innocent_sim HIGH, payload_sim LOW (LLMs see only innocent text) overall_divergence = (mean OCR payload_sim + mean LLM innocent_sim) / 2 ``` 差异越大 = 对抗性图像效果越好。 ## 测试已知结果 | 技术 | 灰度级别 | 字体大小 | Tesseract 得分 | 备注 | |-----------|-----------|-----------|-----------------|-------| | color_manipulation | 230 | 30 | 1.00 payload_sim | 最佳技术 | | context_hijacking | 150 | 30 | 有效 | 原为 220 —— 会导致 token 分割 | | font_trickery | -- | 14px @300DPI | 已修复 | 原为 8px —— 对于 Tesseract 来说太小了 | | any technique | -- | 48px | 0.81-0.84 | 自动换行伪影 —— 需避免 | ## 配置 将 `.env.example` 复制到 `.env` 并填入你的密钥: ``` ANTHROPIC_API_KEY=your-key-here # claude-3-5-haiku-20241022 GOOGLE_API_KEY=your-key-here # gemini-2.0-flash OPENAI_API_KEY=your-key-here # gpt-4o (paid tier) # Rate limits GEMINI_RPM=12 CLAUDE_RPM=50 OPENAI_RPM=20 # Daily quotas GEMINI_RPD=1500 ``` 所有 API 密钥都是可选的。该工具会优雅降级 —— 如果未配置 LLM 密钥,请使用 `--offline` 进入纯 Tesseract 模式。 ### 多密钥轮换 为了在不触及单密钥配额的情况下进行持续测试,请为每个引擎添加多个密钥: ``` GOOGLE_API_KEY_1=key1 GOOGLE_API_KEY_2=key2 GOOGLE_API_KEY_3=key3 ``` 当收到 429 错误时,OCR-Zen 会自动轮换到下一个密钥。 ## 添加自定义技术 1. 将 `_technique_yourname(self, payload, innocent, cal)` 添加到 `core/generator.py` 2. 将 `"yourname"` 添加到同一类中的 `TECHNIQUES` 列表中 3. 该方法必须返回一个 `PIL.Image.Image` 对象 4. OCR-Zen 会自动将其包含在校准和差异评分中 ## 构建状态 | 阶段 | 状态 | 描述 | |-------|--------|-------------| | 1 | 完成 | 脚手架、依赖项、配置 | | 2 | 完成 | 7 种图像生成技术 | | 3 | 完成 | LLM 引擎封装(Tesseract, Claude, Gemini, OpenAI, Textract) | | 4 | 完成 | 带有缓存和远程模式的校准引擎 | | 5 | 完成 | 多引擎差异评分器 | | 6 | 完成 | CLI、速率限制、配额跟踪器、批处理模式 | | 7 | 完成 | JSON + HTML 报告、Rich 终端摘要 | | 8 | 完成 | README + GitHub 推送 | ## License MIT —— 见 [LICENSE](LICENSE)。仅用于授权的安全研究。 ## 免责声明 OCR-Zen 是一款研究工具,**仅限用于授权的红队评估和安全研究**。请勿对您不拥有或未获得明确书面测试许可的系统使用。作者对滥用不承担任何责任。 *OCR-Zen - 作者 ak4hit*
标签:Go语言工具, LLM视觉API, OCR, Petitpotam, Python, 反取证, 安全评估, 无后门, 逆向工具