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, 大模型安全, 提示词注入检测, 文档解析, 自动化攻击