Skip to content

Commit d109637

Browse files
authored
Merge pull request github#13413 from egregius313/egregius313/trust-boundary
Java: Trust Boundary Violation Query
2 parents a1c9dee + 8d88af1 commit d109637

25 files changed

+518
-3
lines changed

docs/codeql/codeql-language-guides/customizing-library-models-for-java.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ The following sink kinds are supported:
349349
- **response-splitting**: A sink that can be used for HTTP response splitting, such as in calls to **HttpServletResponse.setHeader**.
350350
- **sql-injection**: A sink that can be used for SQL injection, such as in a **Statement.executeQuery** call.
351351
- **template-injection**: A sink that can be used for server side template injection, such as in a **Velocity.evaluate** call.
352+
- **trust-boundary-violation**: A sink that can be used to cross a trust boundary, such as in a **HttpSession.setAttribute** call.
352353
- **url-redirection**: A sink that can be used to redirect the user to a malicious URL, such as in a **Response.temporaryRedirect** call.
353354
- **xpath-injection**: A sink that can be used for XPath injection, such as in a **XPath.evaluate** call.
354355
- **xslt-injection**: A sink that can be used for XSLT injection, such as in a **Transformer.transform** call.

java/ql/lib/ext/generated/org.apache.commons.lang.model.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1604,8 +1604,6 @@ extensions:
16041604
- ["org.apache.commons.lang", "SerializationUtils", "serialize", "(Serializable,OutputStream)", "summary", "df-generated"]
16051605
- ["org.apache.commons.lang", "StringEscapeUtils", "escapeCsv", "(String)", "summary", "df-generated"]
16061606
- ["org.apache.commons.lang", "StringEscapeUtils", "escapeCsv", "(Writer,String)", "summary", "df-generated"]
1607-
- ["org.apache.commons.lang", "StringEscapeUtils", "escapeHtml", "(String)", "summary", "df-generated"]
1608-
- ["org.apache.commons.lang", "StringEscapeUtils", "escapeHtml", "(Writer,String)", "summary", "df-generated"]
16091607
- ["org.apache.commons.lang", "StringEscapeUtils", "escapeJava", "(String)", "summary", "df-generated"]
16101608
- ["org.apache.commons.lang", "StringEscapeUtils", "escapeJava", "(Writer,String)", "summary", "df-generated"]
16111609
- ["org.apache.commons.lang", "StringEscapeUtils", "escapeJavaScript", "(String)", "summary", "df-generated"]

java/ql/lib/ext/javax.servlet.http.model.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ extensions:
2626
- ["javax.servlet.http", "HttpServletResponse", False, "addHeader", "", "", "Argument[0..1]", "response-splitting", "manual"]
2727
- ["javax.servlet.http", "HttpServletResponse", False, "sendError", "(int,String)", "", "Argument[1]", "information-leak", "manual"]
2828
- ["javax.servlet.http", "HttpServletResponse", False, "setHeader", "", "", "Argument[0..1]", "response-splitting", "manual"]
29+
- ["javax.servlet.http", "HttpSession", True, "putValue", "", "", "Argument[0..1]", "trust-boundary-violation", "manual"]
30+
- ["javax.servlet.http", "HttpSession", True, "setAttribute", "", "", "Argument[0..1]", "trust-boundary-violation", "manual"]
2931
- addsTo:
3032
pack: codeql/java-all
3133
extensible: summaryModel
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: summaryModel
5+
data:
6+
- ["org.apache.commons.lang", "StringEscapeUtils", true, "escapeHtml", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
7+
- ["org.apache.commons.lang", "StringEscapeUtils", true, "escapeHtml", "(Writer,String)", "", "Argument[1]", "Argument[0]", "taint", "manual"]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: sinkModel
5+
data:
6+
- ["org.apache.struts2.dispatcher", "SessionMap", False, "put", "", "", "Argument[0..1]", "trust-boundary-violation", "manual"]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: sinkModel
5+
data:
6+
- ["org.apache.struts2.interceptor", "SessionAware", False, "setSession", "", "", "Argument[0]", "trust-boundary-violation", "manual"]
7+
- ["org.apache.struts2.interceptor", "SessionAware", False, "withSession", "", "", "Argument[0]", "trust-boundary-violation", "manual"]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: summaryModel
5+
data:
6+
- ["org.owasp.esapi", "Encoder", true, "encodeForHTML", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"]

java/ql/lib/ext/play.mvc.model.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ extensions:
1616
- ["play.mvc", "Http$RequestHeader", True, "queryString", "", "", "ReturnValue", "remote", "manual"]
1717
- ["play.mvc", "Http$RequestHeader", True, "remoteAddress", "", "", "ReturnValue", "remote", "manual"]
1818
- ["play.mvc", "Http$RequestHeader", True, "uri", "", "", "ReturnValue", "remote", "manual"]
19+
- addsTo:
20+
pack: codeql/java-all
21+
extensible: sinkModel
22+
data:
23+
- ["play.mvc", "Result", False, "addingToSession", "", "", "Argument[1..2]", "trust-boundary-violation", "manual"]
1924
- addsTo:
2025
pack: codeql/java-all
2126
extensible: summaryModel

java/ql/lib/semmle/code/java/frameworks/Servlets.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,3 +397,8 @@ class GetServletResourceAsStreamMethod extends Method {
397397
this.hasName("getResourceAsStream")
398398
}
399399
}
400+
401+
/** The interface `javax.servlet.http.HttpSession` */
402+
class HttpServletSession extends RefType {
403+
HttpServletSession() { this.hasQualifiedName("javax.servlet.http", "HttpSession") }
404+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/** Classes and predicates for reasoning about the `owasp.easpi` package. */
2+
3+
import java
4+
5+
/**
6+
* The `org.owasp.esapi.Validator` interface.
7+
*/
8+
class EsapiValidator extends RefType {
9+
EsapiValidator() { this.hasQualifiedName("org.owasp.esapi", "Validator") }
10+
}
11+
12+
/**
13+
* The methods of `org.owasp.esapi.Validator` which validate data.
14+
*/
15+
class EsapiIsValidMethod extends Method {
16+
EsapiIsValidMethod() {
17+
this.getDeclaringType() instanceof EsapiValidator and
18+
this.hasName([
19+
"isValidCreditCard", "isValidDate", "isValidDirectoryPath", "isValidDouble",
20+
"isValidFileContent", "isValidFileName", "isValidInput", "isValidInteger",
21+
"isValidListItem", "isValidNumber", "isValidPrintable", "isValidRedirectLocation",
22+
"isValidSafeHTML", "isValidURI"
23+
])
24+
}
25+
}
26+
27+
/**
28+
* The methods of `org.owasp.esapi.Validator` which return validated data.
29+
*/
30+
class EsapiGetValidMethod extends Method {
31+
EsapiGetValidMethod() {
32+
this.getDeclaringType() instanceof EsapiValidator and
33+
this.hasName([
34+
"getValidCreditCard", "getValidDate", "getValidDirectoryPath", "getValidDouble",
35+
"getValidFileContent", "getValidFileName", "getValidInput", "getValidInteger",
36+
"getValidListItem", "getValidNumber", "getValidPrintable", "getValidRedirectLocation",
37+
"getValidSafeHTML", "getValidURI"
38+
])
39+
}
40+
}

0 commit comments

Comments
 (0)