https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll/type.TaintTrackingImpl$Configuration.html
我在写东西的时候发现了几种场景,CodeQL的污点追踪不会识别,所以我们需要通过覆盖isAdditionalTaintStep谓词,手动增加对这些数据流的支持。

例如,A = B+C,B是污点,识别不出A也是污点的话,我们可以告诉CodeQL:原始污点(B)加上另一个数值(C)的时候认为这个整体(B+C)也是一个污点。

前置知识

MethodAccess有两种形式

  1. f(...)
  1. e.m(...)

可以通过如下方法获得e

  1. from MethodAccess ma
  2. select ma.getQualifier()

可以通过如下方法获得m

  1. from MethodAccess ma
  2. select ma.getMethod()

https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$LambdaExpr.html
LambdaExpr
asMethod方法,可以将LambdaExpr转为Method类型

情景一 sink是source方法的返回值

image.png
默认情况下,在使用污点追踪时,只能追踪到第二个位置,无法把type变量继续当作污点。

参考一下CodeQL提供的CWE示例
C:\Users\loulan\Desktop\CodeQL\vscode-codeql-starter\ql\java\ql\src\experimental\Security\CWE\CWE-094\InsecureDexLoading.qll
image.png
image.png

  1. Expr getQualifier()
  2. Gets the qualifying expression of this method access, if any.
  3. 获取此方法访问的限定表达式(如果有)。

最终代码
image.png

情景二 sink是source的数组元素

如下所示,contents是sources时,默认情况下,无法将content试别为sink
image.png
contents.forEach(..) 是一个MethodAccess,contents是这个MethodAccess的Qualifier
content-> {..} 是一个LambdaExpr
content是一个parameter
image.png
最终代码
image.png