
静态分析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.24 版本对 JavaScript/TypeScript 分析模块的官方更新说明见 change-notes/1.24/analysis-javascript.md展开系统梳理该版本在语言支持、数据流分析精度、7 个新安全/正确性查询、17 个既有查询的变更以及核心库 API 语义调整等方面的全部内容。读者将掌握如何利用新查询识别 XSS、ReDoS、原型污染等漏洞理解 sanitizer 与 flow label 的交互变化并能结合仓库源码定位每个查询与库实现的具体位置为升级或定制 JavaScript 安全分析提供直接参考。一、版本总览一次以精度与召回率为核心的分析升级CodeQL 1.24 的 JavaScript 分析改进主要围绕四个方向展开语言与工程支持新增 TypeScript 3.8 支持引入新的告警抑制语法数据流分析精度导入解析、sanitizer 语义、调用图构建均有实质性改进直接提升了安全查询的检出率更多结果与准确率更少误报查询集扩充新增 7 个查询其中 2 个为正确性查询5 个为安全查询并对既有查询做了 17 项行为调整库与 API 语义修订RegExpTerm前后继谓词改为文本顺序、实现可扩展的EventEmitter模型、调整 taint-tracking 与dataflow label 的交互规则。以下各节将逐项展开并给出仓库内对应的源码、测试与配置路径作为佐证。二、一般性改进从解析到数据流的全链路增强2.1 TypeScript 3.8 语言支持该版本正式支持 TypeScript 3.8。从仓库结构看JavaScript 提取器以 Java 实现javascript/extractor而查询库中与类型相关的能力集中在 javascript/ql/lib/semmle/javascript 与Classes.qll等类型库中。TypeScript 3.8 带来的新语法如export * as ns from x导出声明、弱类型检测等需要在提取器与 QL 库两端同步支持本文 2.3 节会看到该项改进在导入解析上的直接收益。2.2 新的告警抑制语法块注释与行注释双支持此前告警抑制通常依赖特定的注释约定1.24 版本起支持两种注释形态单行块注释/* ... */行注释// ...即在同一行代码上使用上述任一种注释包裹告警标识如js/xss形式的查询 ID即可抑制对应告警。这一能力与 CodeQL CLI 的告警抑制机制配合便于在代码评审中针对单条告警做精确豁免。2.3 导入解析增强三种场景带来更多安全查询结果导入import解析的改进直接影响数据流能否跨越模块边界从而显著提升安全查询的召回率.js扩展名解析到 TypeScript 文件当导入语句引用由 TypeScript 编译生成的.js文件时现在可将其解析到对应的.ts源文件。这意味着经由编译产物的数据流能够回溯到真正的源代码跨文件污点路径得以建立。tsconfig.json路径映射解析依赖tsconfig.json中paths/baseUrl配置的路径别名导入现在可以被正确解析。仓库中关于 TypeScript 配置解析的实现可从 javascript/ql/lib/semmle/javascript 下的模块解析相关库进一步查阅。export * as ns from x精确分析TypeScript 3.8 引入的命名空间再导出语法export * as ns from x此前在调用图与数据流中无法被精确建模本版本起可正确解析其成员访问链。2.4 Sanitizer 分析改进更准确的污点净化判定Sanitizer净化器语义的两处调整直接关系到安全查询的误报率跨函数边界的守卫guard此前 sanitizer guard 仅在同一函数内生效本版本起在更多场景下可跨越函数边界传播值已被净化的事实使得经过净化函数后继续流向危险 sink的路径能被正确识别为安全。区分被污染的值与包含被污染值的对象sanitizer 现在能更好地区分两种情况——值本身携带污点与对象的一个属性携带污点。这为第 5 节中库变更提到的 taint label 与datalabel 解耦奠定了基础。2.5 调用图构建改进解析更多间接调用形态调用图call graph的完善让数据流可以穿过更多间接调用间接定义的类成员在更多场景下调用可解析到间接定义的类成员例如通过混入、装饰器或原型扩展定义的成员部分调用partial invocation经由.bind等部分应用产生的调用现在可在更多情况下被解析到实际目标函数。这在 javascript/ql/lib/semmle/javascript 的调用图与Classes.qll实现中均有体现。2.6 Flow summaries 移至 experimental 目录对流摘要flow summaries又称汇总用于描述库函数的数据流行为的支持被明确标记为实验性并整体迁移到新的experimental目录。仓库中对应目录为 javascript/ql/src/experimental其下包含Security/、StandardLibrary/、heuristics/、poi/等子模块。此举意味着使用 flow summaries 的查询不被视作稳定 API生产环境依赖需谨慎评估其行为变化。三、新增查询详解7 个查询守护安全与正确性新查询的完整清单含查询 ID、标签与用途如下表所示其中 6 个在 LGTM 上默认展示1 个js/xss-through-exception默认不展示查询标签用途Cross-site scripting through exceptionjs/xss-through-exceptionsecurity, external/cwe/cwe-079, external/cwe/cwe-116将异常文本写入 DOM 时可能引发的 XSS 漏洞默认不在 LGTM 展示Missing awaitjs/missing-awaitcorrectness以无意义方式直接操作 Promise 对象而未await其结果Polynomial regular expression used on uncontrolled datajs/polynomial-redossecurity, external/cwe/cwe-730, external/cwe/cwe-400可能作用于恶意输入的高开销多项式复杂度正则Prototype pollution in utility functionjs/prototype-pollution-utilitysecurity, external/cwe/cwe-400, external/cwe/cwe-471递归赋值操作中易受原型污染影响的模式Regular expression always matchesjs/regex/always-matchescorrectness, regular-expressions因匹配空子串而平凡成功的正则检查Unsafe jQuery pluginjs/unsafe-jquery-plugin—设计不安全的 jQuery 插件中潜在的 XSS 漏洞Unnecessary use ofcatprocessjs/unnecessary-use-of-catcorrectness, security, maintainability应改用 fs API 却执行cat命令的情况3.1 js/xss-through-exception异常文本被当作 HTML 重解释该查询以path-problem形式数据流路径图报告将异常文本重解释为 HTML 而未转义元字符的漏洞。其实现位于 javascript/ql/src/Security/CWE-079/ExceptionXss.ql核心逻辑import semmle.javascript.security.dataflow.ExceptionXssQuery import DataFlow::DeduplicatePathGraphExceptionXssFlow::PathNode, ExceptionXssFlow::PathGraph from PathNode source, PathNode sink where ExceptionXssFlow::flowPath(source.getAnOriginalPathNode(), sink.getAnOriginalPathNode()) select sink.getNode(), source, sink, $ is reinterpreted as HTML without escaping meta-characters., source.getNode(), source.getNode().(Source).getDescription()典型场景是catch (e) { document.body.innerHTML e.message }之类将异常信息可能包含攻击者可控内容直接注入 DOM 的代码。查询元数据标注了problem.severity warning、security-severity 6.1、precision high并归属 CWE-079XSS与 CWE-116编码/转义。默认不在 LGTM 展示适合作为深度扫描的补充规则。3.2 js/missing-await对 Promise 的无意义操作该正确性查询实现位于 javascript/ql/src/Expressions/MissingAwait.ql。其判定逻辑非常值得学习isAsyncCall若某调用的所有已知被调方都是async函数则假定该调用返回 PromiseisPromise调用async函数、或表达式的类型绑定是 Promise 类型时成立isBadPromiseContext将 Promise 结果用于二元运算逻辑/instanceof 除外、逻辑表达式的左操作数、一元运算void/delete除外、自增自减、条件表达式条件、if条件、for-in迭代域等对 Promise 对象无意义的上下文时触发。典型误用示例const len fetch(url).lengthPromise 没有length、if (promise) { ... }Promise 恒为真值。这类代码几乎总是忘记await属于高置信度正确性缺陷precision high标签 quality/reliability/correctness。3.3 js/polynomial-redos多项式复杂度正则的拒绝服务风险实现位于 javascript/ql/src/Performance/PolynomialReDoS.ql。该查询与安全查询套件联动见 javascript/ql/src/codeql-suites/javascript-security-and-quality.qls从库与RegExp分析javascript/ql/lib/semmle/javascript/Regexp.qll中推导正则的复杂度识别在不受控输入上可能产生灾难性回溯catastrophic backtracking的多项式复杂度模式归属 CWE-730资源耗尽与 CWE-400。3.4 js/prototype-pollution-utility递归赋值中的原型污染实现位于 javascript/ql/src/Security/CWE-915/PrototypePollutingFunction.ql归属 CWE-400 与 CWE-471对象原型修改。它专门针对工具函数如递归merge、extend、defaults中通过obj[key] value递归合并对象、且key可能为__proto__/constructor.prototype等危险键的赋值路径是 2021 年前后流行的原型污染攻击面在静态分析中的典型建模。3.5 js/regex/always-matches平凡成功的正则检查实现位于 javascript/ql/src/RegExp/RegExpAlwaysMatches.ql标签为 correctness、regular-expressions。它识别通过匹配空子串而平凡成功的正则——例如/a*/总是能匹配因为*允许零次出现若被用作if (/a*/.test(input))之类的守卫则条件恒真暴露逻辑缺陷。3.6 js/unsafe-jquery-plugin不安全的 jQuery 插件设计实现位于 javascript/ql/src/Security/CWE-079/UnsafeJQueryPlugin.ql。jQuery 插件常将用户数据写入 DOM若插件设计时未对传入内容做转义例如直接$(this).html(userInput)则形成 XSS。该查询针对这类unsafely designed插件模式与 jQuery 框架模型见 javascript/ql/lib/semmle/javascript 下的框架库配合工作。3.7 js/unnecessary-use-of-cat不必要的 cat 子进程实现位于 javascript/ql/src/Security/CWE-078/UselessUseOfCat.ql标签涵盖 correctness、security、maintainability。它标记出本可使用fs.readFile等 API 完成、却通过child_process.exec(cat file)等方式启动cat命令的代码——这类写法既低效又可能引入命令注入风险外部拼接文件路径时同时降低可维护性。四、既有查询变更17 项行为调整明细既有查询的变更可归纳为三类更多结果提升召回、更少结果降低误报、降级显示调整严重度展示。4.1 召回提升更多结果6 项查询变更说明Clear-text logging of sensitive informationjs/clear-text-logging识别到更多涉及process.env与对日志方法间接调用的结果Incomplete URL scheme checkjs/incomplete-url-scheme-check识别更多 URL scheme 检查的变体形式Uncontrolled command linejs/command-line-injection识别更多向cmd.exe与/bin/sh构造参数的方式Uncontrolled data used in path expressionjs/path-injection识别更多危险路径的构造与使用方式其中后两者直接受益于 2.32.5 节的导入解析与调用图改进跨模块、跨间接调用的污点路径得以补全。4.2 精度提升更少结果 / 更少误报10 项查询变更说明Duplicate parameter namesjs/duplicate-parameter-name忽略可合理重名的附加参数Expression has no effectjs/useless-expression识别块级流类型注解忽略 try 块首语句Identical operandsjs/redundant-operation排除通过/--改变操作数值的场景Incomplete string escaping or encodingjs/incomplete-sanitization排除单次替换可能是有意为之的额外场景Missing CSRF middlewarejs/missing-token-validation减少重复报告仅标记显式访问 cookie 数据的处理器Superfluous trailing argumentsjs/superfluous-trailing-arguments排除使用Function.arguments处理变长参数的函数Unbound event handler receiverjs/unbound-event-handler-receiver识别更多事件处理器 receiver 被绑定的方式Use of call stack introspection in strict modejs/strict-mode-call-stack-introspection不再标记表达式语句Use of password hash with insufficient computational effortjs/insufficient-password-hash排除更多无需安全哈希的场景Useless regular-expression character escapejs/useless-regexp-character-escape区分字符串中的转义与正则字面量中的转义4.3 严重度调整1 项Syntax errorjs/syntax-error的结果改为以更低严重度展示避免语法级提示在告警列表中喧宾夺主。五、库变更API 语义修订与可扩展模型5.1 RegExpTerm 前后继谓词改为文本顺序RegExpTerm.getSuccessor与RegExpTerm.getPredecessor从操作operational匹配顺序改为文本textual匹配顺序。二者的区别仅在**后行断言lookbehind**中显现后行断言在操作上是反向匹配的例如(?ab)中操作上b先于a被匹配。此前getSuccessor模拟了这一操作顺序导致在断言(?ab)中b被认为是a的前驱predecessor而非后继successor。但按文本顺序a在b之前本版本起遵循文本顺序。仓库实现位于 javascript/ql/lib/semmle/javascript/Regexp.qll相关 QLdoc 注释已明确标注为 matched (textually) before/after。配套的库测试位于 javascript/ql/test/library-tests/RegExp/predecessors_and_successors包含getSuccessor.ql/getPredecessor.ql及其.expected基线文件读者可运行codeql test run验证该语义变更。这一修改影响所有基于正则 term 顺序推导的库与查询如IncompleteMultiCharacterSanitizationQuery.qll、UnsafeHtmlExpansion.ql、UnmatchableDollar.ql、UnmatchableCaret.ql等均位于 javascript/ql/lib/semmle/javascript 与 javascript/ql/src 下使文本顺序成为统一的、可预期的一致性约定。5.2 可扩展的 EventEmitter 模式模型实现了对 Node.jsEventEmitter模式的可扩展模型位于 javascript/ql/lib/semmle/javascript/frameworks/EventEmitter.qll。该模块提供chainableMethod()返回链式方法名off、removeAllListeners、removeListener、setMaxListeners及注册方法on()返回注册事件处理器的方法名集合addListener、on、once、prependListener、prependOnceListenertrackEventEmitter通过类型追踪TypeTracker跟踪 EventEmitter 对象的流向包括链式方法调用后的别名传播。该模型的设计意图是让分析者通过扩展EventRegistration::Range与EventDispatch::Range两个类为注册事件处理器与派发事件这两类行为建模从而让事件驱动的数据流例如通过事件传递的污点可被安全查询追踪。这也为后续版本中 WebSocket、Socket.IO 等事件框架模型提供了公共基础设施参见 javascript/ql/lib/semmle/javascript/frameworks/WebSocket.qll 与 javascript/ql/lib/semmle/javascript/frameworks/SocketIO.qll。5.3 Taint-tracking 与 data flow label 的交互调整这是本版本最需要关注的行为变更直接影响组合了污点追踪与 flow label 的查询1 参数isSource谓词关联的标签变化由 1 参数isSource谓词添加的源此前关联data标签现在改为关联taint标签。Sanitizer 只阻断taint标签sanitizer 不再阻断包装在对象属性中的被污染值的流动。也就是说若对象obj的属性obj.x被污染而 sanitizer 作用于obj本身则obj.x的污点仍可继续流动。迁移指引若需保留旧行为sanitizer 同时阻断属性携带的污点应改用 barrier屏障或使用带标签的 sanitizer 显式阻断dataflow label。这一语义调整的动机正是 2.4 节所述区分被污染的值与包含被污染值的对象——属性级污点datalabel 承载的对象结构信息与值级污点taintlabel从此分道扬镳查询作者需要根据自身污点模型选择合适的阻断手段。六、框架与库支持扩展30 个生态目标该版本对以下框架与库的模型支持进行了改进。这些改进多数体现为 javascript/ql/lib/semmle/javascript/frameworks 目录下的 QL 模块与模型文件.qll、model.yml、model.json以及 javascript/ql/lib/semmle/javascript 中的通用库浏览器/前端jQuery、typeahead.js、Handlebars、ReactNode.js 核心与文件系统Node.js、http2、fs 相关jsonfile、node-dir、ncp、recursive-readdir、rimraf、vinyl-fs、path-exists、write-file-atomic、fstream、for-in、for-own、lazy-cache、send网络与实时通信WebSocket、ws、Socket.IO、SockJS、SockJS-client、request、chrome-remote-interface、Koa、pg、mongodb桌面/进程Electron以仓库中可验证的实现为例pgPostgreSQL 驱动与mongodb的模型采用 Models-as-Data 方式由数据驱动文件 javascript/ql/lib/semmle/javascript/frameworks/pg/model.yml及同名model.json与 javascript/ql/lib/semmle/javascript/frameworks/mongodb/model.yml 描述便于不修改 QL 代码即可扩展污点源、sink 与步骤WebSocket/Socket.IO/Electron 等则在对应的.qll模块中实现。这些模型的改进直接提升了 SQL 注入pg/mongodb、命令注入、XSS、路径注入等安全查询在真实生态代码上的召回率。七、如何验证与使用这些改进7.1 运行新查询在本地 CodeQL CLI 环境中可按如下方式针对一个 JavaScript 代码库运行新查询# 先创建数据库假设已有 codeql CLI codeql database create my-db --languagejavascript --source-root./src # 运行单个新查询 codeql database analyze my-db javascript/ql/src/Security/CWE-079/ExceptionXss.ql --formatsarif-latest --outputresult.sarif # 或运行完整安全与质量套件 codeql database analyze my-db javascript/ql/src/codeql-suites/javascript-security-and-quality.qls --formatsarif-latest --outputresult.sarif其中js/xss-through-exception等默认不在 LGTM 展示的查询可手动指定运行以获得更深度的覆盖。7.2 验证 RegExpTerm 语义仓库提供了可直接运行的库测试用于验证getSuccessor/getPredecessor的文本顺序语义javascript/ql/test/library-tests/RegExp/predecessors_and_successors/getSuccessor.qljavascript/ql/test/library-tests/RegExp/predecessors_and_successors/getPredecessor.ql运行codeql test run javascript/ql/test/library-tests/RegExp/predecessors_and_successors即可对照.expected基线确认行为符合文本顺序。7.3 适配 sanitizer 语义变更若你自定义的查询组合了 taint-tracking 与 flow labels升级到 1.24 后应检查源定义1 参数isSource现在产生taint标签污点如需纯数据流请改用带标签的isSource或改用data标签净化逻辑原有 sanitizer 不再阻断对象属性携带的污点如确需阻断请改为 barrier 或使用标签化 sanitizer 显式拦截data标签回归测试建议运行 javascript/ql/test 下涉及 taint-tracking 的测试用例观察.expected基线是否符合预期行为。结语CodeQL 1.24 的 JavaScript 分析改进体现了静态分析工程中召回率与精度的持续平衡通过 TypeScript 3.8 支持、导入解析与调用图增强扩大分析覆盖面通过 sanitizer 语义细化与 flow label 解耦降低误报同时以 7 个新查询和 17 项既有查询调整覆盖 XSS、ReDoS、原型污染、Promise 误用等真实风险。对于查询作者而言本版本最值得关注的是RegExpTerm文本顺序语义与 taint/data 标签交互变化——它们既是理解既有查询行为的前提也是编写新数据流查询时必须遵守的约定。赞分享静态分析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多语言支持架构深度剖析CodeQL多语言支持架构深度剖析 CodeQL作为先进的静态分析工具其多语言支持架构展现了现代代码分析技术的精髓。本文深入剖析了CodeQL对C、Jav静态分析SAST应用安全漏洞扫描代码质量Screenkey与key-mon对比哪个更适合你的屏幕录制需求终极指南Screenkey与key mon对比哪个更适合你的屏幕录制需求终极指南 如果你正在寻找最佳的屏幕录制工具来展示键盘输入那么你很可能已经听说过 ScreeDraper查询方法深度解析让装饰器支持ActiveRecord风格查询Draper查询方法深度解析让装饰器支持ActiveRecord风格查询 Draper装饰器查询方法是Rails应用中实现视图逻辑与业务逻辑分离的强大工具。通后端上一篇wpgtk安装与部署从源码编译到系统集成的完整流程下一篇从0到1Spinnaker与Huawei CCI深度集成实战指南 - 完整教程与最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考