@@ -22,9 +22,16 @@ def full_ssrf():
22
22
url = "https://" + user_input + "/foo?key=" + query_val
23
23
requests .get (url ) # NOT OK -- user has full control
24
24
25
- # currently it's not possible to sanitize a step, so due to use-use flow, if we sanitize
26
- # a value that is used later on, it will NOT be tainted later on... so we need to make
27
- # separate tests for each of the vairant cases, so show that we handle all of them.
25
+ # taint-steps are added as `fromNode -> toNode`, but when adding a sanitizer it's
26
+ # currently only possible to so on either `fromNode` or `toNode` (either all edges in
27
+ # and out, or just the edges in or out). The sanitizers for full URL control is applied
28
+ # on the `fromNode`, since for `"https://{}/{}".format(user_input1, user_input2)` there
29
+ # is still a valid taint-step for `user_input1` -- if we made `toNode` a sanitizer that
30
+ # would also remove this flow that we actually want. When coupled with use-use flow,
31
+ # this means that later uses of a sanitized value will no longer be tainted, so
32
+ # `requests.get(user_input2)` would no longer give an alert. To overcome this problem,
33
+ # we split these tests into multiple functions, so we do not get this use-use flow, and
34
+ # therefore know we are able to see where the sanitizers are applied.
28
35
29
36
def full_ssrf_format ():
30
37
user_input = request .args ['untrusted_input' ]
0 commit comments