CodeQL C 5.1.3 安全分析改进解析:System.Uri 污染流建模与 Blazor 组件参数传递
静态分析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# 分析库在 5.1.3 版本中针对 ASP.NET 与 .NET 场景做了两项重要的安全分析改进一是修订System.Uri的模型以更精确地追踪受污染 URItainted URI在代码中的流动二是首次为 Blazor 父组件向子组件传递[Parameter]的过程建立数据流建模。本文以仓库中csharp/ql/lib/change-notes/released/5.1.3.md的官方变更记录为骨架深入System.model.yml与Components.qll的实现源码帮助你理解这两项改进的底层原理、实际影响以及如何利用它们编写更准确的 C# 安全查询。版本背景5.1.3 在 C# 分析库演进中的位置CodeQL 的 C# 分析库位于仓库csharp/ql/lib/目录对应 QL 包codeql-csharp通过版本化的变更记录change-notes来追踪每次发布的用户可见变化。5.1.3 的完整变更内容见 csharp/ql/lib/change-notes/released/5.1.3.md全部归入Minor Analysis Improvements次要分析改进类别The models forSystem.Urihave been modified to better model the flow of tainted URIs.Modeled parameter passing between Blazor parent and child components.与相邻版本对照见 csharp/ql/lib/CHANGELOG.md可以看到一条清晰的演进脉络5.1.0System.Net.Http.HttpRequestMessage与System.UriBuilder的模型被修改以更好建模受污染 URI 的流动Blazor[Parameter]字段若绑定到page指令路由中的变量被建模为远程流源remote flow source。5.1.3把System.Uri本体也纳入受污染 URI 建模体系同时补上 Blazor 组件间父→子参数传递这一数据流缺口。5.1.4Blazor 支持进一步改进——属性以字符串字面量而非nameof表达式指定时也能被正确识别。也就是说5.1.3 是 CodeQL 团队围绕URL/URI 污点流与Blazor 组件数据流两条主线持续加固的中间里程碑。改进一System.Uri模型的修订与受污染 URI 流动MaD 模型CodeQL 描述 .NET API 行为的方式CodeQL 使用MaDModel as Data机制以 YAML 数据行的形式描述 .NET 框架 API 的 taint、summary、sink 等行为C# 提取器的模型文件位于csharp/ql/lib/ext/与csharp/ql/lib/ext/generated/modelgenerator/下。System.Uri的手工模型集中在 csharp/ql/lib/ext/System.model.yml。5.1.3 的修订modified即针对这些数据行。一条典型的 MaD 行结构如下- [System, Uri, False, TryCreate, (System.String,System.UriCreationOptions,System.Uri), , Argument[0], Argument[2], taint, manual]其字段依次为命名空间、类型名、是否泛型、方法名、完整签名、泛型参数、输入from、输出to、流种类taint/value、来源manual表示手工维护区别于modelgenerator自动生成。5.1.3 后System.Uri的完整污染流覆盖从 System.model.yml 的当前实现看System.Uri在污染流建模上形成了闭环1. 构造函数taint 进入实例Uri(String)、Uri(String, Boolean)、Uri(String, UriKind)、Uri(String, UriCreationOptions)Argument[0]字符串源→Argument[this]新建实例taint。相对构造Uri(Uri, String)、Uri(Uri, String, Boolean)Argument[0]与Argument[1]都流向Argument[this]即基 URI 与相对路径任一方被污染组合结果即为受污染 URI。2. 工厂方法三种TryCreate重载字符串或基 URI 参数Argument[0]/Argument[1]→ 输出参数Argument[2]out 的Uritaint。即使解析失败走 out 参数污点也不会丢失。3. 属性与字符串化taint 流出实例AbsoluteUri、DnsSafeHost、LocalPath、OriginalString、PathAndQuery、Query、ToString()Argument[this]→ReturnValuetaint。由此外部输入的 URL 字符串 →new Uri(...)→uri.Query/uri.AbsoluteUri→ 拼进 SQL、重定向目标、日志或 HTTP 请求这条完整链路都能被数据流引擎追踪。这正是better model the flow of tainted URIs的落点此前若只有构造函数或只有 getter 的模型流会在中途断裂现在进、出两个方向都齐备。与之配套5.1.0 已把System.UriBuilder的各个属性Scheme、Host、Path、Query、Fragment等建模为独立的 taint 字段见 System.model.yml进一步补全了 URL 构建场景。对查询编写者的实际价值Open Redirect开放重定向uri.AbsoluteUri或uri.OriginalString直接作为Location跳转目标时污点可追溯到Request.QueryString等远程源。SSRF / 请求伪造Uri实例被用于HttpClient请求时其 Host/Path 的来源可被回溯。SQL/命令注入拼接uri.Query、uri.PathAndQuery进入字符串拼接 sink 时同样可被追踪。若要验证模型是否生效可在自己的查询中跟踪任意Uri派生值观察数据流路径是否跨越构造—访问属性的边界模型行本身也可作为自定义 MaD 扩展的参照范本。改进二Blazor 父子组件参数传递的建模问题背景组件化框架带来的数据流断层Blazor 中父组件通过RenderTreeBuilder.AddComponentParameter向子组件写入[Parameter]属性子组件内通过属性 getter 读取。这种跨组件、跨方法、经框架运行时注入的传值方式对传统过程内数据流分析是天然断层调用AddComponentParameter时值只是一个方法实参分析器并不知道它最终会落到子组件的哪个属性上。5.1.3 的改进正是为这条链补上建模。核心实现在 csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/aspnetcore/Components.qll该文件被远程流源库 csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll 以import ... aspnetcore.Components as Blazor的方式引用说明这套建模直接服务于远程流源与污点分析。关键实现机制拆解Components.qll通过三个层次的 QL 类协作完成建模1. 组件与属性的识别第 62-113 行MicrosoftAspNetCoreComponentsComponent凡是继承自ComponentBase或实现IComponent的类型即为 Blazor 组件。[Parameter]属性getAParameterProperty(name)只选取带MicrosoftAspNetCoreComponentsParameterAttribute的属性。路由参数getARouteParameter()从page /counter/{id:int}/{other?}/{*rest}这类路由模板中解析出id、other、rest支持:int类型约束、?可选、*catch-all再与[Parameter]属性按名称大小写不敏感匹配得到getARouteParameterProperty()。这部分在 5.1.0 已落地用于把路由绑定的参数标记为远程流源。2. 匹配OpenComponent/CloseComponent调用对第 183-208 行matchingOpenCloseComponentCalls在同一个可调用体内把RenderTreeBuilder.OpenComponentT/OpenComponent(Type)与其配对的CloseComponent按语句块内的索引匹配起来并解析出组件类型componentType从而确定这一段渲染代码打开的是哪个组件。3. 非局部跳转节点ComponentParameterJump第 210-265 行——本次改进的核心ParameterPassingCall识别RenderTreeBuilder.AddComponentParameter调用并解析出它写入的子组件属性。解析方式有两种参数名以nameof(...)表达式引用属性getAnAccess匹配或以字符串字面量给出属性名getArgument(1).(StringLiteral).getValue()匹配并校验该属性确属上面匹配到的组件类型且调用位置处于该组件的OpenComponent与CloseComponent之间。ComponentParameterJump extends DataFlow::NonLocalJumpNode把AddComponentParameter的第 3 个参数getParameterValue即传入的值作为跳转节点其getAJumpSuccessor指向子组件属性的访问点prop.getAnAccess()且preservesValue true原值保真传递。NonLocalJumpNode是 CodeQL C# 数据流库中的非局部跳转抽象专门连接那些跨越过程边界、由框架约定的隐式数据流动。ComponentParameterJump的加入让污点分析可以看穿AddComponentParameter直接建立父组件传入值 → 子组件[Parameter]属性 → 子组件内部消费点的完整数据流路径。一个可运行的实战场景// 父组件 Child TitleuserInput / // userInput 来自路由/查询参数远程源 // 子组件 Child.razor [Parameter] public string Title { get; set; } // 经 AddComponentParameter 注入 * 子组件内部 * a hrefTitleGo/a // 若直接输出构成反射型 XSS 风险在 5.1.3 之前Title的赋值来自框架内部的AddComponentParameter调用污点流在组件边界断裂5.1.3 之后userInput的污点可以沿ComponentParameterJump一路传播到a href渲染处的 sink配合 XSS 查询中的 HTML 注入 sink如MarkupString见 4.0.1 变更记录从而命中漏洞。与后续版本的衔接5.1.4见 CHANGELOG.md进一步改进属性名以字符串字面量形式传入AddComponentParameter时也能被识别——这在编译期优化后编译器以字符串常量替代nameof的场景下补上了 5.1.3 建模的最后一个匹配盲区。两版配合Blazor 组件参数链路的识别才算完整。小结变更记录如何指导查询与模型维护从 5.1.3 这份变更记录可以得到三点工程启示模型是数据流分析的地基。System.Uri的进/出双向 taint 行见 System.model.yml决定了一条跨框架边界的污染链能否被完整追踪编写安全查询前应优先核查所涉 API 的 MaD 模型覆盖。框架隐式数据流需要显式建模。Blazor 这类组件框架的运行时注入AddComponentParameter必须通过NonLocalJumpNode之类的跳转节点显式声明分析器才能跨越过程边界参见 Components.qll。版本记录即能力清单。csharp/ql/lib/CHANGELOG.md与change-notes/released/下的逐版本条目是你判断当前 CodeQL C# 分析能力边界、以及排查为什么某条流没被报出时的第一手依据。赞分享静态分析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 库演进System.Text.StringBuilder 数据流与污点建模深度解析CodeQL C 库演进System.Text.StringBuilder 数据流与污点建模深度解析 导读 本文围绕 CodeQL C 库在 2021 年 4静态分析SAST应用安全漏洞扫描代码质量CodeQL C/C 库 2.0.2 分析改进解读fopen 污点流建模与 fgetc/getc 范围分析精度提升CodeQL C/C 库 2.0.2 分析改进解读fopen 污点流建模与 fgetc/getc 范围分析精度提升 导读 本文聚焦 CodeQL 仓库中静态分析SAST应用安全漏洞扫描代码质量CodeQL 1.24 C/C 分析改进全解析新查询、污点追踪库重构与库建模升级CodeQL 1.24 C/C 分析改进全解析新查询、污点追踪库重构与库建模升级 本篇指南完整梳理 CodeQL 1.24 版本针对 C/C 分析的所静态分析SAST应用安全漏洞扫描代码质量上一篇Flink DataStream 双流 Join 完全指南Window Join 与 Interval Join 实战与源码解析下一篇Data-Juicer 视频数据集路径配置指南相对路径与绝对路径在 Ray 集群中的正确使用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

IDEA中npm命令报错?PowerShell执行策略与终端环境配置全解析

IDEA中npm命令报错?PowerShell执行策略与终端环境配置全解析

在IDEA里敲个npm -v,结果迎面一个红色报错——这种事儿,凡是干过前端和Java双修的人,十有八九都碰见过。报错内容还五花八门:有的是npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,后面跟一句“禁止运行脚本”&a…

2026/10/9 2:39:41 阅读更多 →
Git删除中间连续提交:rebase -i与rebase --onto实战指南

Git删除中间连续提交:rebase -i与rebase --onto实战指南

先给你一个真实到不能再真实的场景:你维护一个功能分支,提交了A、B、C、D、E、F六次提交,其中C和D是早期的调试代码,后来发现这些调试已经没用了,而E和F里包含真正的业务逻辑。这时需求就变成了——把中间那两笔提交摘…

2026/10/9 2:39:41 阅读更多 →
Error Prone HashCodeInObjectsHash 检查器:消除 `Objects.hash()` 中的冗余 `hashCode()` 调用

Error Prone HashCodeInObjectsHash 检查器:消除 `Objects.hash()` 中的冗余 `hashCode()` 调用

静态分析代码质量开发工具 【免费下载链接】error-prone Catch common Java mistakes as compile-time errors 项目地址: https://gitcode.com/gh_mirrors/er/error-prone 点击查看 免费下载 Objects.hash(...) 是 Java 中实现 hashCode() 的常用工具,它…

2026/10/9 2:39:41 阅读更多 →

最新新闻

自托管 HTTP 隧道实战:用 Go 实现内网穿透与远程访问

自托管 HTTP 隧道实战:用 Go 实现内网穿透与远程访问

这次的实操目标很明确:一个用 Go 写的 self-hosted HTTP 隧道项目,项目名Smuf。说直白一点,它就是解决"本地服务怎么安全暴露到公网"这个问题的工具,而且强调数据走自己的服务器,不依赖第三方中转平台。如果…

2026/10/9 3:03:53 阅读更多 →
Spring Boot汽车维修管理系统毕设:数据库设计、状态流转与部署避坑指南

Spring Boot汽车维修管理系统毕设:数据库设计、状态流转与部署避坑指南

做毕设选了Springboot汽车维修服务管理系统这类题目的同学,大概率心里都有点打鼓:又是一个“程序源码数据库调试部署”的一站式项目,网上铺天盖地,但到底能不能跑起来、答辩时能不能讲清楚、论文稳不稳,全是未知数。我…

2026/10/9 3:03:53 阅读更多 →
大模型困于局部最优,持续学习如何破解灾难性遗忘?

大模型困于局部最优,持续学习如何破解灾难性遗忘?

最近,强化学习领域的奠基人之一 Richard Sutton 的一段观点又引发了圈内热议:大模型目前更像是被困在“局部最优”里,AI 真正要往前走,必须拥有持续学习的能力。这个判断击中了当前大模型发展的一个核心痛点——我们从海量静态数据…

2026/10/9 3:03:53 阅读更多 →
目标利润定价法:从成本加价到利润倒推的实操模板

目标利润定价法:从成本加价到利润倒推的实操模板

定价这件事,很多人是凭感觉拍脑袋,觉得“成本20块,卖50块差不多了”;也有人直接跟着竞品走,同行卖100我卖98;还有一类人先定价格再倒推成本,卖多少算多少。这三种做法我都试过,最后都…

2026/10/9 3:03:52 阅读更多 →
FFmpeg.AutoGen实战指南:C#直调FFmpeg原生API详解

FFmpeg.AutoGen实战指南:C#直调FFmpeg原生API详解

简介:本资源是一套面向C#开发者的学习实践包,聚焦FFmpeg.AutoGen原生库在.NET环境下的音视频处理实战,适用于具备基础C#编程能力、希望掌握跨语言调用多媒体底层API的中高级开发者。压缩包共174个文件,涵盖111个C头文件&#xff0…

2026/10/9 3:03:52 阅读更多 →
标准模式如何打破大模型办公应用的不可能三角:接入与评测指南

标准模式如何打破大模型办公应用的不可能三角:接入与评测指南

在前段时间的办公场景落地中,我一直在纠结同一个问题:接入大模型能力时,到底该选效果最好的模型,还是选响应最快的通道,或者干脆选最便宜的方案?单独看每个指标都合理,但放到一起就成了一个很难…

2026/10/9 3:02:52 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/7 13:34:55 阅读更多 →