news 2026/4/3 14:10:14

红队实战:用 CodeQL + LLM 打造“自动代码审计机”,我在 GitHub 热门项目里挖到了 3 个 0-day

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
红队实战:用 CodeQL + LLM 打造“自动代码审计机”,我在 GitHub 热门项目里挖到了 3 个 0-day

标签:#CodeQL #LLM #RedTeam #0Day #AutomatedAudit #CyberSecurity


🩸 前言:告别“误报地狱”

每一个做过源码审计的人都知道,使用传统工具扫描时,最痛苦的不是没漏洞,而是99% 的误报
工具告诉你:“这里有个 SQL 注入!”
你一看代码:log.info("User query: " + input)
——这只是打印日志,根本没进数据库。

CodeQL 的强大在于它支持“污点追踪 (Taint Tracking)”:它能确认数据是否真的从Source(入口)流到了Sink(危险函数)。
LLM 的强大在于它懂“语义”:它能看懂代码里是否有if (isAdmin)这种鉴权逻辑,或者sanitize(input)这种过滤函数是否有效。

把两者结合,就是降维打击。


⚙️ 一、 架构设计:审计机是如何工作的?

我们将整个流程自动化,由 Python 脚本串联。

自动化流水线 (Mermaid):

输出原始结果 (SARIF)

Prompt: 这段代码有漏洞吗?

False Positive (误报)

True Positive (实锤)

1. 目标锁定: GitHub Top 1000 Java/Go 项目
2. 自动拉取源码
3. 编译并建立 CodeQL 数据库
4. 运行 CodeQL 污点追踪查询
5. Python 解析器: 提取 Source/Sink 代码片段
6. LLM 大脑 (GPT-4) 分析

丢弃

7. 生成 PoC 建议 & 告警

🔍 二、 第一步:CodeQL 建模(寻找嫌疑人)

CodeQL 将代码视为数据。我们需要编写 QL 脚本来寻找“潜在的罪犯”。
JDBC SQL 注入为例,我们不仅要找Statement.execute,还要找数据是不是从HttpServletRequest来的。

核心 QL 查询脚本 (SqlInjection.ql):

/** * @name SQL Injection * @description Finds user-controlled data flowing into SQL queries. * @kind path-problem */ import java import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.SqlInjectionQuery // 定义污点追踪配置 class SqlInjectionConfig extends TaintTracking::Configuration { SqlInjectionConfig() { this = "SqlInjectionConfig" } // Source: HTTP 请求参数 override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } // Sink: SQL 执行函数 override predicate isSink(DataFlow::Node sink) { sink instanceof SqlInjectionSink } } from SqlInjectionConfig conf, DataFlow::PathNode source, DataFlow::PathNode sink where conf.hasFlowPath(source, sink) select sink.getNode(), source, sink, "Potential SQL Injection from $@.", source.getNode(), "user input"

运行这个查询,CodeQL 会吐出一个SARIF格式的 JSON 文件,里面包含了几十条可能的注入路径。
这时候,如果人工去看,还是太累。


🧠 三、 第二步:LLM 判决(神探介入)

我们需要写一个 Python 脚本,解析 SARIF 文件,提取出完整的代码上下文(不仅仅是报错的那一行,而是整个函数),然后喂给 LLM。

Prompt 设计 (关键):

Role:你是一个世界级的网络安全专家。
Task:我会给你一段代码,CodeQL 认为第 15 行存在 SQL 注入风险。
Input:

  1. Source:String id = request.getParameter("id");
  2. Sink:statement.execute("SELECT * FROM users WHERE id = " + id);
  3. Context Code: [完整函数代码…]
    Analysis:
    请检查代码中是否存在有效的过滤(Sanitization)或验证。例如,是否使用了Integer.parseInt(id)?是否使用了预编译?
    Output:
    如果是误报,回复{"status": "FALSE"}
    如果是真漏洞,回复{"status": "TRUE", "reason": "...", "poc_suggestion": "..."}

Python 胶水代码片段:

importjsonimportopenaidefanalyze_vulnerability(code_snippet,source,sink):prompt=f""" CodeQL flagged a potential SQL Injection. Source:{source}Sink:{sink}Code: ```java{code_snippet}``` Is this exploitable? Analyze the data flow for sanitization. """response=openai.ChatCompletion.create(model="gpt-4",messages=[{"role":"user","content":prompt}])returnresponse.choices[0].message.content

💥 四、 实战复盘:捕获 0-day

在扫描某知名开源 CMS(Star 数 12k+)时,自动化系统发出了警报。

1. CodeQL 发现:

  • Source:AdminController.java中的String sort = req.getParameter("sort");
  • Sink:UserDao.java中的entityManager.createQuery(sql)
  • 路径: 参数sort被拼接到ORDER BY子句之后。

2. LLM 分析:

判定:TRUE
理由:开发者使用了 Hibernate 的 HQL,通常 HQL 是安全的。但是,在ORDER BY子句中,Hibernate 不支持预编译参数(PreparedStatement)。开发者直接使用了字符串拼接... ORDER BY " + sort
尽管代码前面有一行sort = sort.trim();,但这只去除了空格,没有防御 SQL 注入。
PoC 建议:尝试基于布尔盲注或报错注入,例如id DESC, (CASE WHEN (SELECT 1)=1 THEN 1 ELSE 1/0 END)

3. 人工验证:
我立刻搭建环境,发送 Payload:
GET /admin/users?sort=id, (SELECT CASE WHEN (SUBSTRING(password,1,1)='a') THEN 1 ELSE 1/0 END)
服务器返回 500 错误!
修改条件为 FALSE,服务器正常返回。
实锤了!一个 HQL 盲注 0-day。


🛡️ 五、 成果汇总

在一周的“挂机”运行中,这套系统扫描了 50 个项目,消耗了约 $30 的 API 额度,成果如下:

  1. 高危 (Critical): 某 CMS 系统后台 HQL 注入 (已获 CVE)。
  2. 高危 (High): 某微服务框架的 Zip Slip (文件解压路径遍历) 漏洞。
  3. 中危 (Medium): 某 IoT 管理平台的硬编码密钥泄露。

误报率对比:

  • 仅使用 CodeQL:误报率约 85%(需大量人工排查)。
  • CodeQL + LLM:误报率降至 15% 以下。

🎯 总结

“自动化”不是为了偷懒,而是为了把人的精力集中在最关键的“利用”环节。
CodeQL 解决了“找不到”的问题,LLM 解决了“看不准”的问题。
作为红队人员,掌握AST(抽象语法树)分析LLM Agent 开发,将是你未来最核心的竞争力。

Next Step:
这套系统的瓶颈在于Building Database(编译项目)太慢。
下一步,尝试使用CodeQL 的 “Dataflow without build”特性(虽然精度低一点但不用编译),或者结合Joern这种基于图数据库的更轻量级扫描工具,进一步提升扫描速度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 22:54:22

论文写作全流程工具指南:6大平台与公式编辑详解

核心工具对比速览 工具名称 核心功能 适用阶段 独特优势 AIbiye 论文结构优化 初稿完成后 理工科逻辑框架自动检测 AIcheck 万字论文生成 开题/初稿 实证研究模块内置 AskPaper 文献综述生成 文献调研 中英文文献混合处理 秒篇 快速论文生成 紧急任务 10分钟…

作者头像 李华
网站建设 2026/3/26 22:03:35

adsldp.dll文件损坏找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/3/26 21:58:17

毕业论文降AI必备:8款工具实测对比

毕业论文降AI必备:8款工具实测对比 TL;DR:2026年毕业季AIGC检测全面升级,传统降重方法已失效。实测8款降AI工具后,嘎嘎降AI(达标率99.26%)和比话降AI(不达标退款)效果最佳&#xff0…

作者头像 李华
网站建设 2026/3/27 12:29:46

网页编辑器如何优化WordPress的PPT远程协作功能?

要求:开源,免费,技术支持 博客:WordPress 开发语言:PHP 数据库:MySQL 功能:导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台:Window…

作者头像 李华
网站建设 2026/3/27 20:33:13

PHP实时消息聊天室源码 PHP+WebSocket

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 PHP实时消息聊天室源码 PHPWebSocket 一个基于PHP、WebSocket和MySQL的实时聊天应用,具有群聊、私聊、消息历史记录等功能。 支持数据库和无数据库,两种模式 实…

作者头像 李华