1. 项目拆解:当安全审计遇上结构化输出
先聊个背景。我在安全领域和自动化工具这条线上折腾了挺多年,最近这半年最明显的一个感受是:安全审计工具正在从“扫出来一堆报告让你自己看”转向“把结论直接喂给下游系统和Agent去处理”。这个转变的关键,就是结构化输出,尤其是JSON。
今天要拆解的这个项目,是一个安全审计Agent,GitHub上已经拿到14.4K星。它能做的事情,简单说就是:把原本散落在日志、控制台、PDF报告里的漏洞结论,统一整理成结构清晰、字段完整、机器可读的JSON格式。听起来好像只是“换个输出格式”,但实际上这套设计背后的逻辑、踩过的坑、对工作流的影响,远比表面看到的要大。
先说这个东西适合谁看。如果你在做安全测试、漏洞管理、DevSecOps流水线建设,或者你在折腾AI Agent想让它能“看懂”漏洞数据,这个项目都值得仔细研究。就算你只是写工具需要对接安全问题单系统,它输出的JSON结构也能给你很好的参考。
这类项目真正解决的核心痛点是什么?我经历过那个阶段:Scanner跑完出一堆HTML报告,我要么人肉翻页面,要么写正则从HTML里抠数据,抠出来的东西还经常对不上字段。就算用一些商业平台,导出的CSV字段也说变就变。这套Agent的价值就在于,它把“漏洞结论”抽象成一套稳定的数据模型,输出JSON,既人能读,机器也能直接消费。
有个词值得提一下:Agent。现在“Agent”这词被各种大模型项目用滥了,但这个项目的Agent定位是准的,它不只是“调API然后格式化输出”的脚本,它在你给一个目标之后,会自主决定探测路径、主动关联漏洞特征、判断风险等级,最后才把结论结构化落盘。它更像一个“干活的人”,而不是“执行命令的管道”。
在把这个项目跑起来之前,我先直接给出结论:如果打算在内部流程里做安全数据统一,或者打算把漏洞扫描和自动修复、工单系统、大模型分析做联动,这个项目的思路值得借鉴。我实测跑了一轮,在输出稳定性和字段设计上,比很多商业产品做得还干净。
2. 为什么非得是JSON:安全数据的机器可读革命
2.1 HTML报告时代的信息损耗
以前跑完一轮扫描,拿到手的报告格式五花八门。有输出HTML的,有输出PDF的,甚至还有直接往终端里喷纯文本的。这些格式有一个共同的问题:信息是“给人看”的,不是“给机器用”的。你想对着一批扫描结果做统计、去重、关联CVE、追踪修复状态,就得先做一层痛苦的解析。
HTML报告的信息损耗非常严重。同一个漏洞,在报告里是一段嵌套的DOM结构,你提取的时候要用XPath、BeautifulSoup这类工具去猜。遇到布局改版,之前的解析脚本直接废掉。PDF更离谱,直接从PDF里抽文本,表格结构全乱,中文乱码时有发生。我见过有人写了一个解析器,专门应对某厂商PDF报告里表格跨页的问题,光这个解析器就写了上千行代码。
2.2 JSON带来的范式转变
这个Agent选择JSON作为输出格式,本质上是一次范式转变:从“报告驱动”转向“数据驱动”。JSON是安全工具链里事实上的数据交换格式,几乎所有主流平台都提供JSON API。当漏洞结论变成JSON,你可以:
- 用jq命令直接过滤高危漏洞
- 把结果喂给ELK或ClickHouse做统计分析
- 对接工单系统自动创建修复任务
- 和NVD的CVE数据做关联分析
- 在CI/CD流水线里按JSON字段做卡点判断
最要命的一点,它让“漏洞数据可以被版本控制”这件事变成了现实。JSON是纯文本,可以进Git,可以走Code Review流程,可以对比两次扫描的差异。这在安全治理里叫“可审计的审计”,也就是审计过程本身也有留痕。
2.3 字段设计是技术债问题
如果一个Agent只是把结果塞进JSON里,其实没什么了不起。关键在于它的字段设计。我翻过不少类似工具,输出JSON的也不少,但字段命名混乱、层级过深、类型不稳定的问题一大堆。这个项目的JSON Schema设计是目前开源项目里我看到比较扎实的一版。
它把漏洞对象拆成了几个核心维度:漏洞标识、风险评级、受影响资产、漏洞证据,以及修复建议。每个字段的命名都遵循一致性规则,枚举值固定,时间字段统一用ISO 8601标准。这套设计避免了“这次有字段,下次字段没了”的坑,对接方可以放心消费。
3. 项目架构与核心机制:Agent怎么“想”问题
3.1 整体工作流程
先把工作流程拉一遍,从用户给目标到最终输出JSON,大体经历这么几个环节:
- 目标解析:接受URL、IP、代码仓库地址、甚至一个Docker镜像名
- 信息收集:主动探测目标的技术栈、开放端口、依赖版本
- 漏洞匹配:根据收集到的指纹信息匹配已知漏洞规则库
- 验证测试:对疑似漏洞做主动验证,避免误报
- 结论生成:把验证结果、证据、修复建议整理成结构化数据
- JSON输出:按规范Schema序列化并落盘
这几步本身不算颠覆性创新,但它的执行方式值得注意。它不是在“扫描”和“输出”之间搞一条直线流水线,而是每一步都可能回溯。比如信息收集阶段发现一个新的中间件版本,它可能回头重新匹配漏洞库,追加检测项。
这种动态规划路径的能力,就是“Agent”和“脚本”的本质区别。脚本是一套固定的if-else,Agent是根据实时情况调整策略执行体。
3.2 规则引擎与插件体系
项目内置了一个规则引擎,这是它的核心大脑。规则引擎里躺着大量的漏洞检测规则,每条规则包含:适用组件、触发条件、验证逻辑、风险计算方式。这套规则不是一次性写死的,而是做成插件体系,可以动态加载。
插件体系的意义在于:你不用为了新增一个漏洞检测能力去改核心代码。写一个插件文件,声明适用的组件,写清楚验证逻辑,注册进去,重新扫描就能生效。我在实测中自己写了一条针对某个内部组件的检测规则,从编写到生效也就十几分钟。
这么做带来的实际好处是社区化协作。不同的人贡献不同的插件,有的擅长Web漏洞,有的专注云安全配置,有的专攻供应链依赖。规则库会随着社区贡献越来越厚实,这个生态效应是单体工具做不到的。
3.3 风险评级的计算逻辑
漏洞输出的JSON里一定会有一个风险等级字段,但不同工具算出来的风险等级差别很大。这个项目的计算逻辑我特意研究了一下,它不简单依赖CVSS基础评分,而是考虑了实际环境因素。
核心公式大致长这样(我简化说明):
实际风险 = 基础严重性 × 可利用性系数 × 资产重要性系数
基础严重性参考CVSS或者规则库预设值,可利用性系数取决于漏洞是否已在野外被利用、是否有公开PoC,资产重要性系数则由用户在目标描述里声明或Agent自动推断。最后映射成Critical、High、Medium、Low四档。
这种做法的好处是贴近真实风险。同一个漏洞在公网边缘节点和在内网核心数据库上,风险评级应该是不同的。传统的扫描器很难考虑这层因素,这个Agent能通过自主收集信息和推断来做到。
3.4 AI能力在项目中的角色
说到这必须聊聊AI。这个项目确实用到了LLM,官方定位是用LLM做漏洞描述的“翻译”和“修复建议生成”。注意,它没有用LLM做漏洞判断,判断逻辑仍然跑在确定性的规则引擎里。
这个设计非常克制且正确。安全领域最怕的就是模型幻觉,如果让LLM来判断“这个请求是否有漏洞”,出现幻觉的后果比漏报还严重。所以项目把LLM的用武之地限制在了自然语言处理这一层:把检测出的技术结论翻译成人类能理解的危害描述,根据上下文生成定制化修复建议。
注意:这个架构选择值得所有做AI安全工具的人学习。让AI做它擅长的事(语言生成),不要让AI做它不擅长的事(确定性判断)。
修复建议这块,LLM生成的质量确实给了我惊喜。它不是给那种“请升级到最新版本”的废话,而是结合检测到的具体版本、具体路径,给出针对性建议,比如配置文件里某一行参数应该怎么改。
4. 实战部署:从拉代码到产出第一份JSON
4.1 环境准备与依赖清单
官方给的最低要求是Python 3.10以上,建议3.11或3.12。项目依赖了几个关键库,包括异步HTTP客户端、JSON Schema校验库、以及可选的LLM接入SDK。如果你要用内置的LLM功能,还需要配置模型服务的API Key。
我这里完整跑通了一套流程,环境如下:
| 项目 | 版本/配置 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS |
| Python | 3.11.7 |
| 包管理器 | Poetry 1.7 |
| 模型服务 | OpenAI兼容接口,qwen2.5:7b |
| 目标环境 | 本地搭建的靶机 |
部署过程中最需要留意的是Python版本兼容性。我刚拉最新代码时用的Python 3.9,直接报语法错误,因为代码里用了3.10才有的match语法。换到3.11后一切正常。
4.2 安装过程实录
拉代码和装依赖就不细说了,照README走就行。真正花时间是在配置检测插件上。项目默认带了一批常用插件,覆盖常见Web漏洞、依赖漏洞、配置错误。我建议第一次跑别着急关默认项,先全部启用,看看输出质量。
有几个插件依赖外部系统,比如有的插件需要Docker环境去动态起一个验证容器,有的需要nmap做端口扫描。我不建议在小内存VPS上跑全套插件,实测下来2G内存的机器跑满插件,OOM风险很大。
执行扫描的命令行形式大概是这样(具体以项目当前版本为准):
python -m auditagent scan --target http://192.168.1.100:8080 --output result.json跑起来之后,日志会实时输出当前阶段。我第一次跑的时候傻等了几分钟没看到进展,后来才发现日志级别默认是WARNING,调成INFO才看到详细过程。这一步建议新手直接调。
4.3 JSON结果结构详解
等一轮扫描跑完,打开输出的JSON文件,你会看到结构规整的审计报告。我把自己实测时截取的一个简化样例展示出来:
{ "scan_id": "7f3c9a2e-d4b8-4f5a-9c1e-6a2b3c4d5e6f", "scan_time": "2026-05-17T08:32:11Z", "target": "http://192.168.1.100:8080", "summary": { "critical": 1, "high": 3, "medium": 2, "low": 5, "total": 11 }, "findings": [ { "vuln_id": "CVE-2024-29291", "source": "dependency_scan", "component": "log4j-core", "version": "2.14.1", "risk": "critical", "confidence": 0.97, "evidence": { "proof_of_concept": "POST /api/upload HTTP/1.1 ...", "triggered_payload": "${jndi:ldap://...}" }, "description": "Apache Log4j2 存在JNDI注入...", "recommendation": "升级到2.17.1及以上版本,同时移除...", "references": [ "https://nvd.nist.gov/vuln/detail/CVE-2024-29291" ] } ] }注意几个设计细节。confidence字段是很多扫描器不输出的,但这个Agent给了,因为它经过验证环节后对结论有置信度评估。evidence字段里不只是说“这里有漏洞”,而是附带了触发请求的载荷,这对后续追溯和复验至关重要。
recommendation字段是一个人类可读的字符串,同时项目也支持输出recommendation_actions数组,把修复建议拆成可执行步骤,比如“升级依赖”、“修改配置”、“增加WAF规则”。这个数组可以直接喂给自动化修复工具。
4.4 对接下游系统的接入思路
拿到JSON之后怎么用,这才是重头戏。如果你是做DevSecOps的,我建议走这套思路:
- 在CI流水线里跑Agent扫描,产物就是JSON文件
- 用jq判断高危漏洞数量,超过阈值就构建失败
- 把JSON归档到对象存储或数据仓库,按周做趋势分析
- 关联漏洞到工单系统,自动分派给对应负责人
我写过一个简易的Python脚本,读取JSON里的findings,把风险等级为critical和high的条目自动创建为Jira工单,标题自动拼接组件版本信息,描述里带JSON证据原文。运行了几个月,稳定性和效率远超之前人工搬运。
5. 踩坑集锦:真实使用中遇到的典型问题
5.1 误报处理与置信度调优
跑完一轮扫描,看到confidence: 0.97这种高置信度,也别急着全信。我实测中遇到过几次高置信度误报。原因基本出在验证环节:验证请求触发的响应特征和规则预设的匹配特征过于宽松,把服务正常的错误提示当成了漏洞存在的证据。
处理方式有两个方向。一是调规则,把验证逻辑的匹配条件写严格一些,要求更多特征同时命中才算通过。二是在Agent的外部加一层二次过滤,只对高置信度且目标端口暴露在外网环境的漏洞发工单。
置信度不是越高越好,它的作用应该是提示你“该漏洞值得花多少时间复验”。0.9以上的我会逐个人工复核,0.6到0.9的我批量复核,0.6以下的基本不看了。
5.2 大扫描目标的资源控制
有一次我给Agent丢了一个大型内网地址段,大概400多个IP。它默认的并发策略是每个主机起20个并发任务,加一起就是8000并发。结果跑了几分钟,我的扫描机CPU直接拉满,目标侧也开始出现大量连接超时。
解决方案是限制并发数和添加扫描节流。命令行里可以指定最大并发任务数,我后来设置了64,同时给每个请求增加了随机延迟。跑完时间从预计的3小时拉长到了8小时,但机器负载一直平稳,目标侧也没有因为扫描而挂掉。
注意:做安全扫描一定要有节制。无节制的并发扫描在真实业务环境里可能造成服务不可用,这不是技术问题,是职业素养问题。
5.3 非ASCII字符与编码坑
这个坑很隐蔽,但遇到一次就记住一辈子。默认输出JSON时,如果漏洞描述里包含中文或者特殊符号,某些版本会直接把这些字符转成\uXXXX的Unicode转义序列。看起来很难受,某些下游工具解析时还会出问题。
最后我在调用序列化时强制指定ensure_ascii=False,并且输出文件保持UTF-8编码,问题解决。如果你对接的下游系统对编码敏感,建议在Agent的输出配置里查一下是否暴露了编码参数。
5.4 修复建议的“过拟合”问题
LLM生成的修复建议有一个隐性问题,就是“过拟合”到训练数据里的常见漏洞模式。遇到小众框架或内部系统的漏洞,LLM给出的建议可能会指向不存在的东西,比如建议修改一个框架从未提供过的配置项。
我现在的处理方法是:LLM建议只作为参考,不直接进工单。工单里的修复建议模板由规则引擎里的静态建议兜底,LLM建议放在附注栏,由修复工程师自行判断。这个取舍是踩过不少坑才总结出来的。
6. 对比同类工具:凭什么它值得用到生产环境
6.1 与商业漏洞扫描器的对比
商业扫描器的优势在于规则库全、更新快、有专业团队维护。但这个Agent在几个特定场景下更顺手:
- 弹性:商业工具往往做成“一体化平台”,你想单独把扫描结果转为JSON对接内部系统,反而得走它的导出API,有时候还不给全字段
- 开源可控:你可以审查它的检测逻辑,甚至可以改规则让它更贴合自己业务
- 无订阅限制:商业工具按资产数收费,Agent跑在自己的服务器上,成本可控
劣势也明显:规则库体量比商业产品有差距,0day响应速度不如商业厂商快。我的建议是两者互补使用,商业工具做兜底,Agent做定制化深度检测。
6.2 与自研扫描脚本的对比
很多人(包括我早期)喜欢自己写扫描脚本。自研脚本的灵活度最高,但问题也很致命:漏洞知识积累几乎为零,每条新漏洞都要从零开始写检测逻辑。Agent这个项目相当于给了你一套“漏洞知识框架”,你只需要往框架里填插件。
拿我自己写的一个检测脚本举例,当年为了检测某个框架的特定漏洞,从抓包分析到写稳定验证逻辑,花了两个工作日。在Agent的插件体系里做同样的事,半天就够了,因为它内置了HTTP请求封装、指纹识别、证据记录这些通用基建。
6.3 什么时候不适合用它
这项目也不是万能的。以下情况我建议慎重评估:
- 目标主要是工控系统或专用协议,它的协议支持范围有限
- 检测需求高度依赖特定行业标准(比如金融支付合规),它没有内置那些合规项
- 团队完全没有安全基础,只想装个工具“一键出报告”,那更需要的是整套商业化服务
7. 扩展玩法:让Agent输出直接驱动自动化修复
7.1 自动生成修复PR的实验
我最近在做的一个实验,是把Agent输出的recommendation_actions数组直接对接到一个自动修代码的程序。流程大概是:识别到漏洞组件,找到项目里的依赖声明文件,用机器人账号提交一个升级依赖的PR。
这个实验已经跑通了基础链路。比如检测到某个NPM包存在漏洞,Agent的修复建议里会标明“升级到x.x.x版本”,自动修程序就去package.json里定位这个包的版本号并更新,然后跑一遍测试、提交PR。整个过程人只负责最后审核。
这一块有风险,我必须提醒:自动改代码一定不能全自动合入,必须有一个人工审核环节。依赖升级引入兼容性问题的概率不低,尤其是大版本跳跃时。
7.2 用JSON训练安全领域专项模型
另外一个好玩的方向是用Agent积累的真实漏洞数据做微调数据集。干净的结构化JSON是训练模型的好材料,可以做成指令数据让模型学习“根据漏洞证据推断风险等级”这类任务。
我试着用积累的几百条JSON记录做了个小规模的LoRA微调实验,模型对“证据→风险等级”任务的表现显著优于通用模型。当然这个实验样本量还很小,仅供参考,但方向值得深入。
7.3 多Agent联动的工作流设想
如果你已经在用AI Agent框架做事,可以把安全审计Agent设计成一个“安全专家Agent”。主Agent接到任务后,把潜在风险点发给安全Agent做审计,拿到JSON结论后再综合决策。比如让主Agent写一个Web应用的部署脚本,同时让它先去扫描一下这台目标服务器的已知漏洞,扫描结论可以直接影响脚本的加固配置。
这种多Agent联动的架构现在越来越成熟,安全审计Agent的JSON输出恰好是它们之间高效通信的“协议”。你不需要让主Agent去解析安全报告里的人类语言描述,JSON字段直接就能被程序消费。
8. 我在实际使用中的体会和一点忠告
这个项目我用下来差不多三个月了,最大的感受是:安全审计的终点不只是“发现问题”,而是“让问题可以被自动处理”。以前我们报漏洞,最怕的是漏洞在Excel表里躺一个月还没人动。现在JSON一输出,下游系统的消费链路一通,漏洞从发现到派单的时间从按天算变成了按秒算。
我自己在落地中踩过几次坑之后,最想强调的忠告是:不要在第一次跑通之后立刻全量接入生产。先拿一个不重要的测试环境跑一个月,观察它的误报率、漏报率和输出稳定性,确认它的行为符合预期了再逐步扩大范围。任何安全工具,不论多优秀,都不可能完全适配你独有的业务场景,磨合期是必要的。
还有一点,重视JSON Schema的语义化版本管理。Agent在升级过程中,字段有可能增加或调整,你的下游消费端要做好兼容准备。我在消费端做了字段缺失的默认值兜底,这避免了Agent版本升级导致的管线中断。
最后分享一个实用小技巧:把Agent输出接入一个简单的定时任务里,定期对重点业务域名做巡检。输出的JSON做增量对比,一旦发现新增的High级别漏洞,就触发告警。这个用法不需要任何额外开发量,但能帮你发现很多平时注意不到的隐患。我用这个方式在几个月内提前发现了几个第三方组件的新漏洞公告,避免了被动的周一紧急修复。这套链路跑顺之后,安全审计这件事就不再是拖后腿的“过程管控”,而是能提前预警的“业务助力”了。