Skip to content

Commit 434b1b3

Browse files
authored
Merge pull request github#12698 from egregius313/egregius313/java/refactor-commandline-query-and-request-forgery
Java: Refactor CommandLineQuery.qll and RequestForgeryConfig.qll
2 parents 6af973a + 744f265 commit 434b1b3

File tree

6 files changed

+61
-10
lines changed

6 files changed

+61
-10
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: deprecated
3+
---
4+
* The `execTainted` predicate in `CommandLineQuery.qll` has been deprecated and replaced with the predicate `execIsTainted`.
5+

java/ql/lib/semmle/code/java/security/CommandLineQuery.qll

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ import semmle.code.java.security.ExternalProcess
1212
import semmle.code.java.security.CommandArguments
1313

1414
/**
15+
* DEPRECATED: Use `RemoteUserInputToArgumentToExecFlow` instead.
16+
*
1517
* A taint-tracking configuration for unvalidated user input that is used to run an external process.
1618
*/
17-
class RemoteUserInputToArgumentToExecFlowConfig extends TaintTracking::Configuration {
19+
deprecated class RemoteUserInputToArgumentToExecFlowConfig extends TaintTracking::Configuration {
1820
RemoteUserInputToArgumentToExecFlowConfig() {
1921
this = "ExecCommon::RemoteUserInputToArgumentToExecFlowConfig"
2022
}
@@ -33,12 +35,52 @@ class RemoteUserInputToArgumentToExecFlowConfig extends TaintTracking::Configura
3335
}
3436

3537
/**
38+
* A taint-tracking configuration for unvalidated user input that is used to run an external process.
39+
*/
40+
module RemoteUserInputToArgumentToExecFlowConfig implements DataFlow::ConfigSig {
41+
predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
42+
43+
predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof ArgumentToExec }
44+
45+
predicate isBarrier(DataFlow::Node node) {
46+
node.getType() instanceof PrimitiveType
47+
or
48+
node.getType() instanceof BoxedType
49+
or
50+
isSafeCommandArgument(node.asExpr())
51+
}
52+
}
53+
54+
/**
55+
* Taint-tracking flow for unvalidated user input that is used to run an external process.
56+
*/
57+
module RemoteUserInputToArgumentToExecFlow =
58+
TaintTracking::Global<RemoteUserInputToArgumentToExecFlowConfig>;
59+
60+
/**
61+
* DEPRECATED: Use `execIsTainted` instead.
62+
*
3663
* Implementation of `ExecTainted.ql`. It is extracted to a QLL
3764
* so that it can be excluded from `ExecUnescaped.ql` to avoid
3865
* reporting overlapping results.
3966
*/
40-
predicate execTainted(DataFlow::PathNode source, DataFlow::PathNode sink, ArgumentToExec execArg) {
67+
deprecated predicate execTainted(
68+
DataFlow::PathNode source, DataFlow::PathNode sink, ArgumentToExec execArg
69+
) {
4170
exists(RemoteUserInputToArgumentToExecFlowConfig conf |
4271
conf.hasFlowPath(source, sink) and sink.getNode() = DataFlow::exprNode(execArg)
4372
)
4473
}
74+
75+
/**
76+
* Implementation of `ExecTainted.ql`. It is extracted to a QLL
77+
* so that it can be excluded from `ExecUnescaped.ql` to avoid
78+
* reporting overlapping results.
79+
*/
80+
predicate execIsTainted(
81+
RemoteUserInputToArgumentToExecFlow::PathNode source,
82+
RemoteUserInputToArgumentToExecFlow::PathNode sink, ArgumentToExec execArg
83+
) {
84+
RemoteUserInputToArgumentToExecFlow::flowPath(source, sink) and
85+
sink.getNode() = DataFlow::exprNode(execArg)
86+
}

java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ deprecated class RequestForgeryConfiguration extends TaintTracking::Configuratio
3535
/**
3636
* A taint-tracking configuration characterising request-forgery risks.
3737
*/
38-
private module RequestForgeryConfig implements DataFlow::ConfigSig {
38+
module RequestForgeryConfig implements DataFlow::ConfigSig {
3939
predicate isSource(DataFlow::Node source) {
4040
source instanceof RemoteFlowSource and
4141
// Exclude results of remote HTTP requests: fetching something else based on that result

java/ql/src/Security/CWE/CWE-078/ExecTainted.ql

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import java
1616
import semmle.code.java.dataflow.FlowSources
1717
import semmle.code.java.security.ExternalProcess
1818
import semmle.code.java.security.CommandLineQuery
19-
import DataFlow::PathGraph
19+
import RemoteUserInputToArgumentToExecFlow::PathGraph
2020

21-
from DataFlow::PathNode source, DataFlow::PathNode sink, ArgumentToExec execArg
22-
where execTainted(source, sink, execArg)
21+
from
22+
RemoteUserInputToArgumentToExecFlow::PathNode source,
23+
RemoteUserInputToArgumentToExecFlow::PathNode sink, ArgumentToExec execArg
24+
where execIsTainted(source, sink, execArg)
2325
select execArg, source, sink, "This command line depends on a $@.", source.getNode(),
2426
"user-provided value"

java/ql/src/Security/CWE/CWE-078/ExecUnescaped.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,5 @@ predicate builtFromUncontrolledConcat(Expr expr) {
4848
from StringArgumentToExec argument
4949
where
5050
builtFromUncontrolledConcat(argument) and
51-
not execTainted(_, _, argument)
51+
not execIsTainted(_, _, argument)
5252
select argument, "Command line is built with string concatenation."

java/ql/src/experimental/Security/CWE/CWE-078/ExecTainted.ql

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ import semmle.code.java.dataflow.FlowSources
1717
import semmle.code.java.security.ExternalProcess
1818
import semmle.code.java.security.CommandLineQuery
1919
import JSchOSInjection
20-
import DataFlow::PathGraph
20+
import RemoteUserInputToArgumentToExecFlow::PathGraph
2121

2222
// This is a clone of query `java/command-line-injection` that also includes experimental sinks.
23-
from DataFlow::PathNode source, DataFlow::PathNode sink, ArgumentToExec execArg
24-
where execTainted(source, sink, execArg)
23+
from
24+
RemoteUserInputToArgumentToExecFlow::PathNode source,
25+
RemoteUserInputToArgumentToExecFlow::PathNode sink, ArgumentToExec execArg
26+
where execIsTainted(source, sink, execArg)
2527
select execArg, source, sink, "This command line depends on a $@.", source.getNode(),
2628
"user-provided value"

0 commit comments

Comments
 (0)