mirror of
https://github.com/github/codeql.git
synced 2025-12-20 10:46:30 +01:00
Move and convert URL redirect sinks
Adds for them as well
This commit is contained in:
@@ -13,6 +13,7 @@
|
|||||||
import java
|
import java
|
||||||
import semmle.code.java.dataflow.FlowSources
|
import semmle.code.java.dataflow.FlowSources
|
||||||
import semmle.code.java.security.UrlRedirect
|
import semmle.code.java.security.UrlRedirect
|
||||||
|
import semmle.code.java.dataflow.ExternalFlow
|
||||||
import DataFlow::PathGraph
|
import DataFlow::PathGraph
|
||||||
|
|
||||||
class UrlRedirectConfig extends TaintTracking::Configuration {
|
class UrlRedirectConfig extends TaintTracking::Configuration {
|
||||||
@@ -20,7 +21,11 @@ class UrlRedirectConfig extends TaintTracking::Configuration {
|
|||||||
|
|
||||||
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
|
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
|
||||||
|
|
||||||
override predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink }
|
override predicate isSink(DataFlow::Node sink) {
|
||||||
|
sink instanceof UrlRedirectSink
|
||||||
|
or
|
||||||
|
sinkNode(sink, "url-redirect")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
from DataFlow::PathNode source, DataFlow::PathNode sink, UrlRedirectConfig conf
|
from DataFlow::PathNode source, DataFlow::PathNode sink, UrlRedirectConfig conf
|
||||||
|
|||||||
@@ -308,6 +308,20 @@ class JaxRSConsumesAnnotation extends JaxRSAnnotation {
|
|||||||
JaxRSConsumesAnnotation() { this.getType().hasQualifiedName(getAJaxRsPackage(), "Consumes") }
|
JaxRSConsumesAnnotation() { this.getType().hasQualifiedName(getAJaxRsPackage(), "Consumes") }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** A URL redirection sink from JAX-RS */
|
||||||
|
private class JaxRsUrlRedirectSink extends SinkModelCsv {
|
||||||
|
override predicate row(string row) {
|
||||||
|
row =
|
||||||
|
[
|
||||||
|
//`namespace; type; subtypes; name; signature; ext; input; kind`
|
||||||
|
"javax.ws.rs.core;Response;true;seeOther;;;Argument[0];url-redirect",
|
||||||
|
"javax.ws.rs.core;Response;true;temporaryRedirect;;;Argument[0];url-redirect",
|
||||||
|
"jakarta.ws.rs.core;Response;true;seeOther;;;Argument[0];url-redirect",
|
||||||
|
"jakarta.ws.rs.core;Response;true;temporaryRedirect;;;Argument[0];url-redirect"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model Response:
|
* Model Response:
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -36,17 +36,3 @@ private class ApacheUrlRedirectSink extends UrlRedirectSink {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A URL redirection sink from JAX-RS */
|
|
||||||
private class JaxRsUrlRedirectSink extends UrlRedirectSink {
|
|
||||||
JaxRsUrlRedirectSink() {
|
|
||||||
exists(MethodAccess ma |
|
|
||||||
ma.getMethod()
|
|
||||||
.getDeclaringType()
|
|
||||||
.getAnAncestor()
|
|
||||||
.hasQualifiedName(getAJaxRsPackage("core"), "Response") and
|
|
||||||
ma.getMethod().getName() in ["seeOther", "temporaryRedirect"] and
|
|
||||||
this.asExpr() = ma.getArgument(0)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
edges
|
||||||
|
| UrlRedirect.java:10:32:10:61 | getParameter(...) : String | UrlRedirect.java:10:24:10:62 | new URI(...) |
|
||||||
|
| UrlRedirect.java:13:41:13:70 | getParameter(...) : String | UrlRedirect.java:13:33:13:71 | new URI(...) |
|
||||||
|
nodes
|
||||||
|
| UrlRedirect.java:10:24:10:62 | new URI(...) | semmle.label | new URI(...) |
|
||||||
|
| UrlRedirect.java:10:32:10:61 | getParameter(...) : String | semmle.label | getParameter(...) : String |
|
||||||
|
| UrlRedirect.java:13:33:13:71 | new URI(...) | semmle.label | new URI(...) |
|
||||||
|
| UrlRedirect.java:13:41:13:70 | getParameter(...) : String | semmle.label | getParameter(...) : String |
|
||||||
|
#select
|
||||||
|
| UrlRedirect.java:10:24:10:62 | new URI(...) | UrlRedirect.java:10:32:10:61 | getParameter(...) : String | UrlRedirect.java:10:24:10:62 | new URI(...) | Potentially untrusted URL redirection due to $@. | UrlRedirect.java:10:32:10:61 | getParameter(...) | user-provided value |
|
||||||
|
| UrlRedirect.java:13:33:13:71 | new URI(...) | UrlRedirect.java:13:41:13:70 | getParameter(...) : String | UrlRedirect.java:13:33:13:71 | new URI(...) | Potentially untrusted URL redirection due to $@. | UrlRedirect.java:13:41:13:70 | getParameter(...) | user-provided value |
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Security/CWE/CWE-601/UrlRedirect.ql
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
public class UrlRedirectJax extends HttpServlet {
|
||||||
|
protected void doGetJax(HttpServletRequest request, Response jaxResponse) throws Exception {
|
||||||
|
// BAD
|
||||||
|
jaxResponse.seeOther(new URI(request.getParameter("target")));
|
||||||
|
|
||||||
|
// BAD
|
||||||
|
jaxResponse.temporaryRedirect(new URI(request.getParameter("target")));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/jsr311-api-1.1.1:${testdir}/../../../stubs/jsr181-api:${testdir}/../../../stubs/jaxws-api-2.0
|
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/jsr311-api-1.1.1:${testdir}/../../../stubs/jsr181-api:${testdir}/../../../stubs/jaxws-api-2.0:${testdir}/../../../stubs/servlet-api-2.4
|
||||||
|
|||||||
Reference in New Issue
Block a user