静态分析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# 查询库csharp/ql/lib的 5.0.0 版本变更说明 csharp/ql/lib/change-notes/released/5.0.0.md 为主线系统梳理该版本引入的破坏性 API 变更与 C# 13 新增分析能力UnboundGenericType.getInstanceType与ControlFlowGraph中Node.getElement的移除、ReadOnlySpan重载的 MaD 数据流模型、OverloadResolutionPriority特性支持以及部分属性partial properties与索引器支持。读完本文你将了解如何在升级 CodeQL C# 查询库时完成对应代码迁移并能利用新增的 QL 类与模型文件扩展 C# 13 代码的污点追踪与数据流分析。一、版本定位C# 13 / .NET 9 全量支持的衔接版本在仓库总变更日志 csharp/ql/lib/CHANGELOG.md 中5.0.0 位于 4.0.x 之后、6.0.0 之前。紧随其后的 6.0.0 版本宣布Full support for C# 13 / .NET 9. All new language features are now supported by the extractor见 csharp/ql/lib/CHANGELOG.md#L340-L346而 5.0.0 正是为 C# 13 全面落地铺路的衔接版本它一面清理历史遗留的废弃 APIBreaking Changes一面为 C# 13 的三项新语言特性补上 QL 库支持与数据流模型。因此5.0.0 的变更可以归纳为两条主线破坏性变更删除两个已废弃的 QL 谓词属于 API 清理与语义对齐分析能力增强围绕 C# 13 的ReadOnlySpan重载建模、OverloadResolutionPriority特性与 partial 成员扩展了数据流模型与 QL 类。下文分别展开。二、破坏性变更两个废弃谓词的移除与迁移2.1 删除UnboundGenericType.getInstanceType5.0.0 删除了UnboundGenericType类上的废弃谓词getInstanceType。该类的定义位于 csharp/ql/lib/semmle/code/csharp/Generics.qll#L128-L164从源码注释可见An unbound generic type. This is a generic type with type parameters (for exampleListT) or elided type parameters (for exampleList1).即未绑定泛型类型代表ListT这类带类型参数的泛型声明本身与之相对的是Gint这类已构造constructed类型。UnboundGenericType当前提供的核心接口包括getAConstructedGeneric()获取该未绑定泛型的一个已构造版本涵盖封闭构造类型如Gint与开放构造类型如class OtherT { GT g; }中的GTgetUnboundDeclaration()获取自身的未绑定声明getChild(int n)/getTypeParameter(n)遍历类型参数toStringWithTypes()/getName()类型名输出。被删除的getInstanceType正是从未绑定泛型反查实例类型的旧入口。从仓库当前代码看这一查询意图已由类型体系自身的继承关系ConstructedType与UnboundGeneric家族承载例如Conversion.qll中通过ConstructedType.getUnboundGeneric()在两种类型间来回切换见 csharp/ql/lib/semmle/code/csharp/Conversion.qll#L110-L118。迁移建议若你的自定义查询中调用了UnboundGenericType.getInstanceType()需改为通过ConstructedType/ValueOrRefType的类型层次遍历来获取实例类型典型替代模式是使用getAConstructedGeneric()获得构造类型后再取具体实例。2.2 删除ControlFlowGraph.qll中Node.getElement改用getAstNode第二个破坏性变更影响控制流图CFGAPIControlFlowGraph.qll的Node类上废弃的getElement谓词被删除官方迁移路径是改用getAstNode。公共模块 csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll 通过private import internal.ControlFlowGraph引入内部实现而内部实现 csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll#L71-L74 中定义了module Ast implements AstSigLocation { class AstNode ControlFlowElementOrCallable; ... }可见AstNode是控制流元素或可调用对象的别名getAstNode()返回的正是与 CFG 节点对应的 AST 节点ControlFlowElement或Callable。仓库内部的既有代码已经全面迁移到新 API例如 csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowReachability.qll#L14-L16 中node.getAstNode() result not exists(node.getAstNode()) and result node.getEnclosingCallable()迁移建议将自定义查询中的node.getElement()直接替换为node.getAstNode()。两者语义一致返回 CFG 节点对应的 AST 元素旧名仅是历史遗留的别名替换不改变分析结果。三、C# 13ReadOnlySpan重载的 MaD 数据流模型3.1 背景MaDModel-as-Data模型机制CodeQL 的数据流分析将哪些库调用是污点源/汇/传递步骤声明为外部模型external models以 YAML 形式存放在csharp/ql/lib/ext/目录下。这些模型通过可扩展谓词summaryModel被加载进分析其定义见 csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlowExtensions.qll#L42-L45extensible predicate summaryModel( string namespace, string type, boolean subtypes, string name, string signature, string ext, string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId );模型列语义在 csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlow.qll#L60-L95 中有权威说明要点如下input/output描述数据流端点Argument[n]参数this表示限定符、ReturnValue返回值、Parameter等端点可追加后缀.Element选择集合中的元素、.Field[f]字段内容、.Property[p]属性内容kind标记模型类别taint默认附加污点传播步骤、value全局值保持步骤provenance标记模型来源manual人工编写、df-generated模型生成器产出等。5.0.0 的改动正是为 C# 13 中新增的、以System.ReadOnlySpanT为参数的 .NET 重载补充summaryModel使污点流能够穿越这些新签名。3.2 具体模型示例变更说明中点名的示例是String.Format(System.String, System.ReadOnlySpanSystem.Object)。虽然该具体条目属于生成模型但仓库中同类ReadOnlySpan模型遍布 csharp/ql/lib/ext/System.Text.model.yml例如- [System.Text, Encoding, True, GetBytes, (System.ReadOnlySpanSystem.Char,System.SpanSystem.Byte), , Argument[0].Element, Argument[1], taint, manual] - [System.Text, Encoding, False, GetString, (System.ReadOnlySpanSystem.Byte), , Argument[0].Element, ReturnValue, taint, manual] - [System.Text, StringBuilder, False, AppendFormat, (System.String,System.ReadOnlySpanSystem.Object), , Argument[1].Element, Argument[this], taint, manual]逐列解读StringBuilder.AppendFormat(System.String, System.ReadOnlySpanSystem.Object)这条模型列值含义namespaceSystem.Text命名空间typeStringBuilder类型subtypesFalse仅精确匹配不覆盖子类型nameAppendFormat方法名signature(System.String,System.ReadOnlySpanSystem.Object)参数签名ext空扩展限定inputArgument[1].Element污点从第 2 个参数format 字符串进入outputArgument[this]流向StringBuilder实例本身kindtaint污点传播步骤provenancemanual人工编写类似的ReadOnlySpan模型还出现在 csharp/ql/lib/ext/System.IO.model.yml如Path.Combine(System.ReadOnlySpanSystem.String)、Stream.Write(System.ReadOnlySpanSystem.Byte)与 csharp/ql/lib/ext/System.Collections.Immutable.model.yml如ImmutableArray.ToImmutableArrayT(System.ReadOnlySpanT)中。分析能力提升.Element后缀意味着分析器会把span 中元素与span 整体当作可传播的污点载体从而让 C# 13 时代惯用的ReadOnlySpanbyte、ReadOnlySpanchar等零拷贝 API 之间的污点链不再断裂——这对检测格式字符串注入、路径操纵、编码转换类漏洞至关重要。四、C# 13OverloadResolutionPriority特性支持C# 13 引入[OverloadResolutionPriority(int)]特性允许开发者显式声明重载的解析优先级。5.0.0 为此新增了专用 QL 类SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute定义于 csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll#L87-L98/** An attribute of type System.Runtime.CompilerServices.OverloadResolutionPriority. */ class SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute extends Attribute { SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute() { this.getNamespace() instanceof SystemRuntimeCompilerServicesNamespace and this.getType().hasName(OverloadResolutionPriorityAttribute) } /** * Gets the priority number. */ int getPriority() { result this.getConstructorArgument(0).getIntValue() } }该类的设计要点通过命名空间System.Runtime.CompilerServices加类型名双重约束完成识别避免误匹配其他同名特性核心方法getPriority()从构造参数[0]解析出整型优先级数值。查询用例借助该类可以编写 QL 查询找出所有标注了OverloadResolutionPriority的方法及其优先级数值例如import csharp from SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute attr select attr, attr.getPriority(), attr.getAnnotatedElement()由于该特性影响编译器在多个重载间的选择建模后数据流分析也能更准确地判定实际被调用的重载是哪一个从而提升调用图与污点分析精度。五、C# 13partial 属性与索引器支持C# 13 允许属性和索引器像方法一样使用partial修饰符拆分声明与实现。5.0.0 为该语言特性补齐了 QL 库支持。从类型系统层面看Property与Indexer两个类分别定义在 csharp/ql/lib/semmle/code/csharp/Property.qll#L137 与 csharp/ql/lib/semmle/code/csharp/Property.qll#L313二者均继承DeclarationWithGetSetAccessors带 get/set 访问器的声明基类。而partial修饰符的判定能力来自成员基类 csharp/ql/lib/semmle/code/csharp/Member.qll#L145-L146/** Holds if this declaration is partial. */ predicate isPartial() { this.hasModifier(partial) }因此新增支持后可以直接在查询中识别 partial 属性/索引器并关联其多个声明片段import csharp from Property p where p.isPartial() select p, partial property declaration仓库中对 partial 声明的处理已有先例——ExprOrStmtParent.qll中通过e.(Modifiable).isPartial()判断 partial 成员见 csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll#L84DataFlowDispatch.qll也注明 partial 方法可能有多个源码位置见 csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll#L65。5.0.0 将此能力扩展至属性与索引器使跨文件拆分的属性声明在 AST 与数据流层面被完整识别。六、升级与验证建议升级路径升级 CodeQL CLI 及 C# 查询包到包含 5.0.0 的版本后自定义 QL 查询若仍引用两个被删谓词编译器会直接报错可按上文迁移建议逐个替换为getAConstructedGeneric()/getAstNode()。验证方式用仓库自带的 QL 测试框架对迁移后的查询跑回归测试确认与旧版本输出一致CFG 节点的getAstNode替换属纯重命名不应改变结果针对 C# 13 代码库如使用ReadOnlySpan的String.Format、标注OverloadResolutionPriority的重载、跨文件 partial 属性运行数据流/污点类查询如注入、路径操纵验证新模型与类是否生效查询模型加载情况可通过ExternalFlow.qll的summaryModel谓词间接确认——若模型未生效涉及ReadOnlySpan签名的方法将不产生对应的污点传播步骤。参考资料变更说明原文csharp/ql/lib/change-notes/released/5.0.0.md总变更日志csharp/ql/lib/CHANGELOG.mdUnboundGenericType定义csharp/ql/lib/semmle/code/csharp/Generics.qllCFG 公共/内部模块csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll 与 csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qllOverloadResolutionPriorityQL 类csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll模型语法规范csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlow.qll模型文件示例csharp/ql/lib/ext/System.Text.model.yml、csharp/ql/lib/ext/System.IO.model.yml、csharp/ql/lib/ext/System.Collections.Immutable.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 查询库 11.0.0 破坏性变更全解与升级迁移指南CodeQL C 查询库 11.0.0 破坏性变更全解与升级迁移指南 本指南围绕 CodeQL 仓库中 C/C 查询库 cpp/ql/lib 11.静态分析SAST应用安全漏洞扫描代码质量3 步把 Ultimate Vocal Remover 部署到云端Docker 打包到云服务器实操指南3 步把 Ultimate Vocal Remover 部署到云端Docker 打包到云服务器实操指南 当你需要批量把歌里的人声抠出来、只留伴奏时用 Ult音频处理人工智能CodeQL C 库 0.2.0 变更详解allowImplicitRead 签名迁移与缓冲区分析增强CodeQL C 库 0.2.0 变更详解allowImplicitRead 签名迁移与缓冲区分析增强 本文以 CodeQL 仓库内 C 语言库的 0静态分析SAST应用安全漏洞扫描代码质量上一篇FunASR中FSMN-VAD模型句尾检测优化实践下一篇Frappe HR未来工作远程办公与自动化趋势创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?