Skip to content

Commit fed42d6

Browse files
authored
Merge pull request #21656 from MarkLee131/fix/trust-boundary-regexp-barrier
Java: add RegexpCheckBarrier to trust-boundary-violation sanitizers
2 parents 0192ffa + 49d014c commit fed42d6

4 files changed

Lines changed: 33 additions & 6 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* The `java/trust-boundary-violation` query now recognizes regular expression checks (including `String.matches()` guards and `@javax.validation.constraints.Pattern` annotations) as sanitizers, consistent with the existing treatment of ESAPI validators. This reduces false positives when input is validated against a pattern before being stored in a session.

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,26 @@ private class ExternalTrustBoundaryValidationSanitizer extends TrustBoundaryVali
3131
ExternalTrustBoundaryValidationSanitizer() { barrierNode(this, "trust-boundary-violation") }
3232
}
3333

34+
private class SimpleTypeTrustBoundaryValidationSanitizer extends TrustBoundaryValidationSanitizer instanceof SimpleTypeSanitizer
35+
{ }
36+
37+
private class RegexpCheckTrustBoundaryValidationSanitizer extends TrustBoundaryValidationSanitizer instanceof RegexpCheckBarrier
38+
{ }
39+
40+
private class HttpServletSessionTypeTrustBoundaryValidationSanitizer extends TrustBoundaryValidationSanitizer
41+
{
42+
HttpServletSessionTypeTrustBoundaryValidationSanitizer() {
43+
this.getType() instanceof HttpServletSession
44+
}
45+
}
46+
3447
/**
3548
* Taint tracking for data that crosses a trust boundary.
3649
*/
3750
module TrustBoundaryConfig implements DataFlow::ConfigSig {
3851
predicate isSource(DataFlow::Node source) { source instanceof TrustBoundaryViolationSource }
3952

40-
predicate isBarrier(DataFlow::Node node) {
41-
node instanceof TrustBoundaryValidationSanitizer or
42-
node.getType() instanceof HttpServletSession or
43-
node instanceof SimpleTypeSanitizer
44-
}
53+
predicate isBarrier(DataFlow::Node node) { node instanceof TrustBoundaryValidationSanitizer }
4554

4655
predicate isSink(DataFlow::Node sink) { sink instanceof TrustBoundaryViolationSink }
4756

java/ql/test/query-tests/security/CWE-501/TrustBoundaryViolations.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,19 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) {
3131
}
3232
} catch (Exception e) {
3333
}
34+
35+
// GOOD: A direct String.matches(...) regex check constrains the input before it is written to the session.
36+
String input4 = request.getParameter("input4");
37+
if (input4.matches("[a-zA-Z0-9]+")) {
38+
request.getSession().setAttribute("input4", input4);
39+
}
40+
}
41+
42+
@javax.validation.constraints.Pattern(regexp = "^[a-zA-Z0-9]+$")
43+
String validatedField;
44+
45+
public void doPost(HttpServletRequest request, HttpServletResponse response) {
46+
// GOOD: The field is constrained by a @Pattern annotation.
47+
request.getSession().setAttribute("validated", validatedField);
3448
}
3549
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/esapi-2.0.1:${testdir}/../../../stubs/javax-servlet-2.5
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/esapi-2.0.1:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/javax-validation-constraints

0 commit comments

Comments
 (0)