AI 辅助漏洞挖掘:四种方法的实测与挫败我测试了四种AI辅助查找漏洞的方法,持续约一周。找到了真实的漏洞——20分钟内在一个目标中确认了14个漏洞。同时也浪费了时间在一种毫无成果的方法上。AI确实能找到漏洞——这是真的。但它找到的哪些漏洞真正具有实际影响?那就是另一回事了。我在这里分享的所有发现都是真实的漏洞、规范违反或确实错误的做法。但当真正尝试利用它们时,大多数都站不住脚。AI在覆盖范围、假设生成和代码分析方面很快。它在影响评估、验证以及识别真正可被利用的点上表现糟糕。每个模型都夸大了发现。研究人员的判断是区分噪音和CVE的关键。AI不能取代安全研究人员——它是一个能力放大器,而非替代品。注意: 我没有正式的AI/ML背景。这是我第一次严肃地使用AI进行漏洞研究。请谨慎看待这些结果——你的结果可能因目标选择、设置方式、提示词和整体方法而不同。我特意选择了些经过加固的目标,以观察AI在压力下的表现,这影响了数据。我的一些结论可能是错误的。这仅仅是我所尝试和观察到的。整个过程大约花了一周半。这里展示的漏洞只是示例,并非完整列表——由于披露未完成或可能暴露特定目标等原因,部分发现被省略。在约一周的时间里,我测试了四种不同的AI辅助查找漏洞的方法,并发现了真正的漏洞——有些甚至是高危的。我也在那些毫无产出的方法上浪费了数天。本文将如实剖析哪些方法有效、哪些无效,以及AI在这个工作流中的定位。一、方法一:黑盒RFC喷洒我利用AI帮助构建测试架设,指导它朝着研究方向前进,让其系统性地映射HTTP/1.0、HTTP/1.1、代理规范和HTTP/2之间存在的RFC空白、矛盾点以及“可/应”模糊之处。主要关注点是HTTP/1.1。AI识别了规范不一致之处——RFC 7230 与 RFC 9110 在 Content-Length 处理上的分歧(首次有效 vs 末次有效);某些规范版本中“必须拒绝”变成了“可忽略”;以及代理在哪些地方被允许表现宽松。从这些空白点出发,AI生成了载荷变体,我则在Docker实验环境中构建的23个后端服务器和代理矩阵中对它们进行了喷洒测试。结果: 跨23个后端服务器的55个发现,通过H1和H2→H1代理链进行测试。经过分类后:8个确认可利用(并提供端到端组合实验场景的PoC),11个路径遍历漏洞,4个逻辑漏洞,外加16台服务器和6个代理存在的古怪分块RFC违反。其中3个是误报,2个已被其他研究人员报告过。1. 已确认的漏洞所有可被利用的漏洞都遵循相同的模式:AI找到解析器之间的分歧,我再在Docker实验环境中搭建代理→后端链来证明它是端到端可利用的。通过 strtol(base=0) 实现的CL八进制解析。 一个后端的 Content-Length 解析器使用了带自动基数检测的 strtol 函数。CL:0400 被读作八进制的256,而不是十进制的400。代理将其读作十进制的400,并转发了400字节的请求体。后端只消耗了256字节——剩下的144字节成为一个走私的请求。通过在默认配置下的两个主要代理得到验证——无需启用宽松模式。复制POST / HTTP/1.1 Content-Length: 0400      ← 代理:十进制400。后端:八进制256。  [256字节填充]GET /smuggled HTTP/1.1 Host: target              ← 后端将这些剩余的144字节视为下一个请求纯LF分块帧。 一个后端接受纯 \n(没有 \r)作为分块行结束符。一个代理会转发纯LF分块。后端和代理在请求体边界上产生分歧——1个请求进去,2个响应出来。端到端验证。重复TE头(首次有效)。 两个TE头:TE:identity + TE:chunked。后端采用第一个(identity → 退回到CL)。一个转发两个头的代理使用了 chunked。请求体分帧产生分歧——通过一个代理验证了走私。多值TE被忽略。TE:gzip,chunked —— 后端没有把逗号分隔列表中的 chunked 识别出来,退回到CL。代理从这个列表中解析出了 chunked。相同的数据不同步模式,通过同一代理验证。头部名称含空格导致的头部截断。 一个后端遇到头部名称中包含空格时,会静默丢弃该头部之后的所有头部。放在畸形头部之后的 Content-Length 头消失了。请求体变成了一个走私的请求。在纯H1环境下是无效的——每个代理在默认配置下都会拒绝。通过一个主流代理文档中提及的宽松模式被复活:复制POST / HTTP/1.1 Host: target X -Forwarded: x          ← 空格终止了后端的头部解析 Content-Length: 43        ← 后端永远看不到这个头(被截断了)  GET /admin HTTP/1.1        ← 这43字节没有被消耗为请求体 Host: target              ← 后端将它们视为下一个请求代理对POST进行了ACL(访问控制列表)检查。后端处理了走私的访问 /admin 的GET请求。通过完整PoC演示了ACL绕过。NUL字节头部拆分。 一个后端在NUL字节处拆分头部。X-Foo\x00Content-Length: 50 变成两个独立的头部。在纯H1环境下无效——所有代理都拒绝头部中的NUL字节。通过H2降级(H2→H1)复活:一个H2→H1代理会在头部值中转发NUL字节。路径遍历漏洞(分布在3个后端的11个)。 反斜杠遍历(/public\..dmin → /admin),空字节截断(/admin%00.jpg → /admin),编码点遍历(/%2e%2e/admin → /admin),分号剥离(/public;/../admin → /admin),片段作为路径分隔符。这些漏洞可以通过任何代理使用——代理会转发URI路径,而不对这些模式进行规范化处理。ACL绕过的演示很简单。下划线到连字符的头部规范化。 两个后端在内部将头部名称中的  映射为 -。XForwarded_For → X-Forwarded-For。那些会剥离客户端 X-Forwarded-For 头的代理不会剥离 X_Forwarded_For。通过任何代理都可以绕过代理的XFF过滤器进行IP欺骗。块扩展内引号中的CRLF。 RFC不允许在块扩展内的引号字符串中出现CRLF。16台服务器和6个代理没有跟踪引号状态——块扩展引号值内的CRLF被当作真正的行结束符,攻击者提供的文本会被提升为尾部头部。已广泛报告,但由于块扩展在生态系统中未得到正确实现,大多数都采用相同处理方式,因此无法被有效利用。2. H2→H1降级测试我们还用约3600个测试用例(跨26个类别)测试了15个代理的H2→H1转换层。H2测试主要发现的是RFC违反——代理接受了它们本不该根据规范接受的东西,但实际上并未以可被利用的方式转发它们。主要价值在于复活了无效的H1漏洞:只有在具有与H1代理不同验证规则的H2代理中,才存在NUL字节头部拆分和纯CR/LF投送路径。一些假设是AI根据我们收集的研究材料生成的:空的DATA帧 → 零大小分块注入。 从H2规范材料中,AI推理出一个空的DATA帧(长度=0,无END_STREAM标记)在请求体中可能转化为 0\r\n\r\n —— 即分块编码的终止符——从而走私其后的所有内容。部分请求体后的RST_STREAM → 脏后端连接。 含有CL:1000的H2 POST请求,发送200字节,然后发送RST_STREAM。代理池化了这个后端连接,下一个受害者的请求会填充剩余的请求体。实际上,代理会干净地处理RST_STREAM,不会返回脏连接——这个方法没有成功。3. 问题所在AI没有发现任何一条可被利用的链条。是我发现的。AI找到了后端解析器漏洞并映射了哪些代理会转发什么。我连接了这些点——宽松的代理模式、触发每种行为的具体字节、端到端的链条。这就是模式:AI描绘表面,研究员构建利用链。它还会严重夸大结果。在最初的55个发现中,许多是纸上看起来合理但在测试中破裂的虚假链条。其中3个是完全的误报(重新测试时命中率为0)。模型会将一个载荷标记为“有效”,而实际上代理-后端组合永远不会因此发生数据不同步。我仍然不得不待在实验环境中验证每一个发现。它擅长映射RFC空白点、生成研究方向和寻找解析器漏洞。不擅长链接逻辑,也不擅长判断什么是真正可被利用的。可利用的链条来自手动工作。二、方法二:两个微调模型 + Opus大脑这是最复杂的设置。三层模型架构:一个320亿参数的“安全专家”模型,在约24000个训练对(CVE分析、攻击模式、规范空白、编码技巧)上进行了微调;一个140亿参数的“实现专家”模型,针对特定目标在代码追踪和边缘情况行为上进行了每次目标的微调;Opus作为协调器,决定向每个模型询问什么。目标:XML解析器。我定义了横跨11种语言生态系统的61种解析器。将所有攻击面知识整合到安全专家模型中。在约2800个载荷上测试了12种解析器。结果: 在12个解析器中确认了53个漏洞和147个可疑行为。零个可报告的。1. 发现的漏洞(无法利用)数据看起来令人印象深刻:12个解析器共200个发现。这些是真实的规范违反、真实的错误行为、真实的漏洞。但我用主要的下游项目 —— SAML库、签名验证器、文档处理器 —— 测试了它们,结果没有一个漏洞在实践中是可被利用的。每一个都需要一个在真实部署中不存在的特定前提条件。 一些它们无关紧要的例子:通过 constructor.prototype 进行的原型污染。 解析器清理了 proto 但没有清理构造器链。true 创建了一个污染工具。但利用需要下游应用程序将解析后的输出传递给像 _.merge 这样的深度合并工具 —— 而我检查过的使用这些解析器的主要项目并不这样做。数字字符引用透传。 XML §4.1规定 &#N; 必须被解析。多个解析器将它们作为字面字符串留下。