CodeQL C++ 查询 `cpp/uncontrolled-allocation-size` 1.2.1 改进:将“可能缩减用户输入的算术运算“识别为污点屏障,显著降低误报

发布时间:2026/10/6 7:43:42

CodeQL C++ 查询 `cpp/uncontrolled-allocation-size` 1.2.1 改进:将“可能缩减用户输入的算术运算“识别为污点屏障,显著降低误报 静态分析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 查询集在 1.2.1 版本发布说明cpp/ql/src/change-notes/released/1.2.1.md中的一条关键改进展开cpp/uncontrolled-allocation-sizeUncontrolled allocation size不可控分配大小查询现在会把可能缩减用户输入数值的算术运算视为污点传播的屏障barrier从而显著减少误报。读完本文你将理解该查询检测的漏洞本质CWE-190 整数溢出 / CWE-789 不受控的内存分配、1.2.1 变更背后的源码实现bounded谓词与屏障判定逻辑以及如何借助仓库内的测试用例验证这些行为。查询背景什么是不可控分配大小漏洞cpp/uncontrolled-allocation-size用于检测一类高危内存安全问题程序使用外部用户可控的值作为malloc、realloc、new/new[]等内存分配的大小从而可能让攻击者诱导程序一次性分配任意数量的内存造成资源耗尽拒绝服务或整数溢出后的小块分配进而引发后续越界写。从查询源文件 TaintedAllocationSize.ql 的元数据可以看到该查询的定位元数据字段值含义nameUncontrolled allocation size查询显示名kindpath-problem输出为污染源 → 汇聚点的完整污点路径problem.severityerror默认告警级别为 errorsecurity-severity8.1GitHub Security Lab 安全严重度评分precisionmedium中等精度idcpp/uncontrolled-allocation-size查询唯一标识tagsreliability、security、CWE-190、CWE-789分类标签该查询本质是一个全局污点追踪taint tracking查询它继承semmle.code.cpp.ir.dataflow.TaintTracking将外部输入命令行参数、环境变量、文件内容、网络数据等来自 FlowSources.qll 定义的FlowSource作为污染源将分配表达式的整型子表达式作为汇聚点sink并通过TaintTracking::GlobalTaintedAllocationSizeConfig计算污染路径。命中后报告This allocation size is derived from $ and could allocate arbitrary amounts of memory.该分配大小源自用户输入可能分配任意数量的内存1.2.1 变更内容解读发布说明原文Thecpp/uncontrolled-allocation-sizequery now considers arithmetic operations that might reduce the size of user input as a barrier. The query therefore produces fewer false positive results.即凡是可能缩小用户输入数值范围的算术运算现在都会被当作污点屏障污点流在该处被切断查询因此不再对看似来自用户输入、实则已被显著约束的分配大小告警从而减少误报。这里的关键判断是很多程序会对用户输入先做取模、除法、右移、按位与等缩减型运算再交给分配函数。例如malloc(n % 100)、malloc(n 7)虽然仍与用户输入相关但结果被限制在一个很小的范围内不可能造成不受控的大块分配。1.2.1 之前这类代码可能被误报1.2.1 之后则被正确识别为安全模式。源码级实现bounded谓词与屏障判定1.2.1 改进的落点集中在查询配置的isBarrier谓词中TaintedAllocationSize.ql。一个污点节点node满足以下任一条件即成为屏障bounded(e)—— 表达式是不会溢出或可能大幅缩小取值范围的算术运算指针减法PointerDiffExpr的操作数 —— 两个指针相减结果通常很小前提是程序保证了定义良好变量存在上界检查hasUpperBoundsCheck变量在某基本块内被相等性检查约束nodeIsBarrierEquality分配函数自身的形参节点阻止污点流进入分配函数内部造成重复结果。其中第 1 条正是本次变更的核心其实现位于 Bounded.qll该文件同时被cpp/uncontrolled-arithmetic、cpp/tainted-arithmetic复用。bounded(e)的判定规则如下不会溢出的算术运算e是UnaryArithmeticOperation、BinaryArithmeticOperation或AssignArithmeticOperation且convertedExprMightOverflow(e)不成立通过 SimpleRangeAnalysis.qll 的区间分析证明其不可能溢出。源码注释特别提醒必须先排除不可分析的情况否则会把一切无法分析的表达式误判为 bounded。乐观假定结果远小于输入的操作RemExpr取模%—— 结果恒小于除数DivExpr除法/—— 结果不会大于被除数RShiftExpr右移—— 结果必然缩小BitwiseAndExpr按位与且其某个操作数的上界小于结果类型的最大值boundedBitwiseAnd即upperBound(operand) exprMaxVal(andExpr)。赋值变体对%、/、在左值getLValue()上放置屏障对则要求右值满足boundedBitwiseAnd。注意查询对于相加、相乘这类可能扩大数值的运算并不设屏障因此malloc(tainted * sizeof(T))这类模式仍会被报告——这与测试用例的表现一致。测试用例印证哪些代码被放行哪些仍被报告仓库为该查询维护了完整的测试集test.cpp 与对应期望输出 TaintedAllocationSize.expected可以逐条印证 1.2.1 的屏障语义仍被报告BAD / Alert污点未被屏障切断int tainted atoi(argv[1]); malloc(tainted); // BAD malloc(tainted * sizeof(T)); // BAD乘法不设屏障 malloc(sizeof(T) tainted); // BAD加法不设屏障 new char[tainted]; // BAD realloc(p, sizeof(T) * tainted); // BAD malloc(atol(getenv(USER)) * sizeof(int)); // BADlong 也可能溢出 MyMalloc1(tainted); // BAD自定义分配函数同样被启发式识别被屏障放行GOODmalloc(sizeof(T)); // 常量大小本就无污点 int size tainted % 100; malloc(size * sizeof(int)); // GOOD取模结果有界 int size2 tainted 7; malloc(size2 * sizeof(int)); // GOOD按位与截断 malloc(bounded(size, MAX)); // GOOD显式钳制到 [1, MAX] if (size 0) malloc(size * sizeof(int)); // GOOD正数上界不会溢出 if (size 100) malloc(size * sizeof(int));// GOOD相等性检查 new char[end - start]; // GOOD指针差特别值得关注的是测试文件中的两组对比size的钳制bounded函数把输入限制在[1, MAX_SIZE]与if (size 100)这类只约束下限、未约束上限的判断。前者被判定为 GOOD后者size 100时仍可能无限大在期望输出中标记为MISSING: Alert——即已知的未被检测案例这也解释了为什么该查询的精度标注为medium而非high。s 0 → s 0、s 100 → s 100的双向钳制同样被正确放行。此外期望文件还展示了多类污染源路径命令行参数**argv→atoi、环境变量getenv→atoi/atol、流输入cin 、跨函数返回get_tainted_size、输出参数回传get_size(out)以及自定义包装分配器MyMalloc1/MyMalloc2可作为理解污点传播覆盖面的完整样例。屏障体系的其余部分上界检查与相等性检查除算术屏障外isBarrier还包含两类基于守卫条件guard的屏障共同构成 1.2.1 之后的完整判定体系上界检查hasUpperBoundsCheckreadsVariable若变量参与过某个关系运算、、、且比较对象不是0则认为该变量存在上界约束后续以它为大小的分配被放行。if (size 0) malloc(size * sizeof(int))即由此类屏障豁免。相等性检查variableEqualityCheckedInBlock/nodeIsBarrierEquality借助 IRGuards.qll 的ensuresEq判断变量在当前基本块内是否被保证等于某个值如size 100、size ! 100 → return后的size 100。测试中的equality_cases与equality_barrier覆盖了、!、短路/||、输出参数等组合。这两类屏障与 1.2.1 新增的算术屏障协同工作各自处理由守卫约束和由运算本身约束两种有界场景。分配函数的启发式识别范围更广的汇聚点该查询对汇聚点的识别并不局限于标准库。它基于HeuristicAllocationExpr/HeuristicAllocationFunction定义于 Allocation.qll这类可能分配内存的启发式类除malloc、realloc、calloc、operator new等内置模型外凡是函数名与形参形态符合分配语义的自定义函数如测试中的MyMalloc1、my_alloc也会被纳入检测范围汇聚点即分配表达式中类型为整型的子表达式见allocSink谓词。这一点源自 0.5.1 的变更change-notes/released/0.5.1.mdenhanced with heuristic detection of allocations而 0.0.12 则将该查询从普通告警改造为path-problem污点路径查询change-notes/released/0.0.12.md。1.2.1 的算术屏障改进是在这两次结构性升级之上的精度优化三者在 CHANGELOG.md 中均有记录。如何在本仓库中运行与验证该查询位于 cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql属codeql/cpp-queries查询包的一部分。常规用法用codeql database create对目标 C/C 工程建库用codeql database analyze db cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql单独执行该查询或加入完整查询套件运行全部安全查询在 SARIF 或文本报告中查看cpp/uncontrolled-allocation-size的告警与污点路径。若想复现本文引用的全部判定行为可直接运行仓库自带的 QL 测试测试入口为 TaintedAllocationSize.qlref指向被测查询输入为 test.cpp期望输出为 TaintedAllocationSize.expected。在cpp/ql目录下执行codeql test run test/query-tests/Security/CWE/CWE-190/semmle/TaintedAllocationSize即可对比实际结果与期望值直观观察屏障逻辑的效果。小结1.2.1 对cpp/uncontrolled-allocation-size的改进是一项典型的降误报、保召回精度优化通过Bounded.qll中bounded谓词对取模、除法、右移、按位与及可证明不会溢出的算术运算统一建模并在TaintedAllocationSize.ql的isBarrier中将其作为污点屏障查询得以区分直接使用用户输入与用户输入经有界化处理两种形态。结合既有的上界检查、相等性检查、指针差与分配函数形参屏障该查询在保持对 CWE-190/CWE-789 覆盖的同时误报率显著下降其行为在仓库测试集中有完整的可复现依据。赞分享静态分析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 安全查询解析用「栅栏」消减误报的 Uncontrolled Allocation Sizecpp/uncontrolled-allocation-sizeCodeQL C/C 安全查询解析用「栅栏」消减误报的 Uncontrolled Allocation Sizecpp/uncontrolled all静态分析SAST应用安全漏洞扫描代码质量Hindsight Obsidian 集成演进全览从插件首发到无头 CLI 同步引擎Hindsight Obsidian 集成演进全览从插件首发到无头 CLI 同步引擎 Hindsight 的 Obsidian 插件npm 包 vecto静态分析SAST应用安全漏洞扫描代码质量Academic Research Skills 快速上手8 种研究模式怎么选30 分钟出一份带引用的研究简报Academic Research Skills 快速上手8 种研究模式怎么选30 分钟出一份带引用的研究简报 先说结论Academic Research静态分析SAST应用安全漏洞扫描代码质量上一篇Translumo终极指南如何在5分钟内掌握Windows实时屏幕翻译神器下一篇5分钟快速掌握Windows和Office免费智能激活终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/6 8:48:45

降AI实战:三招消除AI味,让文字恢复活人感

“降AI”这个词,今年在论文圈和职场写作圈里出现的频率肉眼可见地变高了。我第一次注意到它,是帮学生改课程论文的时候:一篇用AI工具快速生成的文献综述,信息铺得挺全,逻辑也通,可导师一眼就判定“这不是你…

2026/10/6 8:48:45

Windows共享文件夹访问报错“账户已锁定”的排查与解决

1. "引用的账户当前已锁定"到底锁的是什么 遇到这个报错时,很多人第一反应是去检查共享文件夹的权限设置,或者重新配一遍SMB协议。我在帮朋友和同事处理这类问题时发现,方向从一开始就偏了——这个报错跟共享文件夹本身的权限配置关…

2026/10/6 8:48:45

厂区人员定位系统深度解析:UWB与蓝牙混合定位选型与实施

一提到“厂区人员定位系统”,很多人第一反应就是GPS。但如果你真的去过化工厂、电厂、钢铁车间的现场,就会发现事情没那么简单——厂房里根本没有GPS信号,钢结构和密集设备会让各种无线信号乱反射,员工的安全帽、防爆服也在遮挡信…

2026/10/6 8:48:45

CSAPP第六章:存储器层次结构与缓存优化实战解析

说实话,我是在啃到《CSAPP》第六章的时候,才第一次真正理解了什么叫“程序跑得慢,很多时候不是CPU不行,而是数据在等公交车”。这本书的中文译名是《深入理解计算机系统》,“06”这个编号在绝大多数读者心里都指向同一…

2026/10/6 8:48:45

数据孤岛怎么破?iPaaS集成平台从原理到落地全解析

数据孤岛这事儿,做IT的老哥们应该都不陌生。销售用CRM,财务用ERP,运营手里一堆Excel表格,客服的工单系统又是另一个平台,各玩各的,数据对不上,报表靠人工导来导去。更头疼的是,领导一…

2026/10/6 8:43:45

SQL开发导航地图:Gudu SQL Omni插件实战

如果你和我一样,每天要在几十张表、上百个存储过程里来回确认“这个字段到底在哪些地方被用过”“这个视图到底依赖哪几张表”,那下面这些东西应该能帮到你。先说结论:我把 Gudu SQL Omni 装进 IntelliJ IDEA 之后,最直观的感受就…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑