文章总结: aiscan是一款创新性AI安全扫描工具,通过160行Agent循环将LLM与确定性扫描引擎深度整合。其核心采用伪命令模式在进程内直接调用扫描器,避免子进程开销,支持Scan、Agent、IOA三种工作模式。架构设计包含可组合的Agent循环、DAG扫描流水线、Prompt缓存优化等关键技术,具备工程严谨、测试扎实等优点,为AI安全自动化提供了有价值的参考实现。 综合评分: 85 文章分类: AI安全,安全工具,WEB安全,安全开发,渗透测试
工具 | aiscan —— 一个 160 行 Agent 循环,如何驱动整套安全扫描引擎
原创
GLM-5.2 GLM-5.2
赛博生存指南
2026年6月22日 12:25 浙江
在小说阅读器读本章
去阅读
M09Ic 大佬的新作已开源。
AI渗透的拐点已至?我是如何通过AI纯黑盒挖到通用产品的9.8分RCE 0day漏洞
市面上”AI + 安全”的工具,大部分是把 LLM 套在 nmap/nuclei 外面当个翻译官——你说话,它替你敲命令。chainreactors 的 aiscan 不太一样:它把 LLM Agent 和确定性扫描引擎缝在同一套引擎里,扫描器作为”伪命令”在进程内被 Agent 直接调用,没有子进程、没有输出解析、没有中间损耗。
这篇拆一遍它的源码(296 个 Go 文件),看它到底是怎么把这两层缝起来的,以及缝得怎么样。
项目:github.com/chainreactors/aiscan[1] · AGPL-3.0 · 标着 Preview
一、它在干什么
三种模式:
| 模式 | 性质 | 要 LLM 吗 | | — | — | — | | Scan | 确定性 DAG 流水线:端口 → Web → 弱口令 → POC,可选 AI 验证 | 可选 | | Agent | 自然语言自主评估,自己规划、扫描、分析、出报告 | 必须 | | IOA | 多 Agent 分布式协作(挂在独立的 ioa 服务器上) | 必须 |
关键卖点:同一个扫描引擎,既驱动确定性流水线,也驱动自主 Agent。不是两套东西。
编译期用 build tag 切三档二进制:
- •
agent(~28MB)纯 Agent 运行时,给远程 worker 部署 - •
mini(~77MB)标准 scan/agent - •
full(~123MB)加 playwright 浏览器、katana 爬虫、passive 空间测绘
二、分层架构
cmd/ CLI 入口 + 命令分发
core/runner 运行时编排(App 容器、AgentRuntime、系统提示)
core/config 配置合并(CLI > env > yaml > ldflags)
core/resources 内嵌 .bin 指纹/字典/POC 模板
core/eventbus 泛型事件总线
pkg/agent LLM Agent 核心(~160 行主循环)
├─ provider/ OpenAI/Anthropic 协议桥接
├─ evaluator/ 独立裁判 LLM
├─ inbox/ 生产者/消费者消息队列
└─ truncate/ 分级上下文截断
pkg/commands CommandRegistry(命令 + 工具双注册)
pkg/tools 扫描器(gogo/spray/zombie/neutron…)
skills/ 内嵌 Markdown 技能
一个有意思的依赖方向控制:core/runner 不反向 import 重型扫描器,而是靠 4 个函数指针钩子(ScannerInitFunc 等),由 cmd/setup.go 的 init() 反向注入。runner 包因此保持干净。
三、最值得看的几个工程决策
1. 伪命令模式:扫描器全在进程内跑
这是全项目最关键的设计。所有扫描器(gogo/spray/zombie/neutron)都是伪命令——调用 SDK 的 RunWithArgs,把输出写进 bytes.Buffer,不 spawn 子进程。
CommandRegistry 同时管两类东西:
- •
Command(CLI 伪命令,如scan、gogo)——人用 - •
AgentTool(function-calling 工具,如bash、websearch)——LLM 用
后果是:LLM 经常会在命令后面乱加 shell 语法(| head -30、> file.txt、&& next)。aiscan 的处理很克制——拒绝,而不是静默丢弃:
// pkg/commands/command.go
if t == "|" || t == "||" {
return nil, fmt.Errorf("pseudo-commands run in-process and do not support shell pipes...")
}
为什么不能静默丢?因为 LLM 加 | head -30 是想限制输出。你要是悄悄把管道删了,扫描器就会对着完整字典表跑到天荒地老。所以宁可报错让 LLM 重写。
2. Agent 主循环真的只有 ~160 行
pkg/agent/loop.go 的 runLoop,每轮 turn:
drain inbox → 拼 system+messages → requestWithRetry(LLM)
→ 有 tool_calls 就 executeToolCalls(并行/串行混合)
→ 查 token budget / MaxTurns / terminate → 下一轮
所有业务(工具、重试、评估、收件箱、调度器、截断)都是 Config 结构体上的可插拔字段,核心循环不硬编码任何一个。这是它敢说”可组合”的底气。
工具调度还分模式:声明自己是 ParallelSafe 的工具并发跑,其余串行;最后按原始顺序回填结果。
3. DAG 扫描流水线
pkg/tools/scan/pipeline/pipeline.go 是个事件驱动的有向无环图:
type Capability struct {
Name string // gogo portscan / spray web / zombie weakpass / neutron POC
Routes []Route // From + Accept 谓词
Worker int // 并发度
Run func(ctx, event, emit) // 处理事件,向下游 emit
}
亮点:
- • 启动时用三色标记法检测环——防止配置错误造成死循环。
- • 每个 route 带
seenmap 去重——同一个指纹不会重复送去做 POC。 - •
sync.Cond+pending计数实现 waitIdle,等整张图跑完。
quick / full 两种 profile 本质上就是不同的 Capability 组合。
4. Prompt 缓存:有理论、有测试
多数 Agent 框架根本不管 prompt 缓存。aiscan 在 Anthropic 侧精确放 3 个 breakpoint:最后一个 tool 定义、system 末块、最后一条 user 消息末块。
cache_breakpoint_test.go 严格验证三条不变量:
- • 前缀跨轮字节稳定
- • 只有最后一条 user 消息带 cache_control
- • fork 出来的子 Agent,和父 Agent 共享字节级相同前缀
最后一条是关键——它让”派生子 Agent 分头干活”这种模式真的省钱,而不是每个子 Agent 都从头烧 token。
5. 裁判 LLM + 上下文逃逸阀
evaluator 是个独立的 LLM(可以用便宜模型),不共享 Worker 的对话,只看一份压缩 trace:工具调用序列 + 摘要 + token 占用百分比。
它强制用 function-calling 输出 verdict(pass/reason/feedback/inherit_context),不靠解析自由文本。
inherit_context 是个聪明的设计:上下文占用超过 80% 时强制置 false,这时 a.Reset() 清空历史重来,feedback 必须自包含(带文件路径、变量名)。这是对付”长任务把上下文撑爆”的逃生阀。
6. Skills:知识跟着工具走
每个扫描器自带一份 Markdown 战术文档(带 YAML frontmatter),//go:embed 内嵌。agent:true 的技能还能变成可派生的子 Agent 类型。
Agent 不把所有 prompt 塞进 system,而是按需通过 aiscan://skills/... 这个虚拟文件系统 URL 去读。省 token,也方便迭代。
四、怎么用
# 不用 LLM,一行扫
aiscan scan -i 192.168.1.0/24
# 带 AI 验证(对 high 级别以上的发现做主动验证)
aiscan scan -i http://target.example --verify=high --sniper
# 纯 Agent:自然语言下任务
aiscan agent --base-url "https://api.deepseek.com" --api-key "sk-..." \
--model deepseek-chat \
-p "scan targets and check for high-risk vulnerabilities" -i 192.168.1.0/24
# 带目标评估(独立裁判判断是否完成)
aiscan agent -p "full scan" -i http://target.example \
-e "find all open ports with service fingerprints"
# 多 Agent:起 ioa 服务器 + worker
aiscan ioa serve --ioa-url http://0.0.0.0:8765
aiscan agent --ioa-url http://127.0.0.1:8765 --space pentest-project \
-p "scan assigned targets and report findings"
五、优点
- 1. 架构干净。runner 用函数指针钩子反向解耦,
pkg/agent用 type alias 重导出 provider 类型做门面——依赖方向控制得很自觉。 - 2. Agent 循环真的可组合。业务全是 Config 上的插件字段,核心不硬编码。
- 3. 伪命令 + 进程内执行。没有子进程开销和输出解析地狱,
stripShellSyntax的”拒绝而非丢弃”很克制。 - 4. Prompt 缓存有测试守护。fork 前缀字节一致性这种细节都专门测了。
- 5. DAG 流水线成熟。环检测 + 去重 + 无锁等待,是个通用图执行引擎。
- 6. 双协议桥接务实。默认 OpenAI 协议(大多数第三方端点兼容),Anthropic 显式 opt-in。
- 7. 工程严谨。
recover()防 panic、UTF-8 安全截断(CJK 不乱码)、三阶段信号关闭、token 双阈值。 - 8. 测试扎实(90 个测试文件),含真实 LLM 调用的 e2e 测试 + events JSONL 审计。
- 9. 同源三档二进制,重依赖编译期可选。
六、值不值得看
如果你的工作跟”AI Agent + 安全自动化”沾边,aiscan 的源码值得一读,不是因为它的扫描能力(那来自 gogo/spray 这些成熟子项目),而是因为它示范了:
- • 怎么把确定性引擎和 LLM Agent 用同一套底座统一;
- • 怎么写一个真·可组合的 Agent 循环(而不是一坨 if-else);
- • prompt 缓存、上下文管理、DAG 编排这些硬骨头认真做会长什么样。
主要风险就三点:依赖太重、全局状态注入、缺上下文压缩。对一个 Preview 项目来说,架构成熟度和测试纪律已经超前了一大截。
边界
仅用于授权的安全测试与研究。需要测能力就自己搭靶场;扫描前确认合规并取得充分授权;越界使用后果自负。项目 README 与 LICENSE 已有完整免责声明。
参考
- • aiscan:github.com/chainreactors/aiscan[1]
- • IOA(多 Agent 协作):github.com/chainreactors/ioa[2]
- • gogo(端口/服务):github.com/chainreactors/gogo[3]
- • spray(Web 探测/指纹):github.com/chainreactors/spray[4]
- • zombie(弱口令):github.com/chainreactors/zombie[5]
- • neutron(POC 模板引擎):github.com/chainreactors/neutron[6]
- • sdk(扫描器 SDK):github.com/chainreactors/sdk[7]
引用链接
[1] github.com/chainreactors/aiscan:https://github.com/chainreactors/aiscan
[2]github.com/chainreactors/ioa:https://github.com/chainreactors/ioa
[3]github.com/chainreactors/gogo:https://github.com/chainreactors/gogo
[4]github.com/chainreactors/spray:https://github.com/chainreactors/spray
[5]github.com/chainreactors/zombie:https://github.com/chainreactors/zombie
[6]github.com/chainreactors/neutron:https://github.com/chainreactors/neutron
[7]github.com/chainreactors/sdk:https://github.com/chainreactors/sdk
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:赛博生存指南 GLM-5.2 GLM-5.2《工具 | aiscan —— 一个 160 行 Agent 循环,如何驱动整套安全扫描引擎》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论