在传统代码审计流程中,依赖于静态扫描工具辅助审计漏洞,例如使用 Semgrep、CodeQL 等工具可以快速发现潜在漏洞模式,但这类工具仍然存在一个普遍问题:检测结果往往停留在规则匹配层面,缺乏上下文充分的分析能力,这导致安全人员仍然需要投入大量时间去追踪调用链、验证漏洞的真实性、以及判断漏洞可利用的价值。
当前AI Agent 技术的发展,在代码理解、跨函数分析以及复杂逻辑推理方面的能力越来越强,将 静态扫描工具 与 当前火热的 AI Skill技术结合,可以有效弥补传统代码审计带来的问题,通过让 AI 对扫描结果进行二次审计,并自动分析整个调用链,可以显著提升漏洞验证效率。
本文介绍一种 静态扫描工具 + AI Skill 实践方案用于演示验证:使用 Semgrep 进行初步漏洞扫描,再通过 AI Skill 对结果进行深入自主审计,并生成漏洞审计报告。
一、传统静态扫描的局限性
静态扫描工具通常通过规则匹配或数据流分析识别潜在漏洞,例如:
- SQL 注入
- 命令执行
- 文件包含
- 任意文件上传
- XSS 等
但在实际使用过程中,经常会遇到以下的问题:
1. 误报率较高
例如检测如下代码
$query = "SELECT * FROM users WHERE id=" . $_GET['id'];
工具会直接标记为 SQL 注入,但实际上可能存在
$id = intval($_GET['id']);
$query = "SELECT * FROM users WHERE id=" . $id;
这种情况下漏洞已经被修复,但扫描工具无法理解逻辑语义。
2. 无法完整理解调用链
很多漏洞并不在当前函数内,而是通过多层调用传递
Controller
↓
Service
↓
DAO
↓
数据库执行
传统扫描工具可能只定位到某个 sink,但无法完整展示:
- 参数来源
- 数据传播路径
- 是否经过安全处理
审计人员需要手动追踪代码。
3. 无法判断漏洞是否真实可利用
静态规则可能只看到 source 和 sink,从而产生误报
source → sanitize → sink
二、静态扫描 + AI Skill
静态扫描 + AI Skill 思路
这种方式核心为让静态工具负责"发现线索",让 AI 负责"理解代码"
Semgrep 扫描 (漏洞规则匹配)
│
│
↓
扫描结果解析提取 (JSON/SARIF)
│
│
AI Skill 审计
│
├─ 解析漏洞代码位置
├─ 提取相关函数代码
├─ 追踪完整调用链
├─ 判断是否存在安全过滤
└─ 生成漏洞分析报告
静态扫描 + AI Skill 审计流程
1. 解析扫描结果
Semgrep 可以输出 JSON 或 SARIF 格式,例如
{
"rule": "sql-injection",
"path": "login.php",
"start": {
"line": 82,
"col": 4,
"offset": 2459
},
"end": {
"line": 82,
"col": 53,
"offset": 2508
},
"extra": {
...
}
}
AI Skill 首先提取:
- 文件路径
- 代码位置
- 漏洞信息
2. 提取漏洞相关代码
根据扫描结果定位到具体代码,例如
function login() {
$user = $_POST['user'];
$pass = $_POST['pass'];
$sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
mysqli_query($conn, $sql);
}
AI Skill 会自动获取当前函数代码、上下文代码
3. 自动追踪调用链
如果漏洞发生在某个函数内部,例如
login(user, pass);
AI Skill 会继续查找:
- login() 的调用位置
- 参数来源
- 是否来自用户输入
最终构建类似如下调用链:
HTTP Request
↓
controller.php
↓
login()
↓
build_sql()
↓
mysqli_query()
4. 判断漏洞真实性
AI 根据整个调用链判断是否存在过滤或安全函数等其他数据处理,确保输入参数可被利用,例如:
- intval
- htmlspecialchars
- prepare
- escape
- 自定义过滤函数
5. 输出报告
最终 AI 会给出报告,示例如:
漏洞类型:SQL Injection
漏洞文件:login.php
漏洞函数:login()
调用链:
HTTP Request
→ controller.php
→ login()
→ mysqli_query()
参数来源:
$_POST['user']
$_POST['pass']
过滤情况:
未发现有效的参数过滤
漏洞结论:
该漏洞真实存在,可被利用
三、静态扫描 + AI Skill 实践
0. 实践预热
编写一个semgrep规则用于测试验证,该规则匹配 php fputs函数的使用

使用semgrep指定该规则扫描某款CMS源码,发现多个结果,可以看到有一处 admin\ebak\class\functions.php 中存在 fputs写入行为

该functions.php 下的 WriteFiletext_n就是使用fputs写入文件,该函数被多处引用

人工审计的情况下,这时候就需要人工定位所有的调用链,并逐步分析代码是否存在漏洞,比较费时,当前的 AI Agent都非常强大,可以自主的理解并审查相关代码,借助AI Agent进行进一步的审计工作。
1. 编写 SKILL
编写一个简单的SKILL demo,完成以下事项
- 运行Semgrep扫描
- 解析Semgrep结果
- 进行深入代码审计
- 构造漏洞验证请求
- 输出漏洞报告
主要要求就是根据Semgrep的扫描结果,自主寻找出所有的调用链,并进行审计验证,确保漏洞真实有效可复测,最终给出审计报告,skill demo 如下
name: code_security_audit
description: 使用 semgrep 进行代码安全审计
技能名称
代码安全审计(Semgrep + AI 深度分析)
技能目标
对目标代码仓库进行自动化安全审计。
审计流程分为两个阶段:
-
使用 Semgrep 进行静态扫描,发现潜在漏洞位置
-
基于 Semgrep 的扫描结果进行进一步代码审计,你需要寻找所有的调用链代码,并找出可能存在漏洞的调用链,并验证
最终输出漏洞分析报告,并提供分析、调用链、漏洞验证http数据包
第一阶段:运行 Semgrep 扫描
在代码仓库根目录执行 Semgrep 扫描:
semgrep scan --config p/security-audit path --json --output semgrep_result.json
--config 参数为指定规则目录或是指定具体规则
--json 输出json格式的文件
--output 输出的文件
path 为扫描目录,未填写则检测当前所在目录
获取所有扫描结果。
第二阶段:解析 Semgrep 结果
读取 semgrep_result.json。
对于每一条发现的问题,需要提取以下信息:
-
漏洞规则 ID
-
文件路径
-
代码行号
-
触发漏洞的代码片段
-
Semgrep 提供的漏洞说明
定位漏洞代码所在的函数或方法。
第三阶段:进行二次代码审计
基于 Semgrep 发现的位置,继续分析相关代码。
重点检查:
-
漏洞代码所在函数
-
参数来源
-
上层调用函数
-
Web 路由入口
尽可能还原完整调用链,例如:
HTTP请求
↓
路由函数
↓
控制器函数
↓
业务函数
↓
数据库操作或危险函数
需要判断:
-
用户输入是否可控
-
是否存在过滤或安全处理
-
是否使用安全 API(例如参数化 SQL)
如果确认漏洞可被利用,则标记为真实漏洞。
如果发现存在有效防护,则是忽略该结果。
第四阶段:构造漏洞验证请求
如果漏洞真实存在,需要构造一个用于验证漏洞的 HTTP 请求示例。
例如:
SQL 注入示例:
GET /user?id=1' OR '1'='1 HTTP/1.1
Host: http://target.com
命令注入示例:
POST /ping HTTP/1.1
Host: http://target.com
Content-Type: application/x-www-form-urlencoded
host=8.8.8.8;id
根据代码中的路由路径和参数名称生成验证请求。
第五阶段:输出漏洞报告
对于每一个确认存在的漏洞,输出以下信息:
漏洞类型
漏洞位置
文件路径 + 行号
漏洞代码
完整调用链
漏洞分析
说明用户输入如何到达危险函数,并解释漏洞产生原因
漏洞验证请求
提供完整 HTTP 请求示例
最终结果需要保存为markdown文件,文件格式为 代码审计报告_xxxxx(日期时间).md
审计原则
-
仅报告具有真实利用可能性的漏洞
-
避免仅基于规则匹配的误报
-
优先分析用户输入到危险函数的完整数据流
-
重点关注 Web 输入、数据库操作、命令执行、文件操作等安全敏感点
2. Claude审计
将skill存储在项目目录 .claude\skills\code_security_audit\SKILL.md
运行claude,并下发命令,等待claude进行审计

最终审计完成,输出 3 个漏洞,并输出了漏洞报告

3. 漏洞报告
输出报告如下:

每个漏洞都有输出详细的调用链及漏洞分析

并根据审计结果提供了漏洞验证HTTP数据包:

4. 漏洞验证
漏洞审计的效果很好,以下例举漏洞1。
审计报告提供的漏洞验证如下:

漏洞1报告结果中的数据包,mypath为上传路径,tablenamep[]为代码注入参数,使用管理员cookie,发送该数据包

使用蚁剑直接连接,成功连接该webshell

可以看看该请求写入的config.php内容,tablename[] 参数会同时在两处写入内容,完全由AI自主分析并提供了一个合理的注入方式,确保两处注入代码的情况下能够正常运行的情况下,提供了一个可直接用于验证的HTTP数据包。

四、与AI SKILL自主审计的区别
静态扫描工具+AI SKILL 和 AI SKILL自主审计 效果上存在一定区别,静态扫描+AI Skill能确保结果的稳定性,AI Skill 自主审计能覆盖静态扫描规则无法覆盖到的漏洞范围
| 维度 | 静态扫描 + AI Skill | AI Skill 自主审计 |
|---|---|---|
| 漏洞发现方式 | 规则驱动 | AI 自主分析 |
| 是否依赖规则 | 是 | 否 |
| 扫描速度 | 快 | 较慢 |
| 误报率 | 中等 | 不稳定 |
| 逻辑漏洞检测 | 较弱 | 较强 |
| 覆盖率 | 高 | 不确定 |
| 成本 | 低 | 高 |
在实际AI安全审计中,两种方式并不是互斥关系,而是可以结合使用,这种方式可以实现 效率 + 深度 兼顾审计。
| 静态扫描 + AI Skill |
|---|
| 静态扫描使用 Semgrep / CodeQL 等工具扫描代码快速发现大量潜在漏洞 |
| AI 调用链分析AI 根据扫描结果定位代码自动追踪完整调用链 |
| 漏洞验证AI 分析参数来源判断是否存在过滤或安全处理过滤误报 |
| 最终结果高效验证规则扫描结果降低误报率 |
五、总结
从当前实践效果来看,"静态扫描工具 + AI Skill 审计" 是一种非常高效且稳定的方案。静态扫描工具可以快速扫描整个代码仓库,通过规则匹配发现大量潜在漏洞线索,而 AI 则可以在此基础上进行深入分析,例如自动提取相关函数、追踪完整调用链、判断是否存在安全过滤,从而有效降低误报率,提高漏洞验证效率。
完全 AI Skill 自主审计 可通过直接分析代码结构和业务逻辑,会发现一些规则难以覆盖的漏洞类型,例如权限绕过、业务逻辑缺陷以及复杂的数据流问题,这种方式更接近人工代码审计的思路。
综合来看,当前这两种方式并不是相互替代的关系,而是可以形成互补。静态扫描工具在覆盖率和效率方面具有明显优势,而 AI 在代码理解和逻辑分析方面更具潜力,将两者结合,可以在保证扫描效率的同时提升漏洞分析深度,从而获得更好的审计效果。