Skip to content

Commit 3c8b093

Browse files
authored
Merge pull request #15291 from egregius313/egregius313/java/dataflow/default-sanitizers
Java: Introduce a common sanitizer type for types which cannot realistically carry taint.
2 parents 145b5a3 + fcbee19 commit 3c8b093

29 files changed

+80
-119
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: feature
3+
---
4+
* Added a new library `semmle.code.java.security.Sanitizers` which contains a new sanitizer class `SimpleTypeSanitizer`, which represents nodes which cannot realistically carry taint for most queries (e.g. primitives, their boxed equivalents, and numeric types).
5+
* Converted definitions of `isBarrier` and sanitizer classes to use `SimpleTypeSanitizer` instead of checking if `node.getType()` is `PrimitiveType` or `BoxedType`.

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java
44
private import semmle.code.java.security.Encryption
55
private import semmle.code.java.dataflow.TaintTracking
6+
private import semmle.code.java.security.Sanitizers
67

78
private class ShortStringLiteral extends StringLiteral {
89
ShortStringLiteral() { this.getValue().length() < 100 }
@@ -27,9 +28,7 @@ module InsecureCryptoConfig implements DataFlow::ConfigSig {
2728

2829
predicate isSink(DataFlow::Node n) { exists(CryptoAlgoSpec c | n.asExpr() = c.getAlgoSpec()) }
2930

30-
predicate isBarrier(DataFlow::Node node) {
31-
node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType
32-
}
31+
predicate isBarrier(DataFlow::Node node) { node instanceof SimpleTypeSanitizer }
3332
}
3433

3534
/**

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ private import semmle.code.java.dataflow.FlowSources
1212
private import semmle.code.java.dataflow.ExternalFlow
1313
private import semmle.code.java.security.CommandArguments
1414
private import semmle.code.java.security.ExternalProcess
15+
private import semmle.code.java.security.Sanitizers
1516

1617
/** A sink for command injection vulnerabilities. */
1718
abstract class CommandInjectionSink extends DataFlow::Node { }
@@ -38,11 +39,7 @@ private class DefaultCommandInjectionSink extends CommandInjectionSink {
3839

3940
private class DefaultCommandInjectionSanitizer extends CommandInjectionSanitizer {
4041
DefaultCommandInjectionSanitizer() {
41-
this.getType() instanceof PrimitiveType
42-
or
43-
this.getType() instanceof BoxedType
44-
or
45-
this.getType() instanceof NumberType
42+
this instanceof SimpleTypeSanitizer
4643
or
4744
isSafeCommandArgument(this.asExpr())
4845
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java
44
private import semmle.code.java.dataflow.FlowSources
55
private import semmle.code.java.security.ExternalProcess
66
private import semmle.code.java.security.CommandArguments
7+
private import semmle.code.java.security.Sanitizers
78

89
/** A taint-tracking configuration to reason about use of externally controlled strings to make command line commands. */
910
module ExecTaintedLocalConfig implements DataFlow::ConfigSig {
@@ -12,9 +13,7 @@ module ExecTaintedLocalConfig implements DataFlow::ConfigSig {
1213
predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof ArgumentToExec }
1314

1415
predicate isBarrier(DataFlow::Node node) {
15-
node.getType() instanceof PrimitiveType
16-
or
17-
node.getType() instanceof BoxedType
16+
node instanceof SimpleTypeSanitizer
1817
or
1918
isSafeCommandArgument(node.asExpr())
2019
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java
44
import semmle.code.java.dataflow.TaintTracking
55
import semmle.code.java.frameworks.Networking
66
import semmle.code.java.security.HttpsUrls
7+
private import semmle.code.java.security.Sanitizers
78

89
/**
910
* DEPRECATED: Use `HttpsStringToUrlOpenMethodFlow` instead.
@@ -38,9 +39,7 @@ module HttpStringToUrlOpenMethodFlowConfig implements DataFlow::ConfigSig {
3839
any(HttpUrlsAdditionalTaintStep c).step(node1, node2)
3940
}
4041

41-
predicate isBarrier(DataFlow::Node node) {
42-
node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType
43-
}
42+
predicate isBarrier(DataFlow::Node node) { node instanceof SimpleTypeSanitizer }
4443
}
4544

4645
/**

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import semmle.code.java.dataflow.FlowSources
55
import semmle.code.java.frameworks.Jndi
66
import semmle.code.java.frameworks.SpringLdap
77
import semmle.code.java.security.JndiInjection
8+
private import semmle.code.java.security.Sanitizers
89

910
/**
1011
* DEPRECATED: Use `JndiInjectionFlow` instead.
@@ -19,8 +20,7 @@ deprecated class JndiInjectionFlowConfig extends TaintTracking::Configuration {
1920
override predicate isSink(DataFlow::Node sink) { sink instanceof JndiInjectionSink }
2021

2122
override predicate isSanitizer(DataFlow::Node node) {
22-
node.getType() instanceof PrimitiveType or
23-
node.getType() instanceof BoxedType or
23+
node instanceof SimpleTypeSanitizer or
2424
node instanceof JndiInjectionSanitizer
2525
}
2626

@@ -38,8 +38,7 @@ module JndiInjectionFlowConfig implements DataFlow::ConfigSig {
3838
predicate isSink(DataFlow::Node sink) { sink instanceof JndiInjectionSink }
3939

4040
predicate isBarrier(DataFlow::Node node) {
41-
node.getType() instanceof PrimitiveType or
42-
node.getType() instanceof BoxedType or
41+
node instanceof SimpleTypeSanitizer or
4342
node instanceof JndiInjectionSanitizer
4443
}
4544

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import semmle.code.java.frameworks.UnboundId
77
import semmle.code.java.frameworks.SpringLdap
88
import semmle.code.java.frameworks.ApacheLdap
99
private import semmle.code.java.dataflow.ExternalFlow
10+
private import semmle.code.java.security.Sanitizers
1011

1112
/** A data flow sink for unvalidated user input that is used to construct LDAP queries. */
1213
abstract class LdapInjectionSink extends DataFlow::Node { }
@@ -33,12 +34,7 @@ private class DefaultLdapInjectionSink extends LdapInjectionSink {
3334
}
3435

3536
/** A sanitizer that clears the taint on (boxed) primitive types. */
36-
private class DefaultLdapSanitizer extends LdapInjectionSanitizer {
37-
DefaultLdapSanitizer() {
38-
this.getType() instanceof PrimitiveType or
39-
this.getType() instanceof BoxedType
40-
}
41-
}
37+
private class DefaultLdapSanitizer extends LdapInjectionSanitizer instanceof SimpleTypeSanitizer { }
4238

4339
/**
4440
* Holds if `n1` to `n2` is a dataflow step that converts between `String` and `LdapName`,

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java
44
private import semmle.code.java.dataflow.DataFlow
55
private import semmle.code.java.dataflow.ExternalFlow
66
private import semmle.code.java.controlflow.Guards
7+
private import semmle.code.java.security.Sanitizers
78

89
/** A data flow sink for unvalidated user input that is used to log messages. */
910
abstract class LogInjectionSink extends DataFlow::Node { }
@@ -30,13 +31,8 @@ private class DefaultLogInjectionSink extends LogInjectionSink {
3031
DefaultLogInjectionSink() { sinkNode(this, "log-injection") }
3132
}
3233

33-
private class DefaultLogInjectionSanitizer extends LogInjectionSanitizer {
34-
DefaultLogInjectionSanitizer() {
35-
this.getType() instanceof BoxedType or
36-
this.getType() instanceof PrimitiveType or
37-
this.getType() instanceof NumericType
38-
}
39-
}
34+
private class DefaultLogInjectionSanitizer extends LogInjectionSanitizer instanceof SimpleTypeSanitizer
35+
{ }
4036

4137
private class LineBreaksLogInjectionSanitizer extends LogInjectionSanitizer {
4238
LineBreaksLogInjectionSanitizer() {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java
44
import semmle.code.java.dataflow.FlowSources
55
import semmle.code.java.security.OgnlInjection
6+
private import semmle.code.java.security.Sanitizers
67

78
/**
89
* DEPRECATED: Use `OgnlInjectionFlow` instead.
@@ -33,9 +34,7 @@ module OgnlInjectionFlowConfig implements DataFlow::ConfigSig {
3334

3435
predicate isSink(DataFlow::Node sink) { sink instanceof OgnlInjectionSink }
3536

36-
predicate isBarrier(DataFlow::Node node) {
37-
node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType
38-
}
37+
predicate isBarrier(DataFlow::Node node) { node instanceof SimpleTypeSanitizer }
3938

4039
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
4140
any(OgnlInjectionAdditionalTaintStep c).step(node1, node2)

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import semmle.code.java.dataflow.DataFlow
1010
import semmle.code.java.frameworks.Properties
1111
private import semmle.code.java.dataflow.StringPrefixes
1212
private import semmle.code.java.dataflow.ExternalFlow
13+
private import semmle.code.java.security.Sanitizers
1314

1415
/**
1516
* A unit class for adding additional taint steps that are specific to server-side request forgery (SSRF) attacks.
@@ -59,13 +60,7 @@ private class DefaultRequestForgerySink extends RequestForgerySink {
5960
/** A sanitizer for request forgery vulnerabilities. */
6061
abstract class RequestForgerySanitizer extends DataFlow::Node { }
6162

62-
private class PrimitiveSanitizer extends RequestForgerySanitizer {
63-
PrimitiveSanitizer() {
64-
this.getType() instanceof PrimitiveType or
65-
this.getType() instanceof BoxedType or
66-
this.getType() instanceof NumberType
67-
}
68-
}
63+
private class PrimitiveSanitizer extends RequestForgerySanitizer instanceof SimpleTypeSanitizer { }
6964

7065
private class HostnameSanitizingPrefix extends InterestingPrefix {
7166
int offset;

0 commit comments

Comments
 (0)