Skip to content

Commit 34f7486

Browse files
committed
Java: Add extension point and default sanitizer to Open Redirect query
1 parent 31cb308 commit 34f7486

File tree

6 files changed

+18
-5
lines changed

6 files changed

+18
-5
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* An extension point for sanitizers of the query `java/unvalidated-url-redirection` has been added.

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ private import semmle.code.java.dataflow.ExternalFlow
66
import semmle.code.java.frameworks.Servlets
77
import semmle.code.java.frameworks.ApacheHttp
88
private import semmle.code.java.frameworks.JaxWS
9+
private import semmle.code.java.security.RequestForgery
910

1011
/** A URL redirection sink. */
1112
abstract class UrlRedirectSink extends DataFlow::Node { }
1213

14+
/** A URL redirection sanitizer. */
15+
abstract class UrlRedirectSanitizer extends DataFlow::Node { }
16+
1317
/** A default sink represeting methods susceptible to URL redirection attacks. */
1418
private class DefaultUrlRedirectSink extends UrlRedirectSink {
1519
DefaultUrlRedirectSink() { sinkNode(this, "url-redirection") }
@@ -42,3 +46,6 @@ private class ApacheUrlRedirectSink extends UrlRedirectSink {
4246
)
4347
}
4448
}
49+
50+
private class DefaultUrlRedirectSanitizer extends UrlRedirectSanitizer instanceof RequestForgerySanitizer
51+
{ }

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ module UrlRedirectConfig implements DataFlow::ConfigSig {
1111
predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource }
1212

1313
predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink }
14+
15+
predicate isBarrier(DataFlow::Node node) { node instanceof UrlRedirectSanitizer }
1416
}
1517

1618
/**
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 query `java/unvalidated-url-redirection` now sanitizes results following the same logic as the query `java/ssrf`. URLs the destination of which cannot be externally controlled will not be reported anymore.

java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
edges
22
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) |
33
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String |
4-
| UrlRedirect.java:36:58:36:89 | getParameter(...) : String | UrlRedirect.java:36:25:36:89 | ... + ... |
54
| UrlRedirect.java:45:28:45:39 | input : String | UrlRedirect.java:46:10:46:14 | input : String |
65
| UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String |
76
| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String |
@@ -10,8 +9,6 @@ nodes
109
| UrlRedirect.java:23:25:23:54 | getParameter(...) | semmle.label | getParameter(...) |
1110
| UrlRedirect.java:32:25:32:67 | weakCleanup(...) | semmle.label | weakCleanup(...) |
1211
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | semmle.label | getParameter(...) : String |
13-
| UrlRedirect.java:36:25:36:89 | ... + ... | semmle.label | ... + ... |
14-
| UrlRedirect.java:36:58:36:89 | getParameter(...) : String | semmle.label | getParameter(...) : String |
1512
| UrlRedirect.java:39:34:39:63 | getParameter(...) | semmle.label | getParameter(...) |
1613
| UrlRedirect.java:42:43:42:72 | getParameter(...) | semmle.label | getParameter(...) |
1714
| UrlRedirect.java:45:28:45:39 | input : String | semmle.label | input : String |
@@ -25,7 +22,6 @@ subpaths
2522
#select
2623
| UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:23:25:23:54 | getParameter(...) | user-provided value |
2724
| UrlRedirect.java:32:25:32:67 | weakCleanup(...) | UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:32:37:32:66 | getParameter(...) | user-provided value |
28-
| UrlRedirect.java:36:25:36:89 | ... + ... | UrlRedirect.java:36:58:36:89 | getParameter(...) : String | UrlRedirect.java:36:25:36:89 | ... + ... | Untrusted URL redirection depends on a $@. | UrlRedirect.java:36:58:36:89 | getParameter(...) | user-provided value |
2925
| UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:39:34:39:63 | getParameter(...) | user-provided value |
3026
| UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:42:43:42:72 | getParameter(...) | user-provided value |
3127
| mad/Test.java:14:22:14:38 | (...)... | mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:22:14:38 | (...)... | Untrusted URL redirection depends on a $@. | mad/Test.java:9:16:9:41 | getParameter(...) | user-provided value |

java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
3131
// if the argument is "hthttp://tp://malicious.com"
3232
response.sendRedirect(weakCleanup(request.getParameter("target")));
3333

34-
// FALSE POSITIVE: the user input is not used in a position that allows it to dictate
34+
// GOOD: the user input is not used in a position that allows it to dictate
3535
// the target of the redirect
3636
response.sendRedirect("http://example.com?username=" + request.getParameter("username"));
3737

0 commit comments

Comments
 (0)