跳到主要内容

代码审计:IRify 的 AI 化扩展与 PoC 自动生成

· 阅读需 10 分钟
Yak Project
网络安全垂直语言团队

随着 Memfit AI 新功能的扩展和相关机制的完善,我们已经可以将现有的 AI 功能扩展到我们的其他产品中,本文主要介绍目前我们在 IRify 工具的 AI 化扩展中做出的新尝试。

纯AI代码审计

在 Yaklang 的AI ReAct体系里,“代码安全审计”被注册为一个独立的循环类型。用户触发后,运行时会先构造一份贯穿全程的审计状态对象,并把 AI 工作目录记下来,所有阶段性产物都收敛到该目录下的审计子目录里,避免和别的任务混杂

目前在 IRify 中有两个入口:

1.在项目编译的右下角选择:进行AI审计(前端需要更新,后续版本会修复)

2.在 AI Agent 页面选择专注模式:代码安全审计

审计状态贯穿四个阶段,记录项目名称与路径、技术栈与入口点摘要、侦察报告路径与笔记文件列表、扫描阶段的结构化发现列表、各类别扫描的观察与不确定线索、验证阶段的确认与排除结论、以及最终报告内容与路径。

接下来我们就使用 Yaklang 的内置靶场进行测试。

第一阶段:项目探索

主编排器并不亲自完成目录巡视,而是创建一个“目录探索”类的子循环,把侦察笔记的预期输出路径和探索工作目录通过变量传进去,然后用独立的子任务执行该循环。

在探索过程中,程序会先阅读 go.mod 读取依赖,然后利用各种内置工具获取项目结构。

探索结束后,主编排器从子循环的命名变量里回收结果:真实项目路径与名称、技术栈描述、入口点摘要、汇总侦察报告文件路径、以及探索过程中通过写文件产生的笔记路径列表等,并写回共享审计状态。

第二阶段:扫描计划加按类别串行的双阶段审计

第二阶段本身又分为两层:外层的类别编排与内层单个类别的 ReAct 扫描。

外层首先用一次偏“快”的模型调用,让 AI 在结构化输出中确定本次要扫哪些默认漏洞类别、用户是否额外指定了自定义类别(带关键词与补充说明)。若这次规划失败,则退回内置默认类别全集,保证流程不中断。

每一个漏洞类别采用两段式策略:

  • 第一段是关键词搜索阶段:模型根据该类别的 Sink 语义提示和技术栈,自行决定 grep 策略,强调用“仅返回匹配文件”的模式避免结果被截断遗漏;每搜一轮就把命中文件的绝对路径通过专用动作合并进待审计列表,并可继续多轮搜索。
  • 第二段是逐文件审计阶段:对上一段锁定的每个文件依次读取内容,若确认存在问题则提交结构化 finding,其中对置信度有下限要求,过低会被拒绝以抑制随手报漏洞。

上图为关键词搜索第一段的截图,程序先找到了vul_cmdi.go 等明显包含漏洞示例的高风险文件,然后进入第二段逐行搜索。

通过工具阅读可能有问题的代码片段,交给AI完成进行审计。

第三阶段:逐条验证与证据记录

验证阶段的专用动作主要包括几类:

1.沿数据流逐步记录追踪节点,把步骤、变量、位置、推断来源类型等记进时间线

2.记录认为的过滤或校验及有效性判断

3.对某个 finding 给出最终结论,只能从确认、排除、需人工确认三种状态里选,并附带置信度与理由,可选地精炼数据流、利用方式与修复建议

4.再次读取侦察背景报告

5.当全部 finding 都有了结论后调用完成验证并退出本阶段

第四阶段:报告生成与兜底

系统创建“报告生成”类的子循环,把最终 Markdown 报告路径、写作任务说明、以及必须阅读的参考文件列表注入子循环变量,由专门写长文的循环读入这些数据并写入磁盘。

基于风险的代码审计

除了纯AI的代码审计以外,IRify 还支持利用现有的风险信息进行代码审计。对于这种精确又轻量级的功能我们选择使用 forge 实现。

例如我们已经对某个项目完成了扫描,得到了如下的风险信息:

现在我们想对序号为1的高危风险 “检测到Golang服务器端模板注入漏洞” 进行AI审计,就可以在 AI Agent 的工具库中搜索ssa-risk找到目标,点击后在弹窗页面输入风险序号:1

执行完成后AI会返回一个简单的漏洞解析报告。

风险智能生成Poc样例

目前 IRify 中内置了 python 和 yak 这两种语言的代码构造器,可以生成没有语法错误的正确代码,结合对风险的代码审计功能(工具库中的ssa-risk),即可直接根据风险生成Poc样例。

在已有静态分析风险结果的前提下,用多步推理把「风险元数据 + 源码/片段上下文 + 漏洞类型」转成「能拿去授权环境里做验证的概念验证脚本」。在技能库中搜索“根据SSA Risk智能生成Poc”,点击后在弹窗配置需要审计的风险序列号后即可开始生成Poc样例。

程序会先运行一次ssa-risk审计风险相关内容,之后程序会从如下几个方向进行思考:

1.判断源码能不能跟

看关联项目是不是内存编译、有没有源码:能跟就继续用 listing/grep/read 补全路由和调用链;不能跟就主要依赖 Risk 里自带的代码片段。

2.补上下文(可选)

在可读源码时,按需列目录、搜路由/配置、读关键文件,把「真实入口、方法、参数、鉴权」抠出来。

3.分类 + 攻击面分析

把风险归到 SQLi/XSS/SSRF 等具体利用思路,对齐数据流,定 Poc 技术路线(这一步侧重分析,不要求先写长文)。

4.找 Poc 模板

用模板检索工具按漏洞类型拿 Python 侧的请求构造、解析结果等骨架,减少AI幻觉。

下面图片中展示了程序判断目标项目是否可达和进行数据流分析的过程:

本系统支持在参数target_base_url中配置目标项目的真实运行环境地址(如http://your-app:8080),系统将自动执行智能化安全分析验证流程,最终会生成报告和Poc样例代码:

Syntaxflow规则美化

这里的「美化」主要指把一份.sf 规则文本按统一规范重新排版输出:缩进、换行、desc / alert 与规则体的结构会更整齐;在带选项时还可以补全或规范化元数据(例如规则 ID、描述里要求的字段等)。

目前 Syntaxflow 规则美化有两个入口:新建规则右上角,代码审计的规则编写页面右上角。

需要注意的是:在美化开始之前需要保证当前的规则没有语法错误,因为我们会在美化开始前后结束后各运行一次 Syntaxflow 语法检测以保证美化本身不会破坏规则的语法。并且规则美化采用了严格元数据替换逻辑,不用担心会破坏规则本身的内容。

Syntaxflow 规则自动生成

该功能会在内置规则样例知识包上做检索,再结合单文件编辑工具链和 SyntaxFlow 编译校验,迭代写出合法的 .sf文件

在AI Agent页面选择专注模式:write_syntaxflow_rule

系统行为:抽取样例(语言/虚拟文件名/代码正文)并保存 → 生成规则时把样例作为 UNSAFE 正例测试块嵌入规则末尾 → 生成后必须用语法/样例命中校验做自检,不通过就迭代修改直到通过。

1.知识检索

  • 压缩包检索:在 syntaxflow-aikb 里按模式搜命中片段(带上下文)。

  • 向量检索(有则启用):用多句完整问句查 syntaxflow-aikb-rag,结果去重并 重排(更偏向带可执行规则特征的内容,弱化纯长文说明)。

2.知识压缩

  • 把 grep + RAG 拼起来的原始结果往往很大,会先合并成一大段文本,再调用 面向当前需求与搜索条件的压缩(按实现里约 10KB 量级 的目标压一版)。

3.落盘与钉文件

  • 有漏洞样例会先写成临时样例文件;然后要么打开用户指定的 .sf,要么新建一个空.sf 生成稿,并把路径固定为后续编辑目标。

4.多轮写改 + 校验

  • 模型用写/改规则等动作维护规则正文;每次改动会走 SyntaxFlow 语法与格式诊断(有误则阻断继续乱改)。若带了样例,还会用 check-syntaxflow-syntax 做正例自检,直到规则在样例上能按预期命中。

使用方法直接输入一段漏洞样例代码,它就会自动完成 Syntaxflow 规则并且进行语法检测和可用性检查,最后会进行规则打分。

可以在文件树中找到生成的 Syntaxflow 规则。

未来的扩展

现有的 AI 代码审计仍然有许多代码难点没有攻克,受到模型质量和上下文限制的影响,AI 审计在面对大项目时表现不佳,核心问题就是稳定性太低,多少审计很难输出相同的结果。我们正在尝试用稳定的代码扫描风险产物来为不稳定的纯 AI 代码审计补充支撑。

IRify 代表了代码安全审计向智能化、自动化、精准化发展的趋势。通过 Yaklang 的 AI ReAct 体系,将人类专家的经验模式与 AI 的快速分析能力相结合,构建了新一代安全分析平台的核心能力。系统将持续优化在复杂项目、多语言支持、云原生环境等场景下的表现,为软件安全开发生命周期提供更全面的智能支持。


本文首发于 Yak Project 公众号,阅读原文