Skip to content

Commit d7acb75

Browse files
authored
Merge pull request #21055 from owen-mc/java/allow-mad-barriers
Java: allow MaD barriers
2 parents 70c90a1 + 8c9318b commit d7acb75

File tree

10 files changed

+37
-10
lines changed

10 files changed

+37
-10
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ private class DefaultIntentRedirectionSink extends IntentRedirectionSink {
3535
DefaultIntentRedirectionSink() { sinkNode(this, "intent-redirection") }
3636
}
3737

38+
/** An external sanitizer for Intent redirection vulnerabilities. */
39+
private class ExternalIntentRedirectionSanitizer extends IntentRedirectionSanitizer {
40+
ExternalIntentRedirectionSanitizer() { barrierNode(this, "intent-redirection") }
41+
}
42+
3843
/**
3944
* A default sanitizer for `Intent` nodes dominated by calls to `ComponentName.getPackageName`
4045
* and `ComponentName.getClassName`. These are used to check whether the origin or destination

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ private class DefaultCommandInjectionSink extends CommandInjectionSink {
3737
DefaultCommandInjectionSink() { sinkNode(this, "command-injection") }
3838
}
3939

40+
private class ExternalCommandInjectionSanitizer extends CommandInjectionSanitizer {
41+
ExternalCommandInjectionSanitizer() { barrierNode(this, "command-injection") }
42+
}
43+
4044
private class DefaultCommandInjectionSanitizer extends CommandInjectionSanitizer {
4145
DefaultCommandInjectionSanitizer() {
4246
this instanceof SimpleTypeSanitizer

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ private class DefaultFragmentInjectionSink extends FragmentInjectionSink {
4949
DefaultFragmentInjectionSink() { sinkNode(this, "fragment-injection") }
5050
}
5151

52+
/**
53+
* A sanitizer for Fragment injection vulnerabilities.
54+
*/
55+
abstract class FragmentInjectionSanitizer extends DataFlow::Node { }
56+
57+
private class ExternalFragmentInjectionSanitizer extends FragmentInjectionSanitizer {
58+
ExternalFragmentInjectionSanitizer() { barrierNode(this, "fragment-injection") }
59+
}
60+
5261
private class DefaultFragmentInjectionAdditionalTaintStep extends FragmentInjectionAdditionalTaintStep
5362
{
5463
override predicate step(DataFlow::Node n1, DataFlow::Node n2) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ module FragmentInjectionTaintConfig implements DataFlow::ConfigSig {
1414

1515
predicate isSink(DataFlow::Node sink) { sink instanceof FragmentInjectionSink }
1616

17+
predicate isBarrier(DataFlow::Node node) { node instanceof FragmentInjectionSanitizer }
18+
1719
predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
1820
any(FragmentInjectionAdditionalTaintStep c).step(n1, n2)
1921
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ private class DefaultGroovyInjectionSink extends GroovyInjectionSink {
2626
DefaultGroovyInjectionSink() { sinkNode(this, "groovy-injection") }
2727
}
2828

29+
/** A data flow sanitizer for Groovy expression injection vulnerabilities. */
30+
abstract class GroovyInjectionSanitizer extends DataFlow::ExprNode { }
31+
32+
private class ExternalGroovyInjectionSanitizer extends GroovyInjectionSanitizer {
33+
ExternalGroovyInjectionSanitizer() { barrierNode(this, "groovy-injection") }
34+
}
35+
2936
/** A set of additional taint steps to consider when taint tracking Groovy related data flows. */
3037
private class DefaultGroovyInjectionAdditionalTaintStep extends GroovyInjectionAdditionalTaintStep {
3138
override predicate step(DataFlow::Node node1, DataFlow::Node node2) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,8 @@ private Method getSourceMethod(Method m) {
289289
result = m
290290
}
291291

292-
private class DefaultPathInjectionSanitizer extends PathInjectionSanitizer {
293-
DefaultPathInjectionSanitizer() { barrierNode(this, "path-injection") }
292+
private class ExternalPathInjectionSanitizer extends PathInjectionSanitizer {
293+
ExternalPathInjectionSanitizer() { barrierNode(this, "path-injection") }
294294
}
295295

296296
/** Holds if `g` is a guard that checks for `..` components. */

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ private class ContainsUrlSanitizer extends RequestForgerySanitizer {
118118
}
119119
}
120120

121-
private class DefaultRequestForgerySanitizer extends RequestForgerySanitizer {
122-
DefaultRequestForgerySanitizer() { barrierNode(this, "request-forgery") }
121+
private class ExternalRequestForgerySanitizer extends RequestForgerySanitizer {
122+
ExternalRequestForgerySanitizer() { barrierNode(this, "request-forgery") }
123123
}
124124

125125
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class TrustBoundaryViolationSink extends DataFlow::Node {
2727
*/
2828
abstract class TrustBoundaryValidationSanitizer extends DataFlow::Node { }
2929

30-
private class DefaultTrustBoundaryValidationSanitizer extends TrustBoundaryValidationSanitizer {
31-
DefaultTrustBoundaryValidationSanitizer() { barrierNode(this, "trust-boundary-violation") }
30+
private class ExternalTrustBoundaryValidationSanitizer extends TrustBoundaryValidationSanitizer {
31+
ExternalTrustBoundaryValidationSanitizer() { barrierNode(this, "trust-boundary-violation") }
3232
}
3333

3434
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ private class DefaultXssSink extends XssSink {
5454
}
5555
}
5656

57-
private class DefaultXssSanitizer extends XssSanitizer {
58-
DefaultXssSanitizer() { barrierNode(this, ["html-injection", "js-injection"]) }
57+
private class ExternalXssSanitizer extends XssSanitizer {
58+
ExternalXssSanitizer() { barrierNode(this, ["html-injection", "js-injection"]) }
5959
}
6060

6161
/** A sanitizer that considers numeric and boolean typed data safe for writing to output. */

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ private class DefaultRegexInjectionSink extends RegexInjectionSink {
2121
}
2222
}
2323

24-
private class DefaultRegexInjectionSanitizer extends RegexInjectionSanitizer {
25-
DefaultRegexInjectionSanitizer() { barrierNode(this, "regex-use") }
24+
private class ExternalRegexInjectionSanitizer extends RegexInjectionSanitizer {
25+
ExternalRegexInjectionSanitizer() { barrierNode(this, "regex-use") }
2626
}
2727

2828
/**

0 commit comments

Comments
 (0)