arvindpj007/AgentVuln-Red-Teaming-OWASP-Top-10-For-LLMs

GitHub: arvindpj007/AgentVuln-Red-Teaming-OWASP-Top-10-For-LLMs

基于 Anthropic API 构建的刻意含漏洞 RAG Agent,针对 OWASP LLM Top 10(2025)逐项提供可复现的攻击 PoC 及对应的加固修复方案。

Stars: 0 | Forks: 0

# AgentVuln — LLM 应用的 OWASP Top 10 (2025),红队评估 一个刻意存在漏洞的 RAG 服务台 agent(基于 Anthropic Messages API 构建),以及一组利用脚本,通过有效的 PoC(概念验证)来演示 **OWASP LLM 应用 Top 10 (2025)** 安全风险——随后在 `--hardened` 模式下修复它们。 ## 为什么会有这个项目 作为一个安全研究作品集项目构建:它将实际的 AppSec 漏洞利用(从 LLM 输出中链式触发的 SQLi / SSRF / 数据泄露)与 AI 特有的风险框架相结合,同时展示了破解与修复过程。也可作为培训材料。 ## 快速开始 ``` cd AgentVuln python -m venv .venv && source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # then add your ANTHROPIC_API_KEY python exploits/run_all.py # run all eight exploits, vulnerable vs. hardened ``` 没有现成的 API key?[离线检查](#offline-check-no-api-cost)可以在零 API 调用的情况下测试 DB、retriever 和 guardrails。详情请参阅[设置](#setup),设计原理请参阅 `PROJECT-SCOPE.md`。 ## 设置 以下两个步骤是**必需的** —— 本仓库既不包含虚拟环境,也不包含 `.env` 文件。 ``` cd AgentVuln python -m venv .venv && source .venv/bin/activate pip install -r requirements.txt # installs anthropic + python-dotenv (not pre-installed) cp .env.example .env # then put your real ANTHROPIC_API_KEY in .env ``` 确认安装是否成功: ``` python -c "import anthropic, dotenv; print('deps ok', anthropic.__version__)" ``` 如果未设置 `ANTHROPIC_API_KEY` 且缺少 `.env` 文件,每次模型调用都会因身份验证错误而失败——在运行任何涉及模型的代码之前,请务必解决此问题。 ## 运行 ``` # 交互式 REPL python -m app.agent --mode vulnerable python -m app.agent --mode hardened # 单个 exploit(实操示例) python exploits/llm07_system_prompt_leak.py python exploits/llm01_prompt_injection.py # 全部(运行所有八个 exploit 模块) python exploits/run_all.py ``` SQLite DB 会在首次运行时根据 `data/seed.sql` 创建并填充数据。 ### 离线检查(无 API 费用) 在仓库根目录下运行此命令,以便在消耗任何 token **之前**确认 DB、retriever 和 guardrails 能否正常工作——它不会发起任何 API 调用: ``` python - <<'PY' import sqlite3 from app import config, rag, guardrails con = sqlite3.connect(":memory:"); con.executescript(config.SEED_SQL.read_text()) print("db seeded :", con.execute("select count(*) from users").fetchone()[0], "users") print("poisoned doc:", "99-ticket-4471.md" in [n for n, _ in rag.retrieve("password account access")]) print("sql guard :", not guardrails.is_safe_sql("select * from secrets")[0]) print("ssrf guard :", not guardrails.is_safe_url("http://169.254.169.254/latest/meta-data/")[0]) PY ``` 所有四行都应该打印出真值。 ## 模型与利用可靠性 默认使用 `claude-opus-4-8`。在 `.env` 中设置 `AGENTVULN_MODEL=claude-haiku-4-5` 可以降低迭代成本(你需要多次重新运行 payload)。 **“存在漏洞”的模式会移除*应用层*的 guardrails,而不是模型本身的判断。** 一个能力强的模型可能仍然会自主拒绝导出 SSN 或将机密信息通过邮件发送给 `attacker@evil.example`,因此即使应用大门敞开,利用脚本也可能输出 `INCONCLUSIVE`。请准备好强化你的 payload——并将模型层面的抵抗视为一项值得记录的合理发现,而不是脚手架的失败。 ## OWASP LLM Top 10 (2025) — 覆盖范围与优先级 | 代码 | 风险 | 状态 | 位置 | |------|------|--------|-------| | LLM01 | Prompt Injection(直接 + **间接**) | 🔴 exploit | `exploits/llm01_prompt_injection.py`, `kb/99-ticket-4471.md` | | LLM02 | 敏感信息泄露 | 🔴 exploit | `exploits/llm02_sensitive_disclosure.py` | | LLM05 | 不当输出处理 (LLM→SQLi/SSRF/XSS) | 🔴 exploit | `exploits/llm05_improper_output_handling.py` | | LLM06 | 过度权限 (Excessive Agency) | 🔴 exploit | `exploits/llm06_excessive_agency.py` | | LLM07 | System Prompt 泄露 | 🔴 exploit | `exploits/llm07_system_prompt_leak.py` | | LLM08 | 向量与 Embedding 漏洞 | 🟠 demo | `exploits/llm08_rag_poisoning.py` | | LLM09 | 错误信息 | 🟠 demo | `exploits/llm09_misinformation.py` | | LLM10 | 无限制消耗 | 🟠 demo | `exploits/llm10_unbounded_consumption.py` | | LLM03 | 供应链 | ⚪ threat-model | `REPORT.md` | | LLM04 | 数据与模型投毒 | ⚪ threat-model | `REPORT.md` | 🔴 可用的 PoC · 🟠 演示 · ⚪ 仅作分析(此处无法单独利用) ## 标志性攻击链(一次攻击,五个漏洞编号) 一个无害的“密码 / 账户访问”问题会检索到被投毒的 `kb/99-ticket-4471.md` (**LLM08**),其中的**间接注入** (**LLM01**) 会指示 agent 通过其过度授权的 `query_db` 工具 (**LLM06**) 读取 `secrets` 表,将由模型编写的 SQL 传递给原始执行点 (**LLM05**),并将结果通过邮件发送给攻击者 (**LLM02**)。运行 `python exploits/llm01_prompt_injection.py`。 ## 布局 ``` app/ agent loop, tools, RAG, guardrails, config (vulnerable/hardened) kb/ knowledge base (incl. the poisoned doc 99-ticket-4471.md) data/ seed.sql -> app.db exploits/ one script per OWASP id (8 exploits + run_all.py) REPORT.md full red-team findings (payload → observed → impact → fix per risk) WHITEPAPER.md the distilled research argument (1–2 pages) PROJECT-SCOPE.md scope & design rationale ``` ## 包含哪些内容 - **Agent**(`app/`):同时包含 `vulnerable` 和 `hardened` 模式,并带有 `use_rag` 开关,以区分直接攻击与基于 RAG 的攻击。 - **八个 exploit 脚本**(`exploits/`)——五个可用的 🔴 PoC(LLM01/02/05/06/07;其中 LLM07 依赖于模型/具有间歇性)和三个 🟠 演示(LLM08/09/10)——外加 `run_all.py`。 - **Hardened 修复:** 一个最小权限的 `lookup_user(name)` 工具取代了原始的 `query_db(sql)` 执行点(`app/tools.py` → `LOOKUP_USER` / `_lookup_user` / `tools_for`)、一个 SSRF 白名单、一个邮件域名限制,以及一个机密信息脱敏输出过滤器(`app/guardrails.py`)。 - **交付物:** `REPORT.md`(完整的发现——针对每个风险的 payload → 观察结果 → 影响 → 修复)和 `WHITEPAPER.md`(精炼的研究论述)。 - **扩展功能(未实现):** Docker 沙箱化工具、更深度的 agentic 工具循环,以及系统性的跨模型比较。
标签:CISA项目, DLL 劫持, OPA, RAG, 大语言模型, 插件系统, 数据展示, 红队, 逆向工具, 零日漏洞检测, 靶场