Skip to content

Commit 4bca951

Browse files
authored
Merge pull request github#12803 from michaelnebel/csharp/refactordataflow3
C#: Re-factor dataflow queries to use the new API.
2 parents 8a4ca7f + e648c64 commit 4bca951

21 files changed

+249
-109
lines changed

csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ abstract class Sink extends DataFlow::ExprNode { }
2626
abstract class Sanitizer extends DataFlow::ExprNode { }
2727

2828
/**
29+
* DEPRECATED: Use `TaintedPath` instead.
30+
*
2931
* A taint-tracking configuration for uncontrolled data in path expression vulnerabilities.
3032
*/
31-
class TaintTrackingConfiguration extends TaintTracking::Configuration {
33+
deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration {
3234
TaintTrackingConfiguration() { this = "TaintedPath" }
3335

3436
override predicate isSource(DataFlow::Node source) { source instanceof Source }
@@ -38,6 +40,22 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
3840
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
3941
}
4042

43+
/**
44+
* A taint-tracking configuration for uncontrolled data in path expression vulnerabilities.
45+
*/
46+
private module TaintedPathConfig implements DataFlow::ConfigSig {
47+
predicate isSource(DataFlow::Node source) { source instanceof Source }
48+
49+
predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
50+
51+
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
52+
}
53+
54+
/**
55+
* A taint-tracking module for uncontrolled data in path expression vulnerabilities.
56+
*/
57+
module TaintedPath = TaintTracking::Global<TaintedPathConfig>;
58+
4159
/** A source of remote user input. */
4260
class RemoteSource extends Source instanceof RemoteFlowSource { }
4361

csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ abstract class Sanitizer extends DataFlow::ExprNode { }
3333
abstract deprecated class SanitizerGuard extends DataFlow::BarrierGuard { }
3434

3535
/**
36+
* DEPRECATED: Use `UrlRedirect` instead.
37+
*
3638
* A taint-tracking configuration for reasoning about unvalidated URL redirect vulnerabilities.
3739
*/
38-
class TaintTrackingConfiguration extends TaintTracking::Configuration {
40+
deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration {
3941
TaintTrackingConfiguration() { this = "UrlRedirect" }
4042

4143
override predicate isSource(DataFlow::Node source) { source instanceof Source }
@@ -49,6 +51,22 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
4951
}
5052
}
5153

54+
/**
55+
* A taint-tracking configuration for reasoning about unvalidated URL redirect vulnerabilities.
56+
*/
57+
private module UrlRedirectConfig implements DataFlow::ConfigSig {
58+
predicate isSource(DataFlow::Node source) { source instanceof Source }
59+
60+
predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
61+
62+
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
63+
}
64+
65+
/**
66+
* A taint-tracking module for reasoning about unvalidated URL redirect vulnerabilities.
67+
*/
68+
module UrlRedirect = TaintTracking::Global<UrlRedirectConfig>;
69+
5270
/** A source of remote user input. */
5371
class RemoteSource extends Source instanceof RemoteFlowSource { }
5472

csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ private class InsecureXmlSink extends Sink {
4444
abstract class Sanitizer extends DataFlow::Node { }
4545

4646
/**
47+
* DEPRECATED: Use `XmlEntityInjection` instead.
48+
*
4749
* A taint-tracking configuration for untrusted user input used in XML processing.
4850
*/
49-
class TaintTrackingConfiguration extends TaintTracking::Configuration {
51+
deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration {
5052
TaintTrackingConfiguration() { this = "XMLInjection" }
5153

5254
override predicate isSource(DataFlow::Node source) { source instanceof Source }
@@ -61,6 +63,36 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
6163
}
6264
}
6365

66+
/**
67+
* A taint-tracking configuration for untrusted user input used in XML processing.
68+
*/
69+
private module XmlEntityInjectionConfig implements DataFlow::ConfigSig {
70+
predicate isSource(DataFlow::Node source) { source instanceof Source }
71+
72+
predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
73+
74+
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
75+
}
76+
77+
/**
78+
* A taint-tracking module for untrusted user input used in XML processing.
79+
*/
80+
module XmlEntityInjection implements DataFlow::GlobalFlowSig {
81+
import TaintTracking::Global<XmlEntityInjectionConfig> as Super
82+
import Super
83+
84+
/**
85+
* Holds if data can flow from `source` to `sink`.
86+
*
87+
* The corresponding paths are generated from the end-points and the graph
88+
* included in the module `PathGraph`.
89+
*/
90+
predicate flowPath(XmlEntityInjection::PathNode source, XmlEntityInjection::PathNode sink) {
91+
Super::flowPath(source, sink) and
92+
exists(sink.getNode().(Sink).getReason())
93+
}
94+
}
95+
6496
private class SimpleTypeSanitizer extends Sanitizer, SimpleTypeSanitizedExpr { }
6597

6698
private class GuidSanitizer extends Sanitizer, GuidSanitizedExpr { }

csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ abstract class Sink extends DataFlow::ExprNode { }
2424
abstract class Sanitizer extends DataFlow::ExprNode { }
2525

2626
/**
27+
* DEPRECATED: Use `XpathInjection` instead.
28+
*
2729
* A taint-tracking configuration for untrusted user input used in XPath expression.
2830
*/
29-
class TaintTrackingConfiguration extends TaintTracking::Configuration {
31+
deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration {
3032
TaintTrackingConfiguration() { this = "XPathInjection" }
3133

3234
override predicate isSource(DataFlow::Node source) { source instanceof Source }
@@ -36,6 +38,32 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
3638
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
3739
}
3840

41+
/**
42+
* A taint-tracking configuration for untrusted user input used in XPath expression.
43+
*/
44+
module XpathInjectionConfig implements DataFlow::ConfigSig {
45+
/**
46+
* Holds if `source` is a relevant data flow source.
47+
*/
48+
predicate isSource(DataFlow::Node source) { source instanceof Source }
49+
50+
/**
51+
* Holds if `sink` is a relevant data flow sink.
52+
*/
53+
predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
54+
55+
/**
56+
* Holds if data flow through `node` is prohibited. This completely removes
57+
* `node` from the data flow graph.
58+
*/
59+
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
60+
}
61+
62+
/**
63+
* A taint-tracking module for untrusted user input used in XPath expression.
64+
*/
65+
module XpathInjection = TaintTracking::Global<XpathInjectionConfig>;
66+
3967
/** A source of remote user input. */
4068
class RemoteSource extends Source instanceof RemoteFlowSource { }
4169

csharp/ql/lib/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ abstract class Sanitizer extends DataFlow::ExprNode { }
2727
*/
2828
abstract deprecated class SanitizerGuard extends DataFlow::BarrierGuard { }
2929

30-
/** A taint tracking configuration for Zip Slip */
31-
class TaintTrackingConfiguration extends TaintTracking::Configuration {
30+
/**
31+
* DEPRECATED: Use `ZipSlip` instead.
32+
*
33+
* A taint tracking configuration for Zip Slip.
34+
*/
35+
deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration {
3236
TaintTrackingConfiguration() { this = "ZipSlipTaintTracking" }
3337

3438
override predicate isSource(DataFlow::Node source) { source instanceof Source }
@@ -42,6 +46,22 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
4246
}
4347
}
4448

49+
/**
50+
* A taint tracking configuration for Zip Slip.
51+
*/
52+
private module ZipSlipConfig implements DataFlow::ConfigSig {
53+
predicate isSource(DataFlow::Node source) { source instanceof Source }
54+
55+
predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
56+
57+
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
58+
}
59+
60+
/**
61+
* A taint tracking module for Zip Slip.
62+
*/
63+
module ZipSlip = TaintTracking::Global<ZipSlipConfig>;
64+
4565
/** An access to the `FullName` property of a `ZipArchiveEntry`. */
4666
class ArchiveFullNameSource extends Source {
4767
ArchiveFullNameSource() {

csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,30 @@
1010
*/
1111

1212
import csharp
13-
import DataFlow::PathGraph
13+
import UnsafeYearCreationFromArithmetic::PathGraph
1414

15-
class UnsafeYearCreationFromArithmeticConfiguration extends TaintTracking::Configuration {
16-
UnsafeYearCreationFromArithmeticConfiguration() {
17-
this = "UnsafeYearCreationFromArithmeticConfiguration"
18-
}
19-
20-
override predicate isSource(DataFlow::Node source) {
15+
module UnsafeYearCreationFromArithmeticConfig implements DataFlow::ConfigSig {
16+
predicate isSource(DataFlow::Node source) {
2117
exists(ArithmeticOperation ao, PropertyAccess pa | ao = source.asExpr() |
2218
pa = ao.getAChild*() and
2319
pa.getProperty().hasQualifiedName("System.DateTime", "Year")
2420
)
2521
}
2622

27-
override predicate isSink(DataFlow::Node sink) {
23+
predicate isSink(DataFlow::Node sink) {
2824
exists(ObjectCreation oc |
2925
sink.asExpr() = oc.getArgumentForName("year") and
3026
oc.getObjectType().getABaseType*().hasQualifiedName("System", "DateTime")
3127
)
3228
}
3329
}
3430

31+
module UnsafeYearCreationFromArithmetic =
32+
TaintTracking::Global<UnsafeYearCreationFromArithmeticConfig>;
33+
3534
from
36-
UnsafeYearCreationFromArithmeticConfiguration config, DataFlow::PathNode source,
37-
DataFlow::PathNode sink
38-
where config.hasFlowPath(source, sink)
35+
UnsafeYearCreationFromArithmetic::PathNode source, UnsafeYearCreationFromArithmetic::PathNode sink
36+
where UnsafeYearCreationFromArithmetic::flowPath(source, sink)
3937
select sink, source, sink,
4038
"This $@ based on a 'System.DateTime.Year' property is used in a construction of a new 'System.DateTime' object, flowing to the 'year' argument.",
4139
source, "arithmetic operation"

csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,20 @@ import csharp
1818
import ParallelSink
1919
import ICryptoTransform
2020

21-
class NotThreadSafeCryptoUsageIntoParallelInvokeConfig extends TaintTracking::Configuration {
22-
NotThreadSafeCryptoUsageIntoParallelInvokeConfig() {
23-
this = "NotThreadSafeCryptoUsageIntoParallelInvokeConfig"
24-
}
25-
26-
override predicate isSource(DataFlow::Node source) {
21+
module NotThreadSafeCryptoUsageIntoParallelInvokeConfig implements DataFlow::ConfigSig {
22+
predicate isSource(DataFlow::Node source) {
2723
source instanceof LambdaCapturingICryptoTransformSource
2824
}
2925

30-
override predicate isSink(DataFlow::Node sink) { sink instanceof ParallelSink }
26+
predicate isSink(DataFlow::Node sink) { sink instanceof ParallelSink }
3127
}
3228

33-
from Expr e, string m, LambdaExpr l, NotThreadSafeCryptoUsageIntoParallelInvokeConfig config
29+
module NotThreadSafeCryptoUsageIntoParallelInvoke =
30+
TaintTracking::Global<NotThreadSafeCryptoUsageIntoParallelInvokeConfig>;
31+
32+
from Expr e, string m, LambdaExpr l
3433
where
35-
config.hasFlow(DataFlow::exprNode(l), DataFlow::exprNode(e)) and
34+
NotThreadSafeCryptoUsageIntoParallelInvoke::flow(DataFlow::exprNode(l), DataFlow::exprNode(e)) and
3635
m =
3736
"A $@ seems to be used to start a new thread is capturing a local variable that either implements 'System.Security.Cryptography.ICryptoTransform' or has a field of this type."
3837
select e, m, l, "lambda expression"

csharp/ql/src/Security Features/CWE-022/TaintedPath.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
import csharp
1818
import semmle.code.csharp.security.dataflow.TaintedPathQuery
19-
import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph
19+
import TaintedPath::PathGraph
2020

21-
from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink
22-
where c.hasFlowPath(source, sink)
21+
from TaintedPath::PathNode source, TaintedPath::PathNode sink
22+
where TaintedPath::flowPath(source, sink)
2323
select sink.getNode(), source, sink, "This path depends on a $@.", source.getNode(),
2424
"user-provided value"

csharp/ql/src/Security Features/CWE-022/ZipSlip.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

1515
import csharp
1616
import semmle.code.csharp.security.dataflow.ZipSlipQuery
17-
import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph
17+
import ZipSlip::PathGraph
1818

19-
from TaintTrackingConfiguration zipTaintTracking, DataFlow::PathNode source, DataFlow::PathNode sink
20-
where zipTaintTracking.hasFlowPath(source, sink)
19+
from ZipSlip::PathNode source, ZipSlip::PathNode sink
20+
where ZipSlip::flowPath(source, sink)
2121
select source.getNode(), source, sink,
2222
"Unsanitized archive entry, which may contain '..', is used in a $@.", sink.getNode(),
2323
"file system operation"

csharp/ql/src/Security Features/CWE-091/XMLInjection.ql

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,17 @@
1212
*/
1313

1414
import csharp
15-
import DataFlow::PathGraph
1615
import semmle.code.csharp.security.dataflow.flowsources.Remote
1716
import semmle.code.csharp.frameworks.system.Xml
17+
import XmlInjection::PathGraph
1818

1919
/**
2020
* A taint-tracking configuration for untrusted user input used in XML.
2121
*/
22-
class TaintTrackingConfiguration extends TaintTracking::Configuration {
23-
TaintTrackingConfiguration() { this = "XMLInjection" }
22+
module XmlInjectionConfig implements DataFlow::ConfigSig {
23+
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
2424

25-
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
26-
27-
override predicate isSink(DataFlow::Node sink) {
25+
predicate isSink(DataFlow::Node sink) {
2826
exists(MethodCall mc |
2927
mc.getTarget().hasName("WriteRaw") and
3028
mc.getTarget().getDeclaringType().getABaseType*().hasQualifiedName("System.Xml", "XmlWriter")
@@ -33,7 +31,7 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
3331
)
3432
}
3533

36-
override predicate isSanitizer(DataFlow::Node node) {
34+
predicate isBarrier(DataFlow::Node node) {
3735
exists(MethodCall mc |
3836
mc.getTarget().hasName("Escape") and
3937
mc.getTarget()
@@ -46,7 +44,12 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
4644
}
4745
}
4846

49-
from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink
50-
where c.hasFlowPath(source, sink)
47+
/**
48+
* A taint-tracking module for untrusted user input used in XML.
49+
*/
50+
module XmlInjection = TaintTracking::Global<XmlInjectionConfig>;
51+
52+
from XmlInjection::PathNode source, XmlInjection::PathNode sink
53+
where XmlInjection::flowPath(source, sink)
5154
select sink.getNode(), source, sink, "This XML element depends on a $@.", source.getNode(),
5255
"user-provided value"

0 commit comments

Comments
 (0)