
静态分析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),仅供参考