CodeQL 文档

JavaScript 数据流速查表

本文介绍了 JavaScript 库中通常用于变体分析和数据流查询的部分。

污点跟踪路径查询

使用以下模板创建污点跟踪路径查询

/**
 * @kind path-problem
 */
import javascript
import DataFlow
import DataFlow::PathGraph

class MyConfig extends TaintTracking::Configuration {
  MyConfig() { this = "MyConfig" }
  override predicate isSource(Node node) { ... }
  override predicate isSink(Node node) { ... }
  override predicate isAdditionalTaintStep(Node pred, Node succ) { ... }
}

from MyConfig cfg, PathNode source, PathNode sink
where cfg.hasFlowPath(source, sink)
select sink.getNode(), source, sink, "taint from $@.", source.getNode(), "here"

此查询报告以下流程路径

  • isSource 匹配的节点开始。
  • 通过变量、函数调用、属性、字符串、数组、Promise、异常和 isAdditionalTaintStep 添加的步骤进行。
  • 在由 isSink 匹配的节点结束。

另请参阅:“全局数据流”和“创建路径查询。”

DataFlow 模块

使用数据流节点独立于语法匹配程序元素。另请参阅:“分析 JavaScript 和 TypeScript 中的数据流。”

DataFlow:: 模块中的谓词

DataFlow:: 模块中的类和成员谓词

StringOps 模块

  • StringOps::Concatenation - 字符串连接,使用加号运算符、模板字面量或数组连接调用
  • StringOps::StartsWith - 检查字符串是否以某些内容开头
  • StringOps::EndsWith - 检查字符串是否以某些内容结尾
  • StringOps::Includes - 检查字符串是否包含某些内容
  • StringOps::RegExpTest - 检查字符串是否与正则表达式匹配

实用程序

系统和网络

不受信任的数据

注意:某些 RemoteFlowSource 实例,例如来自 WebSocket 的输入,不属于上述任何特定子类别。

文件

AST 节点

另请参阅:“用于处理 JavaScript 和 TypeScript 程序的抽象语法树类。”

DataFlow 和 AST 节点之间的转换

字符串匹配

  • x.matches(“escape%”) - 如果 x 以“escape”开头,则成立
  • x.regexpMatch(“escape.*”) - 如果 x 以“escape”开头,则成立
  • x.regexpMatch(“(?i).*escape.*”) - 如果 x 包含“escape”(不区分大小写),则成立

访问路径

当多个属性访问链接在一起时,它们会形成所谓的“访问路径”。

要根据访问路径识别节点,请在 AccessPath 模块中使用以下谓词

getAReferenceTogetAnAssignmentTo 具有用于全局访问路径的 1 参数版本,以及用于从给定节点开始的访问路径的 2 参数版本。

类型跟踪

另请参阅:“使用类型跟踪进行 API 建模。”

使用以下模板定义前向类型跟踪谓词

import DataFlow

SourceNode myType(TypeTracker t) {
  t.start() and
  result = /* SourceNode to track */
  or
  exists(TypeTracker t2 |
    result = myType(t2).track(t2, t)
  )
}

SourceNode myType() {
  result = myType(TypeTracker::end())
}

使用以下模板定义后向类型跟踪谓词

import DataFlow

SourceNode myType(TypeBackTracker t) {
  t.start() and
  result = (/* argument to track */).getALocalSource()
  or
  exists(TypeBackTracker t2 |
    result = myType(t2).backtrack(t2, t)
  )
}

SourceNode myType() {
  result = myType(TypeBackTracker::end())
}

故障排除

  • 将调用节点用作接收器?尝试使用 getArgument 获取调用节点的参数
  • 尝试将 moduleImportmoduleMember 用作调用节点?尝试使用 getACall 获取对导入函数的调用,而不是函数本身。
  • 由于类型不兼容而导致编译失败?确保 AST 节点和 DataFlow 节点没有混淆。使用 asExpr()flow() 进行转换。
  • ©GitHub, Inc.
  • 条款
  • 隐私