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有两种形式
f(...)
e.m(...)
可以通过如下方法获得e
from MethodAccess ma
select ma.getQualifier()
可以通过如下方法获得m
from MethodAccess ma
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方法的返回值
默认情况下,在使用污点追踪时,只能追踪到第二个位置,无法把type变量继续当作污点。
参考一下CodeQL提供的CWE示例
C:\Users\loulan\Desktop\CodeQL\vscode-codeql-starter\ql\java\ql\src\experimental\Security\CWE\CWE-094\InsecureDexLoading.qll
Expr getQualifier()
Gets the qualifying expression of this method access, if any.
获取此方法访问的限定表达式(如果有)。
情景二 sink是source的数组元素
如下所示,contents是sources时,默认情况下,无法将content试别为sink
contents.forEach(..) 是一个MethodAccess,contents是这个MethodAccess的Qualifier
content-> {..} 是一个LambdaExpr
content是一个parameter
最终代码