Skip to content

Commit da27326

Browse files
committed
Java: Refactor PolynomialReDoS.ql
1 parent f53a05b commit da27326

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,12 @@ private class LengthRestrictedMethod extends Method {
3232
}
3333
}
3434

35-
/** A configuration for Polynomial ReDoS queries. */
36-
class PolynomialRedosConfig extends TaintTracking::Configuration {
35+
/**
36+
* DEPRECATED: Use `PolynomialRedosFlow` instead.
37+
*
38+
* A configuration for Polynomial ReDoS queries.
39+
*/
40+
deprecated class PolynomialRedosConfig extends TaintTracking::Configuration {
3741
PolynomialRedosConfig() { this = "PolynomialRedosConfig" }
3842

3943
override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
@@ -47,11 +51,34 @@ class PolynomialRedosConfig extends TaintTracking::Configuration {
4751
}
4852
}
4953

50-
/** Holds if there is flow from `source` to `sink` that is matched against the regexp term `regexp` that is vulnerable to Polynomial ReDoS. */
51-
predicate hasPolynomialReDoSResult(
54+
/**
55+
* DEPRECATED: Use `PolynomialRedosFlow` instead.
56+
*
57+
* Holds if there is flow from `source` to `sink` that is matched against the regexp term `regexp` that is vulnerable to Polynomial ReDoS.
58+
*/
59+
deprecated predicate hasPolynomialReDoSResult(
5260
DataFlow::PathNode source, DataFlow::PathNode sink,
5361
SuperlinearBackTracking::PolynomialBackTrackingTerm regexp
5462
) {
5563
any(PolynomialRedosConfig config).hasFlowPath(source, sink) and
5664
regexp.getRootTerm() = sink.getNode().(PolynomialRedosSink).getRegExp()
5765
}
66+
67+
/** A configuration for Polynomial ReDoS queries. */
68+
private module PolynomialRedosConfig implements DataFlow::ConfigSig {
69+
predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
70+
71+
predicate isSink(DataFlow::Node sink) {
72+
exists(SuperlinearBackTracking::PolynomialBackTrackingTerm regexp |
73+
regexp.getRootTerm() = sink.(PolynomialRedosSink).getRegExp()
74+
)
75+
}
76+
77+
predicate isBarrier(DataFlow::Node node) {
78+
node.getType() instanceof PrimitiveType or
79+
node.getType() instanceof BoxedType or
80+
node.asExpr().(MethodAccess).getMethod() instanceof LengthRestrictedMethod
81+
}
82+
}
83+
84+
module PolynomialRedosFlow = TaintTracking::Make<PolynomialRedosConfig>;

java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql

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

1616
import java
1717
import semmle.code.java.security.regexp.PolynomialReDoSQuery
18-
import DataFlow::PathGraph
18+
import PolynomialRedosFlow::PathGraph
1919

2020
from
21-
DataFlow::PathNode source, DataFlow::PathNode sink,
21+
PolynomialRedosFlow::PathNode source, PolynomialRedosFlow::PathNode sink,
2222
SuperlinearBackTracking::PolynomialBackTrackingTerm regexp
23-
where hasPolynomialReDoSResult(source, sink, regexp)
23+
where
24+
PolynomialRedosFlow::hasFlowPath(source, sink) and
25+
regexp.getRootTerm() = sink.getNode().(PolynomialRedosSink).getRegExp()
2426
select sink, source, sink,
2527
"This $@ that depends on a $@ may run slow on strings " + regexp.getPrefixMessage() +
2628
"with many repetitions of '" + regexp.getPumpString() + "'.", regexp, "regular expression",

java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ class HasPolyRedos extends InlineExpectationsTest {
88

99
override predicate hasActualResult(Location location, string element, string tag, string value) {
1010
tag = "hasPolyRedos" and
11-
exists(DataFlow::PathNode sink |
12-
hasPolynomialReDoSResult(_, sink, _) and
13-
location = sink.getNode().getLocation() and
14-
element = sink.getNode().toString() and
11+
exists(DataFlow::Node sink |
12+
PolynomialRedosFlow::hasFlowTo(sink) and
13+
location = sink.getLocation() and
14+
element = sink.toString() and
1515
value = ""
1616
)
1717
}

0 commit comments

Comments
 (0)