随着大模型应用快速落地,RAG(Retrieval-Augmented Generation,检索增强生成)架构已经成为企业知识库、智能客服、AI Agent 等场景中的核心技术。然而,RAG 并不是简单地“接入知识库即可安全运行”,其在数据检索、文档管理、上下文拼接以及模型生成环节均存在新的攻击面。

  • 本文基于 AIRT Lab03 - Breaking RAG Systems 靶场,深入分析 RAG 系统中的典型安全问题,通过搭建一个存在漏洞的 RAG 环境,实战演示知识库投毒(Knowledge Base Poisoning)、间接提示词注入(Indirect Prompt Injection)、向量数据库未授权访问、敏感信息泄露等攻击方式。


文章介绍

完成实验环境搭建后,正式进入 AIRT 八大靶场实战。本篇从 Lab01 Foundations 开始,围绕 LLM 基础漏洞与信息泄露场景,结合真实靶场环境,演示系统 Prompt 泄露调试接口暴露配置泄露等典型问题,并分析漏洞成因、利用方式及防护思路,为后续 Prompt Injection、RAG 攻击、多智能体攻击等高级实战打下基础。


概述

构建并系统地破坏检索增强生成(RAG)应用程序。毒害其知识库,劫持数据,并通过大型语言模型(LLM)窃取敏感数据。本实验室展示了为什么RAG系统需要端到端安全。

学习目标

  • 部署使用ChromaDB和LangChain的易受攻击RAG应用程序
  • 用恶意文档毒害知识库通过检索的上下文执行间接提示注入
  • 通过LLM的响应泄露敏感数据
  • 测试未认证的矢量数据库访问
  • 了解完整的RAG攻击面

话不多说,我们直接开始;

lab03----RAG 检索增强系统攻击

靶场搭建

这里我们执行下述命令,创建我们的靶场环境:

# 修改pip源镜像
# 1. 进入 lab03 所在的工作目录
cd ~/Sec_tools/airt/labs/lab03

# 2. 将所有用到大模型的地方换成 qwen2.5:0.5b
sed -i 's/mistral:7b-instruct-q4_0/qwen2.5:0.5b/g' docker-compose.yml
sed -i 's/mistral:7b-instruct-q4_0/qwen2.5:0.5b/g' agents/app.py

# 3. 优化构建速度:为 Python 容器添加清华镜像源
sed -i 's/pip install/pip install -i https:\/\/pypi.tuna.tsinghua.edu.cn\/simple/g' agents/Dockerfile

# 4. 修复容器启动死锁:移除健康检查、降级依赖条件、为 curl 拉取模型预留 15 秒缓冲
sed -i '/healthcheck:/,/retries: 5/d' docker-compose.yml
sed -i 's/condition: service_healthy/condition: service_started/g' docker-compose.yml
sed -i 's/curl -X/sleep 15 \&\& curl -X/g' docker-compose.yml

# 5. 重新构建并后台启动所有服务
docker compose up -d --build

如果还是显示失败,可以看前几篇文章的解决内容:”直接去容器内拉取大模型

在这里插入图片描述

效果如下:

在这里插入图片描述
在这里插入图片描述

随后我们访问到 http://localhost:5000,成功得到页面:

在这里插入图片描述
在这里插入图片描述

本关要点:了解RAG的攻击常见方式

靶场结构

从上述页面我们可以得知:RAG助手可以访问公司的文件(里面可能包含我们感兴趣的东西,所以我们需要想办法拿到手)

# 具体流程
用户提问  ➟  LLM理解分析  ➟  向量数据库检索  ➟  知识库内容匹配  ➟  AI生成回复

                ┌──────────────┐
  User Query ──▶│  RAG App     │
                │  :5000       │
                │  (Flask)     │
                └───┬──────┬───┘
        Retrieve    │      │  Generate
                    ▼      ▼
             ┌─────────┐ ┌─────────┐
             │ChromaDB │ │ Ollama  │
             │ :8000   │ │ :11434  │
             │(Vectors)│ │ (LLM)  │
             └─────────┘ └─────────┘
                  ▲
                  │ Ingest (VULNERABLE)
                  │
             ┌─────────┐
             │Poisoned │
             │Documents│
             └─────────┘

这里我首先尝试问了一下AI问题,但是发现没有回答:

在这里插入图片描述

那么是不是需要我先上传文档,让AI去理解,然后才能进行输出?

遇到的问题

这里我尝试了五六次,修改app.py文件还是重新搭建靶场,发现无论是我“上传文档”还是“提问”,模型都返回响应码500

  • 提问:/query
  • 上传文档:/injest
    在这里插入图片描述
    在这里插入图片描述

这里要是大家有什么解决的方法可以评论区,私聊我都行;

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐