夜雨聆风学习资料网

ARTICLE · 1257904

32K star 的 AI 渗透工具,自身也有安全问题

32K star 的 AI 渗透工具,自身也有安全问题
导 读

PentAGI,一个 32K star 的开源项目,主业是让 AI 自主渗透目标系统。本月它发布的 2.2.0 版本,头号更新是修掉自己身上的一个 CVE——教别人给 AI 画边界的产品,先在自己身上破了防。

这个漏洞的完整细节,放在最后一节讲。先说清它是什么性质的:AI 手里有命令执行权,沙箱又握着宿主机的钥匙,两件事被 prompt injection 串起来,沙箱就不再是边界。于是 VXControl——这家做安全工具的迪拜公司——把自己的产品切开重做了一遍。

自主渗透的工程重心,正在从“会不会打”转到“打的时候关没关住”。按这个顺序讲:先说清渗透测试在干什么,再看 AI 接进来多出了什么问题,然后看 PentAGI 怎么把问题一个个压到边界上,最后看它自己交过的那次学费。

渗透测试到底在测什么

渗透测试有两条硬前提:书面授权,和一张明确的资产清单。没有这两样,它和入侵在法律上没有区别。授权书里通常还写时间窗口、禁止动作(比如不许做拒绝服务)、以及打到什么程度停。

它和扫描器的分工,用一句话就能分开:扫描器做覆盖,渗透做纵深。扫描器把已知的漏洞模式在资产上过一遍,给你一张“哪里有洞”的表;渗透要把几个单看都不致命的问题串成一条走得通的路。

举个常被低估的组合:一个只对内网开放的 SSRF、一个运维图省事的默认口令、一台能出网的测试机。扫描器会分别报三个中危,渗透报告会告诉你——从边缘到内网核心,这条路能走通。修复优先级立刻变了。

这就是渗透解决的问题:把“可能被利用”变成“已被验证可利用”。安全团队最缺的从来不是漏洞列表,是“先修哪个”的依据。

它的边界也得认:渗透是采样,不是全量;报告上写“未发现”的路径,只代表这次没走通。更重要的是,从扫完端口到决定下一步打哪,每一步都靠执行者临场判断——这套活贵、慢、依赖个人水平,原因就在这里。

AI 补的正是“下一步”

过去的自动化止步于规则。nmap 扫完给你一张端口表,sqlmap 跑完给你一个结果,接下来打哪、怎么打,还是靠人盯着输出临场决定。

大模型补的正是这一段判断。看到 Spring Boot Actuator 的端点可读,它会去翻配置里有没有凭据;看到报错里的版本号,它会去查这个版本对应哪个 CVE;看到登录页引用的 JS,它知道先看接口再谈爆破。这些动作没有一条能写成固定规则。

但自主是有代价的,而且很具体:

乱序 跳过前置条件直接打,一轮轮试错,token 烧完还在原地。

越界 顺着一条链接就扫到了授权清单之外的资产,这在真实项目里是事故。

难复盘 事后说不清为什么走这一步,报告写不出来,客户也不会认。

这三条代价指向同一个问题:敢不敢让它脱离人,自主跑完一整场测试。答案取决于三件工程——执行环境要隔离,过程要能审计,循环里要有刹车。

PentAGI 把这三件事做成了产品

PentAGI 是 VXControl 开源的自主渗透系统,GitHub 上 32K star,MIT 协议,Go 写后端、React 写前端,整套 Docker Compose 自托管。它内置 20 多个专业工具(nmap、Metasploit、sqlmap 这些),接 13 类模型供应商,本地 Ollama、vLLM 也能跑。你用一句话描述目标和目的,一组 agent 自己拆任务、调工具、写报告。

 

图 1:后台的 flow 列表。每个 flow 是一次独立任务,自带状态和终端(来源:项目仓库)

第一件事,执行环境隔离。每个 flow 起一个独立沙箱容器,命令只在里面跑,输出回给 agent,flow 结束容器销毁。模型从头到尾不碰宿主的 Docker daemon。

 

图 2:沙箱的三层结构,以及 2.2.0 之后补上的几道闸(依据官方 release notes 与 README 绘制)

第二件事,过程可审计。每条命令、每段输出、每个结论都进 PostgreSQL,算成向量存起来(pgvector 扩展);下次遇到相似目标,先查历史经验再动手。可选接 Graphiti 和 Neo4j,把主机、服务、发现做成一张知识图。一次性的扫描器每次从零开始,有记忆的系统会把“上次这个指纹对应哪个中间件、哪个口子好使”带进下一轮。

审计不只是存下来,还要看得见。后台把 flow 活动、工具调用次数、token 消耗、成本曲线摊在一页上——它更像一个工程系统,而不是一个“一键黑客”按钮。

 

图 3:后台仪表盘。每一步调了多少次工具、花了多少 token,都在这页上(来源:项目仓库)

第三件事,循环里装刹车。刹车挂在工具调用这个动作上,分三层。Adviser 当 mentor:同一种工具连调 5 次,或总调用到 10 次,就介入分析、建议换策略。Reflector 在模型连续 3 次生成不出工具调用时把它拉回来,或者引导它收尾。最外层是硬上限:agent 分通用和受限两档,通用的(Pentester、Coder 这类)100 次,受限的(检索、报告这类)20 次,到线优雅终止。

 

图 4:一次 flow 的循环,和三道刹车的触发条件(阈值为官方默认值)

这三道刹车是可配的。执行监控和任务规划(Planner 先把任务拆成 3 到 7 步)都是 beta,默认关闭。官方在 Qwen3.5-27B-FP8 上测过:打开之后耗时和 token 涨到 2 到 3 倍,结果质量约 2 倍。给小模型用是刚需,给强模型用是保险——这笔账得自己算。

部署门槛不高:Docker 加 Compose,最低 2 核 4G、20G 磁盘,起来之后 UI 在 8443 端口,默认账号 admin@pentagi.com,首次登录先改密码。

# 拉官方 compose 文件并启动

curl -O https://raw.githubusercontent.com/

vxcontrol/pentagi/master/docker-compose.yml

docker compose up -d

到这里,隔离、审计、刹车都齐了,看起来已经闭环。但先别急着部署——这个教别人给 AI 画边界的工具,自己栽过一个跟头。

它自己交过的学费

就是开头那个 CVE-2026-14784。2.1.0 及以前,随包发布的 .env.example 里 DOCKER_INSIDE=true,宿主机的 Docker socket 被挂进每一个沙箱。一个被 prompt injection 带偏的 agent,可以从沙箱里指挥宿主上的容器——刚才说的“模型不碰宿主 daemon”,在当时的默认配置下不成立。

官方的判断写在更新日志里:prompt injection 关不干净,抵抗力取决于模型的指令遵循和泛化能力。所以重点不该放在“说服模型别干坏事”,而该放在“干成了坏事也出不去”。2.2.0 的四项整改都是围绕这句话:

① 最小权限 drop 掉全部 capability,再按白名单加回。MKNOD 不给(已知的主要逃逸路径),SYS_PTRACE 留给调试器,进程数上限挡 fork bomb。

② 默认不挂宿主 socket DOCKER_INSIDE 改成默认 false。真要嵌套 Docker,得单独给一个 daemon,跟跑 PentAGI 的那个分开。

③ 启动自检 按真实 flow 起一个 worker,从里面验证 daemon 不是它自己的、27 个宿主逃逸请求被拒、7 个正常操作可用。任一项不过,agent 就拿不到 Docker 访问,系统继续跑。

④ worker 节点加固包 fail-closed 的 OPA 策略、seccomp 配置、清理定时器,一起给。

补完这些,还有一段边界要用户自己守。沙箱不是只绑 localhost——每个 flow 会发布两个端口给反弹 shell 这类带外回调用,默认从 28000 到 29999 这个窗口里取,绑在 0.0.0.0 上;Docker 的端口映射会绕过 ufw,得在防火墙前面或者 DOCKER-USER 链上收。另外,不用的 flow 要及时结束,结束才会删沙箱。

能力边界官方也写得直白:它不是 CALDERA 那类 BAS 或对手模拟产品,没有预置的攻击剧本。所以它适合有明确授权范围和资产清单的内部红队、安全工程师,想在自己基础设施上跑、想用本地模型不出网;不适合拿它当“一键打别人”的玩具——法律和技术两条风险,一条都躲不掉。

它先把自己打穿了一次,才把沙箱补成今天这样。你让它去打别人的系统之前,先问一句:我给它画的边界,比它给自己画的那道更清楚吗?

相关学习资料