Skip to content

Commit 1119e80

Browse files
committed
Java: ExternalAPIs (enable diff-informed + add tests based on qhelp)
1 parent 3860299 commit 1119e80

File tree

7 files changed

+53
-1
lines changed

7 files changed

+53
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig {
103103
predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode }
104104

105105
predicate observeDiffInformedIncrementalMode() {
106-
any() // TODO: Make sure that the location overrides match the query's select clause: Flow call outside 'select' clause (/Users/d10c/src/semmle-code/ql/java/ql/lib/semmle/code/java/security/ExternalAPIs.qll@113:36:113:79), Flow call outside 'select' clause (/Users/d10c/src/semmle-code/ql/java/ql/lib/semmle/code/java/security/ExternalAPIs.qll@116:43:116:92)
106+
any() // Simple use in UntrustedDataToExternalAPI.ql; also used through ExternalApiUsedWithUntrustedData in ExternalAPIsUsedWithUntrustedData.ql
107107
}
108108
}
109109

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import javax.servlet.http.HttpServlet;
2+
import javax.servlet.http.HttpServletRequest;
3+
import javax.servlet.http.HttpServletResponse;
4+
import javax.servlet.ServletException;
5+
import java.io.IOException;
6+
7+
public class ExternalAPISinkExample extends HttpServlet {
8+
protected void doGet(HttpServletRequest request, HttpServletResponse response)
9+
throws ServletException, IOException {
10+
// BAD: a request parameter is written directly to an error response page
11+
response.sendError(HttpServletResponse.SC_NOT_FOUND,
12+
"The page \"" + request.getParameter("page") + "\" was not found."); // $ Alert
13+
}
14+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import javax.servlet.http.HttpServlet;
2+
import javax.servlet.http.HttpServletRequest;
3+
import javax.servlet.http.HttpServletResponse;
4+
import javax.servlet.ServletException;
5+
import java.io.IOException;
6+
7+
public class ExternalAPITaintStepExample extends HttpServlet {
8+
protected void doGet(HttpServletRequest request, HttpServletResponse response)
9+
throws ServletException, IOException {
10+
11+
StringBuilder sqlQueryBuilder = new StringBuilder();
12+
sqlQueryBuilder.append("SELECT * FROM user WHERE user_id='");
13+
// BAD: a request parameter is concatenated directly into a SQL query
14+
sqlQueryBuilder.append(request.getParameter("user_id"));
15+
sqlQueryBuilder.append("'");
16+
17+
// ...
18+
}
19+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| javax.servlet.http.HttpServletResponse.sendError(int,java.lang.String) [param 1] | 1 | 1 |
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
query: Security/CWE/CWE-020/ExternalAPIsUsedWithUntrustedData.ql
2+
postprocess:
3+
- utils/test/PrettyPrintModels.ql
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#select
2+
| ExternalAPISinkExample.java:12:5:12:70 | ... + ... | ExternalAPISinkExample.java:12:21:12:48 | getParameter(...) : String | ExternalAPISinkExample.java:12:5:12:70 | ... + ... | Call to javax.servlet.http.HttpServletResponse.sendError with untrusted data from $@. | ExternalAPISinkExample.java:12:21:12:48 | getParameter(...) : String | getParameter(...) : String |
3+
edges
4+
| ExternalAPISinkExample.java:12:21:12:48 | getParameter(...) : String | ExternalAPISinkExample.java:12:5:12:70 | ... + ... | provenance | Src:MaD:2 Sink:MaD:1 |
5+
models
6+
| 1 | Sink: javax.servlet.http; HttpServletResponse; false; sendError; (int,String); ; Argument[1]; information-leak; manual |
7+
| 2 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual |
8+
nodes
9+
| ExternalAPISinkExample.java:12:5:12:70 | ... + ... | semmle.label | ... + ... |
10+
| ExternalAPISinkExample.java:12:21:12:48 | getParameter(...) : String | semmle.label | getParameter(...) : String |
11+
subpaths
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
query: Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql
2+
postprocess:
3+
- utils/test/PrettyPrintModels.ql
4+
- utils/test/InlineExpectationsTestQuery.ql

0 commit comments

Comments
 (0)