Skip to content

Commit 91840c6

Browse files
committed
Java: Convert unsafe-url-forward to data extensions.
1 parent aed5ee4 commit 91840c6

File tree

7 files changed

+50
-49
lines changed

7 files changed

+50
-49
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: extExperimentalSummaryModel
5+
data:
6+
- ["io.undertow.server.handlers.resource", "Resource", True, "getFile", "", "", "Argument[-1]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]
7+
- ["io.undertow.server.handlers.resource", "Resource", True, "getFilePath", "", "", "Argument[-1]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]
8+
- ["io.undertow.server.handlers.resource", "Resource", True, "getPath", "", "", "Argument[-1]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]
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: extExperimentalSourceModel
5+
data:
6+
- ["jakarta.servlet.http", "HttpServletRequest", True, "getServletPath", "", "", "ReturnValue", "remote", "manual", "unsafe-url-forward"]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: extExperimentalSummaryModel
5+
data:
6+
- ["java.nio.file", "Path", True, "normalize", "", "", "Argument[-1]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]
7+
- ["java.nio.file", "Path", True, "resolve", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]
8+
- ["java.nio.file", "Path", True, "toString", "", "", "Argument[-1]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]
9+
- ["java.nio.file", "Paths", True, "get", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]

java/ql/lib/ext/experimental/java.util.concurrent.model.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ extensions:
44
extensible: extExperimentalSinkModel
55
data:
66
- ["java.util.concurrent", "TimeUnit", True, "sleep", "", "", "Argument[0]", "thread-pause", "manual", "thread-resource-abuse"]
7+
- ["java.util.concurrent", "TimeUnit", True, "sleep", "", "", "Argument[0]", "thread-pause", "manual", "unsafe-url-forward"]
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: extExperimentalSourceModel
5+
data:
6+
- ["javax.servlet.http", "HttpServletRequest", True, "getServletPath", "", "", "ReturnValue", "remote", "manual", "unsafe-url-forward"]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: extExperimentalSinkModel
5+
data:
6+
- ["org.springframework.core.io", "ClassPathResource", True, "getFilename", "", "", "Argument[-1]", "get-resource", "manual", "unsafe-url-forward"]
7+
- ["org.springframework.core.io", "ClassPathResource", True, "getPath", "", "", "Argument[-1]", "get-resource", "manual", "unsafe-url-forward"]
8+
- ["org.springframework.core.io", "ClassPathResource", True, "getURL", "", "", "Argument[-1]", "get-resource", "manual", "unsafe-url-forward"]
9+
- ["org.springframework.core.io", "ClassPathResource", True, "resolveURL", "", "", "Argument[-1]", "get-resource", "manual", "unsafe-url-forward"]
10+
- addsTo:
11+
pack: codeql/java-all
12+
extensible: extExperimentalSummaryModel
13+
data:
14+
- ["org.springframework.core.io", "ClassPathResource", False, "ClassPathResource", "", "", "Argument[0]", "Argument[-1]", "taint", "manual", "unsafe-url-forward"]
15+
- ["org.springframework.core.io", "Resource", True, "createRelative", "", "", "Argument[0]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]
16+
- ["org.springframework.core.io", "ResourceLoader", True, "getResource", "", "", "Argument[0]", "ReturnValue", "taint", "manual", "unsafe-url-forward"]

java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.qll

Lines changed: 4 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ private import semmle.code.java.dataflow.StringPrefixes
66
private import semmle.code.java.frameworks.javaee.ejb.EJBRestrictions
77
private import experimental.semmle.code.java.frameworks.SpringResource
88

9+
private class ActiveModels extends ActiveExperimentalModels {
10+
ActiveModels() { this = "unsafe-url-forward" }
11+
}
12+
913
/** A sink for unsafe URL forward vulnerabilities. */
1014
abstract class UnsafeUrlForwardSink extends DataFlow::Node { }
1115

@@ -161,52 +165,3 @@ private class SpringUrlForwardSink extends UnsafeUrlForwardSink {
161165
this.asExpr() = any(ForwardPrefix fp).getAnAppendedExpression()
162166
}
163167
}
164-
165-
/** Source model of remote flow source from `getServletPath`. */
166-
private class ServletGetPathSource extends SourceModelCsv {
167-
override predicate row(string row) {
168-
row =
169-
[
170-
"javax.servlet.http;HttpServletRequest;true;getServletPath;;;ReturnValue;remote;manual",
171-
"jakarta.servlet.http;HttpServletRequest;true;getServletPath;;;ReturnValue;remote;manual"
172-
]
173-
}
174-
}
175-
176-
/** Taint model related to `java.nio.file.Path` and `io.undertow.server.handlers.resource.Resource`. */
177-
private class FilePathFlowStep extends SummaryModelCsv {
178-
override predicate row(string row) {
179-
row =
180-
[
181-
"java.nio.file;Paths;true;get;;;Argument[0..1];ReturnValue;taint;manual",
182-
"java.nio.file;Path;true;resolve;;;Argument[-1..0];ReturnValue;taint;manual",
183-
"java.nio.file;Path;true;normalize;;;Argument[-1];ReturnValue;taint;manual",
184-
"java.nio.file;Path;true;toString;;;Argument[-1];ReturnValue;taint;manual",
185-
"io.undertow.server.handlers.resource;Resource;true;getFile;;;Argument[-1];ReturnValue;taint;manual",
186-
"io.undertow.server.handlers.resource;Resource;true;getFilePath;;;Argument[-1];ReturnValue;taint;manual",
187-
"io.undertow.server.handlers.resource;Resource;true;getPath;;;Argument[-1];ReturnValue;taint;manual"
188-
]
189-
}
190-
}
191-
192-
/** Taint models related to resource loading in Spring. */
193-
private class LoadSpringResourceFlowStep extends SummaryModelCsv {
194-
override predicate row(string row) {
195-
row =
196-
[
197-
"org.springframework.core.io;ClassPathResource;false;ClassPathResource;;;Argument[0];Argument[-1];taint;manual",
198-
"org.springframework.core.io;ResourceLoader;true;getResource;;;Argument[0];ReturnValue;taint;manual",
199-
"org.springframework.core.io;Resource;true;createRelative;;;Argument[0];ReturnValue;taint;manual"
200-
]
201-
}
202-
}
203-
204-
/** Sink models for methods that load Spring resources. */
205-
private class SpringResourceCsvSink extends SinkModelCsv {
206-
override predicate row(string row) {
207-
row =
208-
// Get spring resource
209-
"org.springframework.core.io;ClassPathResource;true;" +
210-
["getFilename", "getPath", "getURL", "resolveURL"] + ";;;Argument[-1];get-resource;manual"
211-
}
212-
}

0 commit comments

Comments
 (0)