news 2026/10/10 5:09:16

CodeQL C 查询包 1.0.9 变更解析:System.Web.UI.AttributeCollection 不再作为 HTML 污点汇聚点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CodeQL C 查询包 1.0.9 变更解析:System.Web.UI.AttributeCollection 不再作为 HTML 污点汇聚点
  • 静态分析
  • SAST
  • 应用安全
  • 漏洞扫描
  • 代码质量

【免费下载链接】codeql

CodeQL: 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# 查询包 1.0.9 版本(变更说明)中的一项关键安全分析改进展开:System.Web.UI.AttributeCollection的索引器(indexer)与Add方法被正式移出 HTML 污点汇聚点(HTML sink)集合。文章将从版本变更原文出发,结合 Html.qll 源码与 XSS.ql 查询实现,解释该改动的技术动机、对跨站脚本(XSS)检测精度的实际影响,以及开发者在理解查询结果时需要注意的行为变化。

1.0.9 变更说明原文

在 CodeQL C# 查询包 1.0.9 版本的变更说明(csharp/ql/src/change-notes/released/1.0.9.md)中,该版本被归类为Minor Analysis Improvements(次要分析改进),改动内容原文如下:

C#: The indexer andAddmethod onSystem.Web.UI.AttributeCollectionis no longer considered an HTML sink.

即:System.Web.UI.AttributeCollection上的索引器(this[...])和Add方法不再被视为 HTML sink。这条记录同时被收录在 csharp/ql/src/CHANGELOG.md 中(第 340 行),是查询库语义调整的正式归档。

背景:CodeQL 中的 HTML sink 与 XSS 检测

在 CodeQL 的污点流(taint tracking)分析框架中,sink(汇聚点)是指不安全数据可能"流出"的位置——对于 XSS 漏洞,即用户可控数据被写入页面且未经过 HTML 编码的地方。CodeQL C# 的 XSS 检测由 csharp/ql/src/Security Features/CWE-079/XSS.ql 定义,其元数据声明了@id cs/web/xss、@kind path-problem,并关联 CWE-079(跨站脚本)与 CWE-116(编码问题)。

该查询的核心调用链为:

  1. XSS.ql导入semmle.code.csharp.security.dataflow.XSSQuery;
  2. XSSQuery.qll(位于 csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll)汇总各类 XSS sink 定义;
  3. 具体 sink 定义位于 XSSSinks.qll,其中HtmlSinkSink类将所有实现HtmlSink的节点纳入 XSS 污点汇聚点。

而 HTML sink 的抽象基类HtmlSink定义在 flowsinks/Html.qll(第 23 行),其语义注释为:

A sink where the value of the expression may be rendered as HTML, without implicit HTML encoding.

即:表达式取值可能被渲染为 HTML、且未经过隐式 HTML 编码的位置。同时HtmlSink还继承自RemoteFlowSink,意味着所有 HTML sink 同时也参与远程数据流(remote flow)分析,影响面不限于 XSS 单一查询。

变更的源码实现证据

与 1.0.9 变更说明直接对应的源码证据,位于 flowsinks/Html.qll 第 58~70 行:

/** * DEPRECATED: Attribute collections are no longer considered HTML sinks. */ deprecated class AttributeCollectionSink extends DataFlow::ExprNode { AttributeCollectionSink() { exists(SystemWebUIAttributeCollectionClass ac, Parameter p | p = ac.getAddMethod().getParameter(1) or p = ac.getItemProperty().getSetter().getParameter(0) | this.getExpr() = p.getAnAssignedArgument() ) } }

从源码可以明确读出三个关键事实:

  • 旧实现中,AttributeCollectionSink覆盖两个入口:Add方法的第 2 个参数(getAddMethod().getParameter(1))与索引器 setter(getItemProperty().getSetter().getParameter(0)),这与变更说明中"indexer andAddmethod"的表述一一对应;
  • 类声明上方直接标注了DEPRECATED注释,说明该 sink 已被正式废弃;
  • 该废弃类已不再继承HtmlSink(基类仅为DataFlow::ExprNode),因此不再被XSSSinks.qll中的HtmlSinkSink收集,也就不会进入 XSS 污点流分析。

为什么移除:误报(false positive)治理的典型实践

从 CodeQL 查询库的演进逻辑可以推断,本次移除属于减少误报的精度治理:System.Web.UI.AttributeCollection是 ASP.NET WebForms 服务器控件(如WebControl、HtmlControl)用于管理 HTML 特性(attribute)的集合类型。向该集合写入数据并不等同于"数据直接输出到 HTTP 响应体且未编码"——其值最终是否以危险形式渲染,取决于控件属性与页面生命周期的后续行为,中间存在大量编码、过滤与序列化环节。

将AttributeCollection.Add与索引器粗粒度地建模为 HTML sink,容易导致:

  • 用户可控数据仅写入控件特性集合、但最终被安全处理(如 ASP.NET 内置特性编码)的代码被误报为 XSS 漏洞;
  • sink 语义与HtmlSink抽象定义("may be rendered as HTMLwithout implicit HTML encoding")不一致——集合写入点本身并不承诺"未经编码地渲染"。

移除后,XSS 查询将聚焦于真正直接输出未编码内容的汇聚点,例如 Html.qll 中仍保留的HtmlTextWriterSink(HtmlTextWriter.Write/WriteLine/WriteAttribute等方法的写入参数)、SetAttributeSink(HtmlElement.SetAttribute第二参数),以及 XSSSinks.qll 中建模的System.Web.UI.Page标题/元数据属性、ClientScriptManager脚本注册方法、HttpResponseBase写入方法等。

对查询结果的实际影响

  • 误报减少:凡是"数据流经AttributeCollection索引器或Add方法"的代码路径,不再单独触发 XSS 告警,除非该数据还经由其他仍被建模的 HTML sink 输出;
  • 分析兼容性:AttributeCollectionSink以deprecated形式保留在 flowsinks/Html.qll 中,意味着依赖旧 sink 语义的自定义查询仍可编译(仅产生废弃警告),但官方 XSS 查询已不再使用它——这是 CodeQL 库演进中向后兼容的常规做法;
  • 版本影响范围:该变更随 1.0.9 及之后的查询包版本生效。若项目锁定旧版查询包,行为不变;升级后扫描结果中与AttributeCollection相关的 XSS 告警将消失,属于预期内的结果变化,可在发布安全公告时结合该变更说明核对告警差异。

小结

CodeQL C# 1.0.9 对System.Web.UI.AttributeCollection索引器与Add方法的 sink 语义调整,是查询库通过收紧 sink 边界来降低 XSS 误报的一次典型变更。它体现了 CodeQL 安全查询的设计原则:sink 必须精确对应"数据以未编码形式输出到 HTML"的实际危险点,而非一切触及 HTML 相关集合的操作。理解此类变更,有助于安全团队在升级查询包时准确解读告警数量的增减,并据此优化自定义查询与安全基线。

参考文件

  • 变更说明原文:csharp/ql/src/change-notes/released/1.0.9.md
  • 变更汇总归档:csharp/ql/src/CHANGELOG.md
  • HTML sink 基类与废弃的AttributeCollectionSink:flowsinks/Html.qll
  • XSS sink 汇总:XSSSinks.qll
  • XSS 查询定义:XSS.ql
  • 静态分析
  • SAST
  • 应用安全
  • 漏洞扫描
  • 代码质量

【免费下载链接】codeql

CodeQL: 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
点击查看免费下载

相关推荐

上一篇:Music-dl源码解析:从零理解命令行音乐下载器的架构设计
下一篇:如何在NomadNet中创建和管理分布式对话?完整用户手册

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

stm32cubemx 固件 FW-F4 V1.28.0离线安装教程

由于现在stm32cubemx 下载需要myST登录,但是注册myST又经常无反应,所以我就找了STM32Cube FW-F4 V1.28.0固件版本,进行本地安装,以下是本地安装教程及固件下载路径安装流程1,以管理员身份打开CUBE,单击INSTALL/REMOVE2…

作者头像 李华
网站建设 2026/10/10 5:06:29

【通信原理笔记】【一】确定信号分析——1.6 频带信号的复包络

文章目录前言一、频带信号的复包络二、频带信号的三种表示三、等效基带分析总结前言 上一篇我们学习了解析信号,它将信号的负频率部分镜像叠加到正频率部分便于分析。然而,频带信号有着不同的载频,分析起来还是不够方便,这篇我们…

作者头像 李华
网站建设 2026/10/10 5:06:14

vscode中4个json的区别和联系

在vscode中快捷键ctrlshiftp,然后输入setting,会出现下图几个选项 当不同设置之间出现冲突时,听谁的: Open Workspace Settings(JSON) > Open Settings(JSON) Open User Settings > Open Default Settings(JSON) Open Wo…

作者头像 李华
网站建设 2026/10/10 5:04:54

STM32F411RE与PCA9422协同实现嵌入式低功耗电源管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华