自主 AI 安全测试工具的核心挑战不在于单点能力,而在于如何将 "侦察 - 分析 - 利用 - 报告" 这一复杂流程可靠地编排为可重复、可观测、可容错的自动化工作流。Shannon 作为开源的自主 AI 渗透测试框架,其工程实现为这一领域提供了值得参考的范式。
架构概览:五阶段管道化工作流
Shannon 将整个渗透测试流程抽象为五个明确的阶段,通过 Temporal 工作流引擎进行编排。这种分层设计既保证了阶段的顺序依赖,又最大化了并行效率。
阶段一:Pre-Reconnaissance
执行预侦察代理,完成环境初始化与基础信息收集。此阶段为串行执行,确保后续阶段拥有完整的上下文。
阶段二:Reconnaissance
运行侦察代理,结合源码分析与动态探测构建攻击面地图。该阶段整合 Nmap、Subfinder、WhatWeb 等工具,产出包含所有入口点、API 端点和认证机制的详细地图。
阶段三与四:Vulnerability Analysis + Exploitation(管道化并行)
这是架构设计的核心创新点。传统批处理模式会等待所有漏洞分析完成后再统一进入利用阶段,而 Shannon 采用 "管道化"(pipelined) 设计:
- 五个独立的漏洞分析管道并行运行,分别覆盖 Injection、XSS、Authentication、SSRF、Authorization 五类 OWASP 漏洞
- 每个管道内部采用 "vuln agent → queue check → conditional exploit" 的链式结构
- 当某个漏洞类型的分析代理完成后,立即检查该类型的漏洞队列,若存在可利用点则立即启动对应的 exploit agent,无需等待其他漏洞类型分析完成
这种设计消除了阶段间的同步屏障,显著缩短了整体执行时间。代码实现上使用Promise.allSettled确保单个管道失败不会影响其他管道继续执行。
阶段五:Reporting
串行执行报告生成。首先聚合各利用代理产出的证据文件,然后运行报告代理添加执行摘要与清理,最后注入模型元数据完成最终报告。
编排引擎核心:Temporal 工作流与活动设计
Shannon 选择 Temporal 作为底层编排引擎,这一决策带来了持久化执行、自动重试、状态查询等企业级特性。
工作流定义与状态管理
工作流核心定义在pentestPipelineWorkflow函数中,维护一个可查询的PipelineState状态对象,包含:
interface PipelineState {
status: 'running' | 'completed' | 'failed';
currentPhase: string | null;
currentAgent: string | null;
completedAgents: string[];
failedAgent: string | null;
error: string | null;
startTime: number;
agentMetrics: Record<string, AgentMetrics>;
summary: PipelineSummary | null;
}
通过setHandler(getProgress, ...)注册查询处理器,外部可通过 Temporal CLI 或 Web UI 实时获取工作流进度,包括当前阶段、已完成代理列表、各代理耗时与成本等指标。
活动 (Activity) 的精细化设计
每个代理执行被封装为独立的 Temporal Activity,具备以下工程特性:
心跳机制:每 2 秒发送一次心跳信号,防止长时间运行的 AI 代理调用被误判为死锁。生产环境配置 10 分钟心跳超时,测试环境 5 分钟。
Git 状态隔离:每次 Activity 执行前创建 Git checkpoint,成功后 commit,失败时 rollback。这确保了重试时工作区的干净状态,避免残留文件影响后续尝试。
错误分类与重试策略:
const PRODUCTION_RETRY = {
initialInterval: '5 minutes',
maximumInterval: '30 minutes',
backoffCoefficient: 2,
maximumAttempts: 50,
nonRetryableErrorTypes: [
'AuthenticationError', 'PermissionError', 'InvalidRequestError',
'RequestTooLargeError', 'ConfigurationError', 'InvalidTargetError',
'ExecutionLimitError',
],
};
系统将错误分为可重试 (计费错误、瞬态网络错误) 与不可重试 (认证失败、配置错误) 两类,避免在无法自愈的错误上浪费资源。输出验证错误单独限制为最多 3 次重试,因这类错误通常不会自行恢复。
防御性编程:针对 LLM API 的 spending cap 场景,系统在执行后校验 "回合数≤2 且成本为 $0" 的异常模式,结合正则匹配识别计费限制,主动触发重试而非返回虚假的成功结果。
并发控制与资源管理
Worker 配置maxConcurrentActivityTaskExecutions: 25,支持最多 25 个并发 Activity 执行。这一参数基于以下计算:5 个漏洞类型 × (1 个 vuln agent + 1 个 exploit agent) + 其他阶段 ≈ 12-15 个并发 Activity,预留余量支持多工作流并行。
每个 Activity 配置 2 小时执行超时,满足 LLM 代理长时间运行的需求。同时通过heartbeatTimeout确保卡死的 Activity 能被及时检测并重新调度。
可观测性与审计
Shannon 构建了完整的审计体系:
- 工作流级日志:通过
logPhaseTransition和logWorkflowComplete在活动边界记录阶段转换与完成摘要 - 代理级日志:每个代理的每次尝试 (attempt) 都记录开始时间、提示词、执行结果、成本、耗时、Git checkpoint 哈希
- 实时查询:通过 Temporal Query 机制,外部系统可实时拉取
PipelineProgress获取工作流 ID、已耗时、当前阶段等运行时信息 - Web UI:Temporal 自带的 Web UI (端口 8233) 提供可视化工作流执行轨迹、重试历史、状态变化时间线
工程实践建议
基于 Shannon 的实现,构建自主 AI 安全测试工作流时可参考以下参数与策略:
超时参数:
- Activity 执行超时:2 小时 (生产) / 10 分钟 (测试)
- 心跳超时:10 分钟 (生产) / 5 分钟 (测试)
- 心跳间隔:2 秒 (必须小于心跳超时)
重试策略:
- 初始间隔:5 分钟,最大间隔:30 分钟,退避系数:2
- 最大尝试次数:50 次 (生产) / 5 次 (测试)
- 输出验证错误单独限制 3 次
并发控制:
- Worker 并发 Activity 数:≥ (漏洞类型数 × 2 + 3) × 预期并行工作流数
- Shannon 配置 25 并发,支持约 5 个并行工作流
成本监控:
- 单次完整运行成本约 $50 (Claude 4.5 Sonnet),耗时 1-1.5 小时
- 通过
AgentMetrics实时追踪每个代理的 token 消耗与 API 成本 - 设置 spending cap 检测机制,避免静默失败
状态隔离:
- 每次 Activity 尝试前创建 Git checkpoint
- 失败后 rollback,成功后 commit
- 确保重试幂等性与工作区一致性
局限与注意事项
Shannon 的编排引擎设计针对白盒 (源码可用) Web 应用测试优化,当前版本明确排除了第三方库漏洞、配置错误等无法通过主动利用验证的问题类型。此外,LLM 可能产生幻觉,最终报告仍需人工验证其准确性与严重程度评估。
生产环境部署时需注意:Temporal 的持久化存储默认使用 SQLite (/home/temporal/temporal.db),高吞吐量场景建议切换至 PostgreSQL 或 MySQL 后端。
参考来源