CodeQL JavaScript 分析 1.20 版本改进全解析:新查询、现有查询精化与 QL 库演进
发布时间:2026/9/27 2:29:24来源:尧图网络
静态分析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 JavaScript 分析在 1.20 版本中的全部改进涵盖通用分析能力增强、11 个新增查询、17 项现有查询变更以及 5 条 QL 库接口变化。通过结合当前仓库中查询源码如 ZipSlip.ql、ArrowMethodOnVueInstance.ql 等进行验证帮助查询开发者与安全研究人员理解这些改进对检出能力、误报率与自定义查询编写方式的具体影响。通用改进框架支持与分析能力增强框架与库支持显著扩展1.20 版本对大量 JavaScript 框架与库的分析支持得到改进覆盖异步流程控制、桌面应用、服务端框架、Cookie 操作、前端组件与实时通信等多个领域具体包括a-sync-waterfall异步流程控制库改进了基于回调链的跨过程数据流分析Electron桌面应用框架改进了对主进程与渲染进程间通信模式的分析ExpressNode.js 服务端框架改进了路由、中间件与请求处理链的建模hapiNode.js 服务端框架改进了其插件体系与请求生命周期处理js-cookieCookie 读写库改进了对 Cookie 值来源与流向的追踪React前端组件库改进了对组件 props、state 与生命周期方法中的数据流分析socket.io实时通信库改进了对事件收发链路中数据的追踪Vue前端框架新增了对 Vue 实例方法绑定等特性的专项检测见下文新增查询。这些框架模型通常定义于javascript/ql/src下的框架建模文件中服务于数据流分析与安全查询的 source/sink 识别从而提升安全查询的真实阳性检出率。文件分类识别更多生成文件文件分类file classification机制现在可以识别额外的生成文件例如由 HTML Tidy 这类工具产出的文件。该改进的意义在于生成文件通常不应作为安全告警的分析目标正确的分类可以减少无关告警并提升查询在源码文件上的聚焦程度。文件分类相关实现位于 JavaScript 分析的文件分类模块中负责在查询评估前对源文件进行过滤与标注。污点跟踪库持久化存储、类字段与回调流污点跟踪taint tracking库在以下场景中新增了流识别能力持久化存储经由本地存储localStorage、会话存储sessionStorage等持久化通道传递的污点数据可被跨函数、跨模块追踪类字段class fields通过对象属性与类字段存储再读取的污点数据现在可以被跟踪回调callbacks部分场景下污点数据经过回调函数间接传递的路径可以被识别。此外对正则表达式的处理也得到改进。这些增强意味着安全查询可能产生更多结果尤其对跨站脚本XSS、命令注入、路径注入等依赖污点传播的安全查询。类型推断函数调用场景增强针对函数调用的类型推断type inference得到改进。这使依赖类型信息的查询如原型污染检测、动态属性访问检测、基于调用方/被调用方匹配的流分析可能获得额外的分析结果。Closure-Library 模块系统支持CodeQL 现在支持 Google Closure-Library 的goog.module模块系统ES6 风格模块作为传统goog.provide的替代方案。这意味着基于该模块系统组织的代码可以被正确解析为模块边界模块导出、导入间的数据流可以跨文件正确建立从而避免因模块解析失败导致的漏报。新增查询11 个新检测规则详解1.20 为 JavaScript 分析新增了 11 个查询覆盖安全、正确性、可靠性与可维护性四个维度。下表完整列出这些查询及其标签与目的查询标签目的归档解压过程中的任意文件写入Zip Slipjs/zipslipsecurity, external/cwe/cwe-022识别允许任意文件覆盖的解压例程可能违反 CWE-022路径遍历。结果默认显示于 LGTMVue 实例上的箭头方法js/vue/arrow-method-on-vue-instancereliability, frameworks/vue标记用作 Vue 实例方法的箭头函数。结果默认显示于 LGTM不受限制目标源origin的跨窗口通信js/cross-window-information-leaksecurity, external/cwe/201, external/cwe/359标记在未限制接收窗口源的情况下向其他窗口发送潜在敏感信息的代码可能违反 CWE-201 与 CWE-359。结果默认显示于 LGTM双重转义或双重反转义js/double-escapingcorrectness, security, external/cwe/cwe-116标记对特殊字符进行双重转义或双重反转义的潜在问题可能违反 CWE-116。结果默认显示于 LGTM不完整的 hostname 正则表达式js/incomplete-hostname-regexpcorrectness, security, external/cwe/cwe-020标记可能不完整的 hostname 净化器sanitizer违反 CWE-020。结果默认显示于 LGTM不完整的 URL 子串净化无独立 IDcorrectness, security, external/cwe/cwe-020标记可能不完整的 URL 净化器违反 CWE-020。结果默认显示于 LGTM错误的后缀检查js/incorrect-suffix-checkcorrectness, security, external/cwe/cwe-020标记基于indexOf的易错后缀检查可能违反 CWE-020。结果默认显示于 LGTM因移位而跳过的循环迭代js/loop-iteration-skipped-due-to-shiftingcorrectness标记在遍历数组时删除元素导致循环跳过部分元素的代码。结果默认显示于 LGTM未使用的属性js/unused-propertymaintainability标记未被使用的属性。结果默认显示于 LGTM无用的比较测试js/useless-comparison-testcorrectness标记因数值比较恒真或恒假而不可达的代码。结果默认显示于 LGTM源码级验证Zip Slip 查询Zip Slip 查询的实现在 ZipSlip.ql其完整元数据声明了js/zipslip的查询 ID、path-problem类型、error严重级别以及 7.5 的安全严重性评分。查询体通过semmle.javascript.security.dataflow.ZipSlipQuery模块导入ZipSlipFlow污点流模型并以path-problem形式输出从污点源未经净化的归档条目到污点汇聚点文件系统操作的完整路径from PathNode source, PathNode sink where ZipSlipFlow::flowPath(source.getAnOriginalPathNode(), sink.getAnOriginalPathNode()) select source.getNode(), source, sink, Unsanitized archive entry, which may contain .., is used in a $., sink.getNode(), file system operation对应的查询帮助文档 ZipSlip.qhelp 给出了典型攻击场景若压缩包包含条目..\sneaky-file且解压目标目录为c:\output直接拼接路径会得到c:\output\..\sneaky-file最终将文件写入c:\sneaky-file。修复建议是确保由归档条目构造的输出路径中不出现..元素。源码级验证Vue 箭头方法查询Vue 实例箭头方法查询实现在 ArrowMethodOnVueInstance.ql其检测逻辑值得关注由于箭头函数不绑定自己的this当它被用作 Vue 实例方法时this不会指向 Vue 实例。查询通过Vue::Component提取实例绑定的函数instance.getABoundFunction()检查绑定目标是否是箭头函数表达式ArrowFunctionExpr并在箭头函数体内存在this引用时发出告警from Vue::Component instance, DataFlow::Node def, DataFlow::FunctionNode arrow, ThisExpr dis where instance.getABoundFunction() def and arrow.flowsTo(def) and arrow.asExpr() instanceof ArrowFunctionExpr and arrow.asExpr() dis.getEnclosingFunction()该查询属于可靠性/正确性类reliability、correctness、frameworks/vue标签严重级别为warning。其他新查询的源码位置其余新查询在当前仓库中均有对应实现读者可深入阅读其检测逻辑跨窗口信息泄露PostMessageStar.ql位于 CWE-201 目录检测postMessage使用通配目标源*的场景双重转义DoubleEscaping.ql不完整 hostname 正则IncompleteHostnameRegExp.ql。现有查询变更误报率下降与检出能力提升下表完整列出了 1.20 版本对既有查询的变更及预期影响查询预期影响变更内容Ambiguous HTML id attribute误报减少对模板的处理更加保守精度已调整为 highAssignment to exports variable结果减少不再标记同时被 Useless assignment to local variable 查询标记的代码Client-side cross-site scripting真阳性增加、误报减少识别易受 HTML 注入攻击的 WinJS 函数不再标记 jQuery 的某些安全用法识别自定义净化器Hard-coded credentials误报减少不再将空字符串标记为硬编码用户名Insecure randomness结果增加标记crypto.pseudoRandomBytes的不安全使用Reflected cross-site scripting误报减少识别自定义净化器Stored cross-site scripting误报减少识别自定义净化器Unbound event handler receiverjs/unbound-event-handler-receiver误报减少识别更多类方法被绑定的方式Uncontrolled data used in network request结果增加识别易受注入影响的 host 值Uncontrolled data used in path expression误报减少识别可防止路径遍历的 Expressroot选项Unneeded defensive code真阳性与误报均改善识别更多防御性代码模式Unsafe dynamic method access误报减少不再将拼接字符串标记为不安全的动态方法名Unused parameter误报减少不再标记带前导下划线_的参数Unused variable, import, function or class误报减少减少被 JSX 元素隐式使用的变量的误报不再标记带前导下划线的变量与死代码中的变量Unvalidated dynamic method call真阳性增加在更多场景下将拼接字符串标记为未验证的方法名Useless assignment to property误报减少正确处理具有复杂右侧表达式的赋值Useless conditional结果减少忽略更多防御性编码模式Useless conditional真阳性增加标记函数调用值的更多使用场景解读本次变更的共性趋势从表格可以归纳出三个明显的演进方向自定义净化器识别XSS 类查询客户端、反射型、存储型全面引入自定义净化器识别能力。此前净化器需在框架模型中预先声明现在查询可以识别用户自定义的净化函数直接降低安全查询的误报率。下划线命名约定豁免unused-parameter与unused-variable两类查询不再标记带前导下划线的标识符。这符合 JavaScript/TypeScript 社区中下划线前缀表示有意未使用的惯例属于对常见编码约定的适配。防御性代码模式白名单化unneeded-defensive-code与useless-conditional两类查询通过识别更多合法防御模式来减少误报同时后者也对函数调用返回值的使用场景补充了真阳性检测。QL 库变更自定义数据流查询的编写方式调整本版本对 JavaScript 数据流 QL 库进行了 5 项重要调整其中前两项直接影响自定义 source 节点的编写方式是查询开发者需要特别关注的破坏性变更1.DataFlow::SourceNode不再抽象扩展方式改变DataFlow::SourceNode不再是抽象类。若要新增 source 节点应改为扩展DataFlow::SourceNode::Range子类。这意味着自定义 source 的注册入口从直接继承SourceNode迁移到基于Range的模块化扩展使 source 定义可以与节点类型解耦、按需组合。2.DataFlow::PropRead子类不再自动成为 sourceDataFlow::PropRead的子类不再被自动视为 source 节点。若希望属性读取成为污点/数据流 source需要额外定义对应的DataFlow::SourceNode::Range子类。这是为配合第 1 项变更而做的配套调整source 的身份现在必须显式声明而非由类型系统隐式赋予。3. 已废弃库被移除已废弃的semmle.javascript.DataFlow与semmle.javascript.dataflow.CallGraph库被彻底移除两者均由semmle.javascript.dataflow.DataFlow取代。若现有自定义查询仍引用旧库名需要迁移到新库路径否则查询编译将失败。4.getACallee()覆盖方式变化覆盖DataFlow::InvokeNode.getACallee()不再影响跨过程数据流库所见到的调用图。要实现此目的应改而覆盖单参数版本getACallee(int imprecision)。该调整将调用图定制与数据流精度参数绑定使数据流分析可以基于 imprecision 参数分层控制调用图细节同时避免破坏默认调用图视图。5. 内部谓词returnedPropWrite移除谓词DataFlow::returnedPropWrite原本仅用于内部实现现已不再对外可用。任何依赖该内部谓词的自定义查询都需要寻找替代实现方式如基于公开的PropWrite与数据流 API 重写。小结CodeQL JavaScript 分析 1.20 版本是一次精化型发布通用分析层面补齐了主流框架建模、持久化存储与回调污点流、类型推断与 Closure-Library 模块支持查询层面新增 11 个覆盖安全与正确性的检测规则并对既有查询进行了大规模误报治理QL 库层面则完成了数据流 source 扩展机制的接口重构。对查询开发者而言最需要立即跟进的是SourceNode/PropRead的 source 声明方式变化以及两个旧库的移除对使用 LGTM 或 CodeQL CLI 运行 JavaScript 分析的用户而言升级后可能观察到安全查询结果数量的增减——前者来自污点跟踪与类型推断增强后者来自各类误报治理——这两类变化均属预期行为。赞分享静态分析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 1.18 C 分析改进全解新查询、查询重构与 QL 库 API 演进CodeQL 1.18 C 分析改进全解新查询、查询重构与 QL 库 API 演进 导读 本文以 CodeQL 仓库的 change notes/1.18/a静态分析SAST应用安全漏洞扫描代码质量CodeQL 1.20 的 C/C 分析改进详解新查询、查询更新与 QL 库增强CodeQL 1.20 的 C/C 分析改进详解新查询、查询更新与 QL 库增强 本指南基于 CodeQL 仓库中 change notes/1.20/a静态分析SAST应用安全漏洞扫描代码质量CodeQL 1.21 C/C 分析改进全解新增安全查询、既有查询强化与 QL 库 API 更新CodeQL 1.21 C/C 分析改进全解新增安全查询、既有查询强化与 QL 库 API 更新 本文以 CodeQL 仓库 change notes/1静态分析SAST应用安全漏洞扫描代码质量创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网