AI渗透测试教程:用garak扫描本地大模型并解读报告
AI渗透测试的起点不是直接攻击线上模型,而是先在一个隔离环境里跑一轮基线扫描,搞清楚模型对哪些提示词攻击没有防御。
本文用garak对本地Ollama模型做一次完整扫描,给出安装命令、扫描参数、报告解读和常见失败处理。
先满足三个前提
开始之前确认环境满足以下条件,否则扫描过程会卡在连接阶段。
- 一台能运行Ollama的Linux或macOS机器,建议内存8GB以上,模型选7B参数以内的小模型。
- Python 3.10或更高版本,用虚拟环境隔离依赖,避免污染系统Python。
- 模型只监听本机或内网地址,不要用公网可访问的推理接口做扫描。
检查Ollama是否正常:
ollama list
curl http://127.0.0.1:11434/api/tags
如果第二条命令没有返回JSON,先解决Ollama服务问题,再继续安装garak。
安装garak并确认能识别模型
创建虚拟环境并安装:
python3 -m venv ~/garak-env
source ~/garak-env/bin/activate
pip install -U pip
git clone https://github.com/NVIDIA/garak.git
cd garak
pip install -e .
安装完成后查看版本和可用探测模块:
garak --version
garak --list_probes | head -40
能列出探测模块说明安装成功。
下一步确认garak能否连上Ollama:
garak --model_type ollama --model_name llama3 --probes encoding
这里把llama3替换成你本地ollama list里实际存在的模型名。
如果第一次运行就报连接错误,优先检查Ollama服务地址和模型名,而不是怀疑garak本身。
跑一轮有意义的扫描
不建议一上来就跑全部探测模块,耗时长且报告难读。
先选几个与提示词注入、越狱和编码绕过相关的模块:
garak --model_type ollama --model_name llama3 \
--probes encoding,dan,promptinject \
--report_prefix ai-baseline
参数含义:
--probes:指定探测模块,encoding测编码绕过,dan测越狱类提示词,promptinject测提示词注入。--report_prefix:报告文件前缀,默认在当前目录生成.report.jsonl和.report.html。
扫描时长取决于模型推理速度,7B模型跑三个模块通常需要几十分钟。
扫描期间不要关闭终端,可以另开窗口观察Ollama日志。
报告里该看什么
扫描结束后会生成HTML报告,用浏览器打开查看。
重点看三个数:
- 通过率:模型拒绝或正确回应的比例,越高说明防御越好。
- 失败用例:点开具体条目,看模型输出了什么。失败不等于模型有漏洞,可能是探测用例本身触发了正常回答。
- 失败分类:按探测模块分组,判断哪类攻击最容易突破,比如编码绕过失败多,说明模型对变形输入不敏感。
把失败用例复制出来,人工复核一遍。
比如模型对base64编码的恶意请求照做,这才是需要记录的基线问题。
常见报错和避坑
连接被拒绝:确认ollama serve正在运行,且--model_name与ollama list输出完全一致。
扫描中途卡住:小内存机器加载大模型会频繁换页,换更小的模型或增加内存。
报告为空:检查命令是否带--report_prefix,以及当前目录是否有写权限。
误把扫描当生产测试:garak的探测用例包含攻击性提示词,只应在隔离环境使用。
生产接口做渗透测试需要单独授权,不能直接跑。
验证扫描是否有效
一个简单的验证方法是拿一个明显不安全的提示词手动测试模型,看它是否照做,再对比garak报告里同类用例的结果。
如果手动测试和报告结论一致,说明扫描链路是通的。
另外检查报告文件是否完整生成:
ls -lh ai-baseline.report.*
两个文件都存在且HTML能正常打开,本轮AI渗透测试的基线扫描就算完成。
后续可以换模型、换探测模块重复这个过程,逐步建立自己的测试记录。