Skip to content

Commit cab976c

Browse files
committed
C#: Re-factor CommandInjection to use the new API.
1 parent c03ce2f commit cab976c

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ abstract class Sink extends DataFlow::ExprNode { }
2323
abstract class Sanitizer extends DataFlow::ExprNode { }
2424

2525
/**
26+
* DEPRECATED: Use `CommandInjection` instead.
27+
*
2628
* A taint-tracking configuration for command injection vulnerabilities.
2729
*/
2830
class TaintTrackingConfiguration extends TaintTracking::Configuration {
@@ -35,6 +37,32 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
3537
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
3638
}
3739

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

csharp/ql/src/Security Features/CWE-078/CommandInjection.ql

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

1616
import csharp
1717
import semmle.code.csharp.security.dataflow.CommandInjectionQuery
18-
import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph
18+
import CommandInjection::PathGraph
1919

20-
from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink
21-
where c.hasFlowPath(source, sink)
20+
from CommandInjection::PathNode source, CommandInjection::PathNode sink
21+
where CommandInjection::flowPath(source, sink)
2222
select sink.getNode(), source, sink, "This command line depends on a $@.", source.getNode(),
2323
"user-provided value"

csharp/ql/src/Security Features/CWE-078/StoredCommandInjection.ql

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,19 @@
1616
import csharp
1717
import semmle.code.csharp.security.dataflow.flowsources.Stored
1818
import semmle.code.csharp.security.dataflow.CommandInjectionQuery
19-
import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph
19+
import StoredCommandInjection::PathGraph
2020

21-
class StoredTaintTrackingConfiguration extends TaintTrackingConfiguration {
22-
override predicate isSource(DataFlow::Node source) { source instanceof StoredFlowSource }
21+
module StoredCommandInjectionConfig implements DataFlow::ConfigSig {
22+
predicate isSource(DataFlow::Node source) { source instanceof StoredFlowSource }
23+
24+
predicate isSink = CommandInjectionConfig::isSink/1;
25+
26+
predicate isBarrier = CommandInjectionConfig::isBarrier/1;
2327
}
2428

25-
from StoredTaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink
26-
where c.hasFlowPath(source, sink)
29+
module StoredCommandInjection = TaintTracking::Global<StoredCommandInjectionConfig>;
30+
31+
from StoredCommandInjection::PathNode source, StoredCommandInjection::PathNode sink
32+
where StoredCommandInjection::flowPath(source, sink)
2733
select sink.getNode(), source, sink, "This command line depends on a $@.", source.getNode(),
2834
"stored (potentially user-provided) value"

0 commit comments

Comments
 (0)