codeql核心模块:数据流追踪

admin 2026-07-02 06:14:59 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档详细解析了CodeQL中数据流与污点追踪查询的编写方法,重点介绍了新版API通过实现DataFlow::ConfigSig接口定义规则的核心模板结构,包括isSource、isSink等关键谓词的配置逻辑,并说明如何实例化全局追踪引擎及内置的远程输入、本地用户输入等数据源分类。文章为安全漏洞挖掘提供可操作的技术实现路径。 综合评分: 78 文章分类: 代码审计,漏洞分析,安全工具,WEB安全,安全开发


cover_image

codeql核心模块:数据流追踪

原创

信安路漫漫 信安路漫漫

信安路漫漫

2026年6月30日 07:00 上海

在小说阅读器读本章

去阅读

在 CodeQL 中,编写数据流(Data Flow)和污点追踪(Taint Tracking)查询是进行安全漏洞挖掘的核心技能。为了帮助你快速构建自己的分析规则,以下基于新版 CodeQL API 为你详细解析标准的数据流模板及其核心组件。

本篇文章先来看一个简单的模版,后续会根据这个模版来编写检测漏洞的数据流分析模块。

下面是一个编写数据流的模版,可以根据这个模版进行改写

/**&nbsp;*&nbsp;@name&nbsp;My Custom Vulnerability&nbsp;*&nbsp;@description&nbsp;Description of the vulnerability.&nbsp;*&nbsp;@kind&nbsp;path-problem&nbsp;*&nbsp;@problem.severity error&nbsp;*&nbsp;@security-severity 7.5&nbsp;*&nbsp;@precision&nbsp;high&nbsp;*&nbsp;@id&nbsp;my-custom-vuln&nbsp;*&nbsp;@tags&nbsp;security&nbsp;*/import&nbsp;java// 显式导入数据流库(Java/C++/Python/Swift等语言需要)import&nbsp;semmle.code.java.dataflow.DataFlow&nbsp;import&nbsp;semmle.code.java.dataflow.TaintTracking&nbsp;// 1. 定义配置模块module&nbsp;MyConfig&nbsp;implements&nbsp;DataFlow::ConfigSig&nbsp;{&nbsp; &nbsp; predicate&nbsp;isSource(DataFlow::Node&nbsp;source) {&nbsp;/* ... */&nbsp;}&nbsp; &nbsp; predicate&nbsp;isSink(DataFlow::Node&nbsp;sink) {&nbsp;/* ... */&nbsp;}}// 2. 实例化全局数据流引擎module&nbsp;MyFlow&nbsp;=&nbsp;TaintTracking::Global<MyConfig>;// 3. 导入路径图以支持可视化连线import&nbsp;MyFlow::PathGraph&nbsp;from&nbsp;MyFlow::PathNode&nbsp;source,&nbsp;MyFlow::PathNode&nbsp;sinkwhere&nbsp;MyFlow::flowPath(source, sink)select&nbsp;&nbsp; &nbsp; sink.getNode(), &nbsp;&nbsp;// 报告触发点&nbsp; &nbsp; source, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 起点(用于画线)&nbsp; &nbsp; sink, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 终点(用于画线)&nbsp; &nbsp;&nbsp;"This data flows from here to a dangerous sink."&nbsp;// 描述信息

在新版 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核心模块:数据流追踪》

评论:0   参与:  0