elon-efte/llm-injection-scanner

GitHub: elon-efte/llm-injection-scanner

一个自动化的大语言模型提示注入扫描器,基于OWASP LLM Top 10标准,帮助检测和报告LLM应用中的提示注入漏洞。

Stars: 0 | Forks: 0

# 🔬 LLM 提示注入扫描器 [![CI](https://github.com/YOUR-USERNAME/llm-injection-scanner/actions/workflows/ci.yml/badge.svg)](https://github.com/YOUR-USERNAME/llm-injection-scanner/actions/workflows/ci.yml) [![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11-blue)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) [![OWASP LLM Top 10](https://img.shields.io/badge/OWASP-LLM%20Top%2010-red)](https://owasp.org/www-project-top-10-for-large-language-model-applications/) [![Docker Ready](https://img.shields.io/badge/container-Podman%20%2F%20Docker-blue)](PODMAN.md) ## 演示报告 ![报告截图 — 摘要显示 CRITICAL 风险,14 个易受攻击,3 个可疑](https://raw.githubusercontent.com/elon-efte/llm-injection-scanner/master/docs/report-screenshot.png) ## 这是什么? 当公司使用 GPT-4 或 Claude 等 LLM 构建聊天机器人、副驾驶或 AI 代理时,它们会给模型一个 **系统提示** —— 一组定义机器人行为、限制和身份的隐秘指令。 **提示注入** 是一种攻击,恶意用户发送精心构造的输入,旨在: - 覆盖或忽略这些系统指令 - 提取隐藏的系统提示 - 使模型采用新的不受限制的人格(越狱) - 从模型的上下文中泄露敏感数据 该扫描器自动化了这一测试过程。你将它指向一个 LLM + 系统提示,它会运行一个攻击负载库,并生成一份专业的 HTML 报告,显示哪些攻击成功了。 ## 功能 - **21 个攻击负载**,涵盖 6 个 OWASP LLM Top 10 类别 - **4 个 LLM 后端**:OpenAI、Anthropic (Claude)、Ollama(本地)以及任何兼容 OpenAI 的 API - **自动检测**,使用关键词匹配 + 语义模式分析 - **专业 HTML 报告**,包含严重性评级、置信度分数以及每个测试的详细信息 - **CI/CD 就绪**:如果发现漏洞则退出代码为 2(触发流水线失败) - **新手友好**:每个文件都有详尽的注释 ## 攻击类别 | 类别 | 负载数量 | OWASP 引用 | |---|---|---| | 直接提示注入 | 5 | LLM01 | | 系统提示提取 | 5 | LLM01, LLM07 | | 越狱 / 角色覆盖 | 5 | LLM01 | | 间接提示注入 | 3 | LLM01 | | 数据泄露 | 3 | LLM06 | | 指令边界测试 | 3 | LLM01 | ## 项目结构 ``` llm-injection-scanner/ │ ├── scanner/ # Main Python package │ ├── __init__.py │ ├── __main__.py # Allows `python -m scanner` invocation │ ├── cli.py # Command-line interface (built with Click) │ ├── core.py # Scanner engine — orchestrates the scan │ ├── payloads.py # Attack payload library (21 payloads) │ ├── detectors.py # Response analysis & verdict logic │ ├── reporter.py # HTML report generator │ └── adapters/ │ ├── base.py # Abstract base class for all adapters │ ├── openai_adapter.py # OpenAI GPT adapter │ ├── anthropic_adapter.py # Anthropic Claude adapter │ ├── ollama_adapter.py # Local Ollama adapter │ └── generic_adapter.py # Any OpenAI-compatible API │ ├── examples/ │ └── demo_system_prompt.txt # Example system prompt for testing │ ├── requirements.txt └── README.md ``` ## 快速开始 ### 1. 克隆并安装 ``` git clone https://github.com/YOUR-USERNAME/llm-injection-scanner.git cd llm-injection-scanner pip install -r requirements.txt ``` ### 2. 运行扫描 **针对 OpenAI:** ``` python -m scanner scan \ --provider openai \ --api-key sk-YOUR_KEY_HERE \ --system-prompt "You are a helpful customer service bot for AcmeCorp." ``` **针对 Anthropic (Claude):** ``` python -m scanner scan \ --provider anthropic \ --api-key sk-ant-YOUR_KEY_HERE \ --model claude-3-haiku-20240307 \ --system-prompt "You are a helpful customer service bot." ``` **针对本地 Ollama 模型(免费,无需 API 密钥):** ``` # 首先安装 Ollama 并拉取模型: # https://ollama.ai → 然后运行:ollama pull llama3 python -m scanner scan \ --provider ollama \ --model llama3 \ --system-prompt "You are a helpful customer service bot." ``` **从文件加载系统提示:** ``` python -m scanner scan \ --provider openai \ --api-key sk-... \ --system-prompt-file examples/demo_system_prompt.txt ``` ### 3. 打开报告 扫描器会在当前目录保存 `scan_report_.html`。在任意浏览器中打开它,即可查看完整的交互式报告。 ## CLI 参考 ``` python -m scanner --help python -m scanner scan --help python -m scanner list-payloads ``` ### `scan` 选项 | 选项 | 简写 | 描述 | |---|---|---| | `--provider` | `-p` | `openai`, `anthropic`, `ollama`, `generic` | | `--api-key` | `-k` | OpenAI 或 Anthropic 的 API 密钥 | | `--model` | `-m` | 模型名称(每个提供者有默认值) | | `--system-prompt` | `-s` | 用引号括起来的系统提示文本 | | `--system-prompt-file` | `-f` | 包含系统提示的 .txt 文件路径 | | `--output` | `-o` | HTML 报告的自定义输出路径 | | `--categories` | `-c` | 仅运行特定类别(可重复使用) | | `--severity` | `-v` | 最低严重性:`critical`,`high`,`medium`,`low` | | `--delay` | `-d` | API 调用之间的秒数(默认:0.5) | | `--quiet` | `-q` | 抑制进度输出 | ### 过滤示例 ``` # 仅运行 critical 和 high severity 的 payloads python -m scanner scan -p openai -k sk-... -s "..." --severity high # 仅运行 jailbreak 和 direct injection 测试 python -m scanner scan -p openai -k sk-... -s "..." \ -c "Jailbreaks" -c "Direct Injection" # 列出所有可用的 payloads python -m scanner list-payloads ``` ## 作为 Python 库使用 你也可以直接将扫描器导入到你自己的 Python 脚本中: ``` from scanner.adapters import OpenAIAdapter, AnthropicAdapter, OllamaAdapter from scanner.core import Scanner from scanner.payloads import ALL_PAYLOADS, JAILBREAKS from scanner.reporter import generate_report # 选择你的 adapter adapter = OpenAIAdapter(api_key="sk-...", model="gpt-3.5-turbo") # 运行扫描(你可以传递一个 payloads 子集) scanner = Scanner(adapter=adapter, payloads=JAILBREAKS) result = scanner.run(system_prompt="You are a helpful bot.") # 生成 HTML 报告 report_path = generate_report(result, output_path="my_report.html") print(f"Report saved: {report_path}") # 以编程方式访问结果 for r in result.results: print(f"{r.payload_id}: {r.verdict.value} (confidence: {r.confidence:.0%})") ``` ## 添加自定义负载 将你自己的负载添加到 `scanner/payloads.py`: ``` from scanner.payloads import Payload, Severity, ALL_PAYLOADS my_payload = Payload( id="CUSTOM-001", name="My Custom Injection", category="LLM01 - Direct Prompt Injection", severity=Severity.HIGH, payload="[Your injection text here]", description="What this attack attempts to do.", detection_hints=["keyword that appears if attack succeeds"], ) # 添加到主列表 ALL_PAYLOADS.append(my_payload) ``` ## 添加新 LLM 适配器 要支持新的 LLM 后端,请在 `scanner/adapters/` 中创建一个文件并继承 `BaseLLMAdapter`: ``` from scanner.adapters.base import BaseLLMAdapter, LLMResponse class MyNewAdapter(BaseLLMAdapter): def __init__(self, api_key: str, model: str): self.api_key = api_key self.model = model @property def name(self) -> str: return f"my-provider/{self.model}" def send(self, system_prompt: str, user_message: str) -> LLMResponse: # ... call your API here ... return LLMResponse(content=response_text, model=self.model, provider="my-provider") ``` ## CI/CD 集成 扫描器在发现任何漏洞时退出代码为 `2`。在 GitHub Actions 中使用它可阻止合并: ``` # .github/workflows/llm-security.yml name: LLM Security Scan on: [push, pull_request] jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: { python-version: "3.11" } - run: pip install -r requirements.txt - run: | python -m scanner scan \ --provider openai \ --api-key ${{ secrets.OPENAI_API_KEY }} \ --severity high \ --system-prompt-file examples/demo_system_prompt.txt ``` ## 参考 - [OWASP LLM Top 10](https://owasp.org/www-project-top-10-for-large-language-model-applications/) - [OWASP LLM01: 提示注入](https://genai.owasp.org/llmrisk/llm01-prompt-injection/) - [提示注入攻击与防御](https://arxiv.org/abs/2302.12173) - [Lakera 的 Gandalf — 提示注入游戏](https://gandalf.lakera.ai/) ## 许可证 MIT 许可证 — 详见 [LICENSE](LICENSE)。 *作为安全研究项目构建。仅在你拥有或已获得明确许可的系统上使用。*
标签:AI安全, AI风险缓解, Anthropic, Chat Copilot, CIS基准, Docker, LLM评估, Ollama, OpenAI, OWASP LLM Top 10, Petitpotam, Python, 关键词匹配, 内存规避, 大语言模型安全, 安全扫描, 安全报告, 安全规则引擎, 安全防御评估, 提示注入, 攻击载荷, 无后门, 时序注入, 机密管理, 模型安全评估, 注入攻击, 生成式AI安全, 虚拟机, 请求拦截, 逆向工具, 集群管理