文章总结: 该文档详细解析了CodeQL中数据流与污点追踪查询的编写方法,重点介绍了新版API通过实现DataFlow::ConfigSig接口定义规则的核心模板结构,包括isSource、isSink等关键谓词的配置逻辑,并说明如何实例化全局追踪引擎及内置的远程输入、本地用户输入等数据源分类。文章为安全漏洞挖掘提供可操作的技术实现路径。 综合评分: 78 文章分类: 代码审计,漏洞分析,安全工具,WEB安全,安全开发
codeql核心模块:数据流追踪
原创
信安路漫漫 信安路漫漫
信安路漫漫
2026年6月30日 07:00 上海
在小说阅读器读本章
去阅读
在 CodeQL 中,编写数据流(Data Flow)和污点追踪(Taint Tracking)查询是进行安全漏洞挖掘的核心技能。为了帮助你快速构建自己的分析规则,以下基于新版 CodeQL API 为你详细解析标准的数据流模板及其核心组件。
本篇文章先来看一个简单的模版,后续会根据这个模版来编写检测漏洞的数据流分析模块。
下面是一个编写数据流的模版,可以根据这个模版进行改写
/** * @name My Custom Vulnerability * @description Description of the vulnerability. * @kind path-problem * @problem.severity error * @security-severity 7.5 * @precision high * @id my-custom-vuln * @tags security */import java// 显式导入数据流库(Java/C++/Python/Swift等语言需要)import semmle.code.java.dataflow.DataFlow import semmle.code.java.dataflow.TaintTracking // 1. 定义配置模块module MyConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { /* ... */ } predicate isSink(DataFlow::Node sink) { /* ... */ }}// 2. 实例化全局数据流引擎module MyFlow = TaintTracking::Global<MyConfig>;// 3. 导入路径图以支持可视化连线import MyFlow::PathGraph from MyFlow::PathNode source, MyFlow::PathNode sinkwhere MyFlow::flowPath(source, sink)select sink.getNode(), // 报告触发点 source, // 起点(用于画线) sink, // 终点(用于画线) "This data flows from here to a dangerous sink." // 描述信息
在新版 API 中,不再使用旧版的类继承方式(如 extends TaintTracking::Configuration),而是通过实现 DataFlow::ConfigSig 接口来定义规则。该模块主要包含以下谓词(predicate):
isSource: 定义数据的源头(不可信输入)。例如 HTTP 请求参数、环境变量等。可以使用内置的 RemoteFlowSource,或自定义匹配特定的方法调用。
isSink: 定义危险的终点(执行敏感操作的地方)。例如 SQL 执行函数、文件读写函数等。
isBarrier (可选): 替代了旧版的 isSanitizer。如果数据流经这里,污染状态会被清除(例如经过了严格的类型转换或白名单校验)。
isAdditionalFlowStep (可选): 替代了旧版的 isAdditionalTaintStep。用于处理框架中特殊的跨节点传播逻辑(例如 URI 构造函数内部的路径拼接)。
引擎实例化与路径图
TaintTracking::Global: 通过传入配置模块,生成一个专属的全局污点追踪引擎 MyFlow。如果你只需要精确的值传递而不关心隐式的污点传播,可以改用 DataFlow::Global。
import MyFlow::PathGraph: 新版语法要求直接从生成的模块中导入路径图(而不是使用通用的 DataFlow::PathGraph),以便在 IDE 中展示数据流转的路径说明。
主查询 (from, where, select)
from: 声明变量类型为 MyFlow::PathNode,这也是新版 API 的要求,直接引用模块内的路径节点类型。
where: 调用 MyFlow::flowPath(source, sink) 让引擎去计算从 Source 到 Sink 是否存在连通的路径。
select: 对于路径问题,标准的输出格式固定为四列:sink节点, source对象, sink对象, 提示信息。
内置的数据源
网络与远程输入 (Remote Flow Sources)
这是最常见的攻击面,代表来自外部不可信环境的数据。
RemoteFlowSource:这是一个非常常用的基类,涵盖了所有通过网络进入系统的数据。它包括 HTTP 请求参数、Header、Cookie、文件上传内容等。
ActiveThreatModelSource:正如你在上一轮对话的 TaintedPathConfig 中看到的那样,它代表当前活跃的威胁模型来源,通常包含了所有的远程输入。
本地用户与环境输入 (Local User Input)
这类数据源虽然不来自网络,但同样不受程序直接控制,可能包含恶意载荷。
LocalUserInput:代表本地可控的输入源。例如命令行参数(CLI arguments)、环境变量、从注册表读取的配置等。
FileInput:专门针对文件系统的输入。如果程序读取了某个文件的内容并将其作为数据处理,这个节点会被标记为污染源。这在检测“任意文件读取”或“路径穿越”漏洞时非常关键。
数据存储与反序列化 (Storage & Deserialization)
即使数据最初是安全的,存入数据库后再读出来也可能已经被篡改。
数据库读取:从 SQL/NoSQL 数据库中查询出的结果集。
反序列化对象:将 JSON、XML、Protobuf 或 Java 原生序列化流还原为内存对象的过程。这通常是极其危险的 Source,容易引发 RCE(远程代码执行)。
消息队列:从 RabbitMQ、Kafka 等中间件消费的消息。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:信安路漫漫 信安路漫漫 信安路漫漫《codeql核心模块:数据流追踪》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论