PrakarshKamal/blacklight
GitHub: PrakarshKamal/blacklight
一款 AI 防火墙工具,在文件送入 LLM 之前检测并净化 PDF、图片等文档中隐藏的 prompt injection 攻击。
Stars: 0 | Forks: 0
# Blacklight
**专用于文件上传的 AI 防火墙** — 在 PDF、图像和文档送达 LLM 之前,扫描其中隐藏的 prompt injection。
## 功能说明
团队每天都会将发票、简历、截图和文档上传到 RAG pipeline 和聊天应用中。攻击者可以将指令隐藏在这些文件中 —— 例如白底白字、PDF 文本层、仅 OCR 可见的内容,或者是诸如“忽略之前的指令”之类的短语。
Blacklight 通过多层提取文本,检测注入模式,并返回可供模型安全摄入的**风险评分**、**威胁证据**以及**净化后的输出**。
## 特性
- **PDF 文本层提取** — 读取可选文本,包括视觉覆盖层下的内容
- **OCR 与混淆信号** — 图像和截图分析,支持白底覆盖检测
- **混合检测** — regex 启发式算法,外加可选的 OpenAI 语义分析
- **实时扫描器 UI** — 上传文件或使用演示样本,提供高亮显示的威胁和扫描日志
- **净化后输出** — 剥离文本并标记为对 RAG / 聊天工作流安全
## 检测原理
1. **提取** — PDF 解析、纯文本、OCR (Tesseract.js)、嵌入式 PDF 图像
2. **Regex** — 快速匹配已知的注入短语
3. **LLM** — 利用 OpenAI 分类进行语义/隐藏指令分析(可选)
4. **合并** — 整合威胁、置信度、攻击类型以及净化后的文本
## 快速开始
```
cp .env.example .env.local
# 为混合 LLM 分析添加 OPENAI_API_KEY(可选)
npm install
node scripts/generate-samples.mjs
npm run dev
```
打开 [https://blacklight-ai.vercel.app/](https://blacklight-ai.vercel.app/) 并滚动至 **Live scanner**。
## 演示样本
| 按钮 | 用途 |
| ------------------------- | --------------------------------- |
| **Try Malicious Invoice** | 文档文本中的隐藏注入 |
| **Try Clean Resume** | 良性基准(无威胁) |
| **Try OCR Screenshot** | 图像形式的注入路径 |
## API
`POST /api/scan` (`multipart/form-data`)
**请求 —— 仅提供以下其中之一:**
- `file` — 上传的文档。允许的格式:`.pdf`, `.txt`, `.md`, `.png`, `.jpg`, `.jpeg`, `.webp`。最大 **10 MB**。系统会检查(magic bytes)内容以确认其与扩展名匹配。
- `sampleId` — `malicious-invoice`、`clean-resume`、`malicious-screenshot` 之一。
每个响应都包含一个 `x-request-id` header,用于日志关联。
**成功 (`200`):** 返回一个 JSON `ScanResult`,包含 `status` (`threat` | `clean`)、`riskScore` (0–100)、`confidence` (0–1)、`attackType`、`summary`、`threats`、`extractedPreview`、`sanitized`、`detectionMethod`、`llmUsed`、`ocrUsed`、`layers`、`obfuscationDetected` 和 `logs`。
**错误:** 返回统一格式的结构体 `{ "error": { "code", "message" }, "requestId" }`:
| Code | Status | 含义 |
| ---------------- | ------ | ----------------------------------------- |
| `INVALID_INPUT` | 400 | 缺少/无效的 `file` 或 `sampleId` |
| `UNSUPPORTED_TYPE` | 415 | 不允许的扩展名或字节不匹配 |
| `FILE_TOO_LARGE` | 413 | 上传超过 10 MB 限制 |
| `NO_TEXT` | 422 | 文档中没有可提取的文本 |
| `RATE_LIMITED` | 429 | 请求过多(参见 `Retry-After`) |
| `INTERNAL` | 500 | 意外的服务器错误 |
**限流:** 基于内存的 token bucket 尽力而为(每个客户端 IP 约为 10 次请求/分钟)。在多实例/Serverless 部署中,这是基于单个实例的,而不是全局配额 —— 如果需要强制执行,请使用共享存储(Redis/Upstash)作为支持。
**Lite 模式:** 在 Serverless 环境(`VERCEL=1`)或当 `BLACKLIGHT_LIGHT_SCAN=true` 时,提取过程将使用 PDF 文本层加上一次快速 OCR 扫描,以确保不超出函数限制。**同一份文档**始终会被扫描 —— 只是提取深度有所改变。
## 环境变量
| 变量 | 用途 |
| ---------------- | ------------------------------------ |
| `OPENAI_API_KEY` | 启用 LLM 分析层 |
| `OPENAI_MODEL` | 可选 — 默认为 `gpt-4o-mini` |
如果没有 `OPENAI_API_KEY`,扫描将仅在 **regex + 提取/OCR** 模式下运行。
## 技术栈
Next.js · TypeScript · Tailwind CSS · shadcn/ui · pdf-parse · Tesseract.js · Sharp · OpenAI SDK
标签:AI防火墙, RAG安全, Red Canary, 大模型安全, 提示词注入检测, 文档解析, 自动化攻击