Skip to content

Commit b772af4

Browse files
committed
feat(dataflow): Refactor DataFlow module and add TaintTracking functionality
1 parent 6c35f7c commit b772af4

File tree

5 files changed

+82
-23
lines changed

5 files changed

+82
-23
lines changed

ql/lib/codeql/bicep/DataFlow.qll

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,2 @@
1-
/**
2-
* Provides classes for performing local (intra-procedural) and
3-
* global (inter-procedural) data flow analyses.
4-
*/
5-
6-
import codeql.Locations
7-
8-
/**
9-
* Provides classes for performing local (intra-procedural) and
10-
* global (inter-procedural) data flow analyses.
11-
*/
12-
module DataFlow {
13-
private import codeql.dataflow.DataFlow
14-
import DataFlowMake<Location, BicepDataFlow>
15-
import Public
16-
}
1+
import dataflow.Ssa
2+
import dataflow.DataFlow
Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
private import codeql.dataflow.DataFlow
2-
private import codeql.bicep.AST
3-
private import codeql.bicep.CFG as Cfg
4-
private import codeql.bicep.dataflow.Ssa as Ssa
5-
private import codeql.Locations
1+
/**
2+
* Provides classes for performing local (intra-procedural) and
3+
* global (inter-procedural) data flow analyses.
4+
*/
5+
6+
import bicep
7+
8+
module DataFlow {
9+
private import internal.DataFlowImplSpecific
10+
private import codeql.dataflow.DataFlow
11+
import DataFlowMake<Location, BicepDataFlow>
12+
import internal.DataFlowImpl
13+
}

ql/lib/codeql/bicep/dataflow/internal/DataFlowImplSpecific.qll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,4 @@
2121
class ParameterNode = Private::ParameterNodeImpl;
2222

2323
Node exprNode(DataFlowExpr e) { result = Public::exprNode(e) }
24-
25-
// predicate neverSkipInPathGraph = Private::neverSkipInPathGraph/1;
2624
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
private import bicep
2+
private import DataFlowPrivate
3+
private import TaintTrackingPublic
4+
private import codeql.bicep.CFG
5+
private import codeql.bicep.dataflow.DataFlow
6+
7+
/**
8+
* Holds if `node` should be a sanitizer in all global taint flow configurations
9+
* but not in local taint.
10+
*/
11+
predicate defaultTaintSanitizer(DataFlow::Node node) { none() }
12+
13+
/**
14+
* Holds if default `TaintTracking::Configuration`s should allow implicit reads
15+
* of `c` at sinks and inputs to additional taint steps.
16+
*/
17+
bindingset[node]
18+
predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::ContentSet c) { none() }
19+
20+
cached
21+
private module Cached {
22+
private import codeql.bicep.dataflow.internal.DataFlowImplCommon as DataFlowImplCommon
23+
24+
cached
25+
predicate forceCachingInSameStage() { DataFlowImplCommon::forceCachingInSameStage() }
26+
27+
/**
28+
* Holds if the additional step from `nodeFrom` to `nodeTo` should be included
29+
* in all global taint flow configurations.
30+
*/
31+
cached
32+
predicate defaultAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo, string model) {
33+
none()
34+
}
35+
36+
/**
37+
* Holds if taint propagates from `nodeFrom` to `nodeTo` in exactly one local
38+
* (intra-procedural) step.
39+
*/
40+
cached
41+
predicate localTaintStepCached(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
42+
DataFlow::localFlowStep(nodeFrom, nodeTo) or
43+
defaultAdditionalTaintStep(nodeFrom, nodeTo, _)
44+
}
45+
}
46+
47+
import Cached
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
private import bicep
2+
private import TaintTrackingPrivate
3+
private import codeql.bicep.CFG
4+
private import codeql.bicep.dataflow.DataFlow
5+
6+
/**
7+
* Holds if taint propagates from `source` to `sink` in zero or more local
8+
* (intra-procedural) steps.
9+
*/
10+
pragma[inline]
11+
predicate localTaint(DataFlow::Node source, DataFlow::Node sink) { localTaintStep*(source, sink) }
12+
13+
/**
14+
* Holds if taint can flow from `e1` to `e2` in zero or more
15+
* local (intra-procedural) steps.
16+
*/
17+
pragma[inline]
18+
predicate localExprTaint(CfgNodes::ExprCfgNode e1, CfgNodes::ExprCfgNode e2) { none() }
19+
20+
predicate localTaintStep = localTaintStepCached/2;

0 commit comments

Comments
 (0)