CodeQL C 查询 0.8.10:数据流查询全面迁移至威胁模型配置体系

📅 发布时间:2026/10/10 5:08:28
CodeQL C 查询 0.8.10:数据流查询全面迁移至威胁模型配置体系
静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security项目地址https://gitcode.com/gh_mirrors/co/codeql点击查看免费下载导读CodeQL C# 语言包 0.8.10 发布了一项重要的架构性变更绝大多数追踪远程remote流源的数据流查询不再硬编码远程来源这一概念而是统一改用可扩展的威胁模型threat model配置来驱动。本篇文章将逐条解读 0.8.10 变更说明中被迁移的 19 个查询并结合 ThreatModels.qll 源码与模型配置文件讲清楚威胁模型配置的语法、默认行为、优先级规则以及如何在保持既有告警不变化的前提下通过配置调整每条查询的数据流来源。读完本文你将能够为任何一条 C# 安全查询精确地定制哪些输入被视为攻击者可控并理解这套机制在后续版本中的演进方向。变更背景从硬编码 RemoteFlowSource 到可配置威胁模型在 0.8.10 之前CodeQL C# 安全查询对不可信输入的来源判定通常是直接引用RemoteFlowSource、LocalFlowSource这类固定的数据流源类。这意味着一个查询把什么当作攻击者输入是写死在 QL 代码里的用户无法在不开箱即用、不修改查询代码的前提下按自己系统的实际情况增减来源。0.8.10 的变更说明指出Most data flow queries that track flow fromremoteflow sources now use the currentthreat modelconfiguration instead.即大部分追踪远程流源的数据流查询改为使用当前的威胁模型配置。由于默认威胁模型配置恰好是远程流源见下文supported-threat-models.model.yml与threat-model-grouping.model.yml因此默认情况下产生的告警没有任何变化只有当用户显式修改威胁模型配置时这些查询的行为才会随之改变。这套机制在源码中的落点非常清晰shared/threat-models/codeql/threatmodels/ThreatModels.qll中定义了可扩展谓词threatModelConfiguration(string kind, boolean enable, int priority)而各安全查询则通过ActiveThreatModelSource早期版本名为ThreatModelFlowSource见 csharp/ql/lib/CHANGELOG.md这一类来获取当前威胁模型配置下生效的数据流源。0.8.10 变更影响面19 个查询的完整清单根据 0.8.10.md本次迁移涉及以下 19 个 C# 查询查询 ID对应漏洞类型cs/code-injection代码注入如CompileAssemblyFromSource系列cs/command-line-injection命令行注入cs/user-controlled-bypass用户可控的绕过如认证/授权逻辑cs/count-untrusted-data-external-api统计流向外部 API 的不可信数据cs/untrusted-data-to-external-api不可信数据流入外部 APIcs/ldap-injectionLDAP 注入cs/log-forging日志伪造cs/xml/missing-validationXML 缺少校验cs/redos正则表达式拒绝服务ReDoScs/regex-injection正则注入cs/resource-injection资源注入cs/sql-injectionSQL 注入cs/path-injection路径注入cs/unsafe-deserialization-untrusted-input不可信输入的反序列化cs/web/unvalidated-url-redirection未校验的 URL 重定向cs/xml/insecure-dtd-handling不安全的 DTD 处理cs/xml/xpath-injectionXPath 注入cs/web/xss跨站脚本XSScs/uncontrolled-format-string不受控的格式化字符串这 19 个查询覆盖了 C# 语言包中最核心的注入类、数据暴露类与 Web 类漏洞是 CodeQL C# 安全分析的主力查询集。源码佐证查询如何切换到威胁模型驱动以cs/code-injection为例其配置位于 csharp/ql/lib/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll。该文件中旧的来源定义被显式标记为弃用/** DEPRECATED: Use ThreatModelSource instead. */ deprecated class RemoteSource extends DataFlow::Node instanceof RemoteFlowSource { } /** DEPRECATED: Use ThreatModelSource instead. */ deprecated class LocalSource extends DataFlow::Node instanceof LocalFlowSource { } /** A source supported by the current threat model. */ class ThreatModelSource extends Source instanceof ActiveThreatModelSource { }从源码结构可以清晰看到迁移方式RemoteSource/LocalSource两个旧类被废弃取而代之的是ThreatModelSource——它直接以ActiveThreatModelSource为底层类型而ActiveThreatModelSource正是由威胁模型配置动态计算出来的来源集合。同样的模式也出现在 CommandInjectionQuery.qllcs/command-line-injection和 ConditionalBypassQuery.qllcs/user-controlled-bypass等文件中。在安全查询侧如 XMLInjection.ql 所示isSource谓词直接以ActiveThreatModelSource实例作为数据流源predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource }这意味着一旦威胁模型配置发生变化所有以ActiveThreatModelSource为来源的查询会自动跟随新配置无需改动任何 QL 代码。威胁模型配置机制解析威胁模型的核心实现位于 ThreatModels.qll其中定义了可扩展谓词extensible predicate threatModelConfiguration(string kind, boolean enable, int priority);三个参数的含义分别是kind要配置的威胁模型名称。可以是某个具体威胁模型的名称如environment、一个分组如local也可以是特殊值all。enable为true时启用指定威胁模型连同其子模型为false时禁用。priority配置的应用顺序数值越小越先被应用。最终生效的配置是逐行按priority升序处理的结果。ThreatModels.qll的文档注释给出了一个非常典型的三步配置示例{ kind: all, enable: true, priority: 0 } { kind: remote, enable: false, priority: 1 } { kind: environment, enable: true, priority: 2 }执行顺序为先启用全部威胁模型 → 再禁用remote分组 → 最后单独重新启用environment这一个威胁模型。可以看到优先级机制允许用户以先全开、再局部关闭、再定点打开的方式精细控制。从实现看ThreatModels.qll中threatModelEnabled谓词某个威胁模型最终是否启用取决于所有配置行中优先级最高数值最小且其kind能覆盖该威胁模型的那一行的enable值对配置表和分组表中都未提及的威胁模型其启用状态只受all相关的配置行控制currentThreatModel谓词。威胁模型的分组结构威胁模型的分组关系定义在 threat-model-grouping.model.yml 中当前仓库中可以看到如下分组结构# Default threat model [remote, default] # Remote threat models [request, remote] [response, remote] # Local threat models [database, local] [commandargs, local] [environment, local] [stdin, local] [file, local] [windows-registry, local] # Android threat models [android-external-storage-dir, android] [contentprovider, android] # Ungrouped threat models (implicit children of all) [database-access-result, all] [file-write, all] [reverse-dns, all] [view-component-input, all]需要注意两个关键点remote分组是default威胁模型的子模型而request与response又归属于remote。因此默认配置下请求体/响应体这类网络输入天然属于远程来源。所有威胁模型都隐式是all的子模型分组文件中只是显式列出以保持完整性。默认配置与告警不变的承诺默认的威胁模型配置由 supported-threat-models.model.yml 提供extensions: - addsTo: pack: codeql/threat-models extensible: threatModelConfiguration data: - [default, true, -2147483648] # The default threat model is included by default即默认配置以优先级-2147483648int 最小值启用了default威胁模型而default恰好包含整个remote分组request、response。这正是变更说明中默认配置就是远程流源所以告警不变的机制保证——0.8.10 的迁移对默认用户是透明的。实战如何通过威胁模型配置改变查询行为由于 0.8.10 之后这些查询全部由威胁模型配置驱动你可以通过 CodeQL 扩展文件.model.yml在项目级或扫描配置级注入自定义配置从而按需调整 19 个查询的数据流来源。以下给出几个典型场景配置行沿用kind / enable / priority三要素场景一禁用所有远程来源仅信任本地输入——适用于只有本地数据、明确不需要网络输入告警的内网工具extensions: - addsTo: pack: codeql/threat-models extensible: threatModelConfiguration data: - [default, false, 1]场景二在默认基础上追加环境变量为来源属于local分组的environmentextensions: - addsTo: pack: codeql/threat-models extensible: threatModelConfiguration data: - [environment, true, 10]场景三精细裁剪——保留响应体来源、剔除请求体来源request/response均属remote分组extensions: - addsTo: pack: codeql/threat-models extensible: threatModelConfiguration data: - [request, false, 10]依据ThreatModels.qll的优先级语义以上配置行都会覆盖默认配置中的对应条目默认优先级为 int 最小值先被应用priority更大的行后应用并胜出从而实现默认告警不变、按需增量裁剪的目标。需要说明的是威胁模型机制在仓库中仍被标注为实验性 APIThreatModels.qll头部注明 INTERNAL use only. This is an experimental API subject to change without notice使用时应关注后续版本变更。演进脉络0.8.10 之后的变化威胁模型机制并非止步于远程来源。从后续版本的变更记录可以看到它的持续演进0.8.13.md 中追踪本地流源的数据流查询cs/code-injection、cs/resource-injection、cs/sql-injection、cs/uncontrolled-format-string也切换到了威胁模型配置同时移除了若干Stored变体查询如cs/stored-command-line-injection、cs/web/stored-xss并说明其告警可通过启用file与database威胁模型来恢复——这正是 0.8.10 打下的可配置地基的直接受益。csharp/ql/lib/CHANGELOG.md 记录了ThreatModelFlowSource更名为ActiveThreatModelSource以更准确地表达仅包含当前激活的威胁模型来源这一语义ThreatModelFlowSource被标记为弃用。这一演进路径说明0.8.10 是 C# 安全查询从硬编码来源走向统一可配置来源体系的关键里程碑它先把远程来源迁移到新机制后续版本再把本地来源、存储型来源逐步纳入同一套配置体系最终让用户在不改查询代码的前提下用一个配置文件完整掌控全部安全查询的攻击面定义。小结0.8.10 变更虽只占据一行变更说明背后却是 C# 安全分析架构的一次实质性升级19 个核心数据流查询的流源定义从写死的RemoteFlowSource迁移到了由threatModelConfiguration谓词驱动的威胁模型体系。理解kind / enable / priority三要素与default → remote → request/response的分组继承关系即可在不改变默认告警的前提下按需为cs/sql-injection、cs/web/xss、cs/code-injection等查询定制攻击者输入范围。相关实现与配置可在 ThreatModels.qll、supported-threat-models.model.yml 与 threat-model-grouping.model.yml 中继续深入阅读。赞分享静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security项目地址https://gitcode.com/gh_mirrors/co/codeql点击查看免费下载相关推荐CodeQL C/C 查询库 0.5.5 变更解读*Configuration 数据流配置弃用与 *Flow 模块迁移指南CodeQL C/C 查询库 0.5.5 变更解读 Configuration 数据流配置弃用与 Flow 模块迁移指南 导读 本文围绕 CodeQL 仓静态分析SAST应用安全漏洞扫描代码质量Plasmic 旧版数据查询迁移指南将 $queries 迁移至现代 $q 查询Plasmic 旧版数据查询迁移指南将 $queries 迁移至现代 $q 查询 本文是 Plasmic Designer AI 技能 plasmic de低代码前端后端CodeQL C 0.3.0 破坏性变更解析contextual queries 及查询库迁移至 codeql/csharp-all 包CodeQL C 0.3.0 破坏性变更解析contextual queries 及查询库迁移至 codeql/csharp all 包 本篇技术指南围绕 C静态分析SAST应用安全漏洞扫描代码质量上一篇企业级密钥管理终极指南Infisical开源平台深度解析与实战部署下一篇微软公开美国全国建筑轮廓数据集重塑地理信息应用的里程碑创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考