Skip to content

Commit b5fbf2e

Browse files
committed
Add models for third arg of getForObject
No attempt to stop FPs.
1 parent 65fb895 commit b5fbf2e

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

java/ql/lib/ext/org.springframework.web.client.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ extensions:
1616
- ["org.springframework.web.client", "RestTemplate", False, "execute", "", "", "Argument[0]", "request-forgery", "manual"]
1717
- ["org.springframework.web.client", "RestTemplate", False, "getForEntity", "", "", "Argument[0]", "request-forgery", "manual"]
1818
- ["org.springframework.web.client", "RestTemplate", False, "getForObject", "", "", "Argument[0]", "request-forgery", "manual"]
19+
- ["org.springframework.web.client", "RestTemplate", False, "getForObject", "", "", "Argument[2]", "request-forgery", "manual"] # This is a workaround for the fact that sink model can't currently have access paths
20+
# - ["org.springframework.web.client", "RestTemplate", False, "getForObject", "", "", "Argument[2].ArrayElement", "request-forgery", "manual"]
21+
# - ["org.springframework.web.client", "RestTemplate", False, "getForObject", "", "", "Argument[2].MapValue", "request-forgery", "manual"]
1922
- ["org.springframework.web.client", "RestTemplate", False, "headForHeaders", "", "", "Argument[0]", "request-forgery", "manual"]
2023
- ["org.springframework.web.client", "RestTemplate", False, "optionsForAllow", "", "", "Argument[0]", "request-forgery", "manual"]
2124
- ["org.springframework.web.client", "RestTemplate", False, "patchForObject", "", "", "Argument[0]", "request-forgery", "manual"]

java/ql/test/query-tests/security/CWE-918/SpringSSRF.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.net.http.HttpRequest;
1414
import java.net.Proxy.Type;
1515
import java.io.InputStream;
16+
import java.util.Map;
1617

1718
import org.apache.http.client.methods.HttpGet;
1819
import javax.servlet.ServletException;
@@ -32,6 +33,14 @@ protected void doGet(HttpServletRequest request2, HttpServletResponse response2)
3233
restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, String.class); // $ SSRF
3334
restTemplate.execute(fooResourceUrl, HttpMethod.POST, null, null, "test"); // $ SSRF
3435
restTemplate.getForObject(fooResourceUrl, String.class, "test"); // $ SSRF
36+
restTemplate.getForObject("http://{foo}", String.class, fooResourceUrl); // $ SSRF
37+
restTemplate.getForObject("http://{foo}/a/b", String.class, fooResourceUrl); // $ SSRF
38+
restTemplate.getForObject("http://safe.com/{foo}", String.class, fooResourceUrl); // $ SPURIOUS: SSRF // not bad - the tainted value does not affect the host
39+
restTemplate.getForObject("http://{foo}", String.class, "safe.com", fooResourceUrl); // $ SPURIOUS: SSRF // not bad - the tainted value is unused
40+
restTemplate.getForObject("http://{foo}", String.class, Map.of("foo", fooResourceUrl)); // $ SSRF
41+
restTemplate.getForObject("http://safe.com/{foo}", String.class, Map.of("foo", fooResourceUrl)); // $ SPURIOUS: SSRF // not bad - the tainted value does not affect the host
42+
restTemplate.getForObject("http://{foo}", String.class, Map.of("foo", "safe.com", "unused", fooResourceUrl)); // $ SPURIOUS: SSRF // not bad - the key for the tainted value is unused
43+
restTemplate.getForObject("http://{foo}", String.class, Map.of("foo", "safe.com", fooResourceUrl, "unused")); // not bad - the tainted value is in a map key
3544
restTemplate.patchForObject(fooResourceUrl, new String("object"), String.class, "hi"); // $ SSRF
3645
restTemplate.postForEntity(new URI(fooResourceUrl), new String("object"), String.class); // $ SSRF
3746
restTemplate.postForLocation(fooResourceUrl, new String("object")); // $ SSRF

0 commit comments

Comments
 (0)