Skip to content

Commit 49f3959

Browse files
committed
Convert url-redirection sinks to MaD
1 parent 3a285f5 commit 49f3959

23 files changed

+141
-187
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/go-all
4+
extensible: packageGrouping
5+
data:
6+
- ["clever-go", "clevergo.tech/clevergo"]
7+
- ["clever-go", "github.com/clevergo/clevergo"]
8+
- addsTo:
9+
pack: codeql/go-all
10+
extensible: sinkModel
11+
data:
12+
- ["group:clever-go", "Context", True, "Redirect", "", "", "Argument[1]", "url-redirection[receiver]", "manual"]

go/ql/lib/ext/github.com.beego.beego.server.web.context.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ extensions:
1010
pack: codeql/go-all
1111
extensible: sinkModel
1212
data:
13+
# path-injection
1314
- ["group:beego-context", "BeegoOutput", False, "Download", "", "", "Argument[0]", "path-injection", "manual"]
15+
# url-redirection
16+
- ["group:beego-context", "Context", True, "Redirect", "", "", "Argument[1]", "url-redirection", "manual"]
1417
- addsTo:
1518
pack: codeql/go-all
1619
extensible: summaryModel

go/ql/lib/ext/github.com.beego.beego.server.web.model.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ extensions:
2727
- ["group:beego", "Controller", False, "SaveToFile", "", "", "Argument[1]", "path-injection", "manual"]
2828
- ["group:beego", "Controller", False, "SaveToFileWithBuffer", "", "", "Argument[1]", "path-injection", "manual"] # only exists in v2
2929
- ["group:beego", "FileSystem", False, "Open", "", "", "Argument[0]", "path-injection", "manual"]
30+
# url-redirection
31+
- ["group:beego", "Controller", True, "Redirect", "", "", "Argument[0]", "url-redirection", "manual"]
3032
- addsTo:
3133
pack: codeql/go-all
3234
extensible: summaryModel

go/ql/lib/ext/github.com.gofiber.fiber.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ extensions:
33
pack: codeql/go-all
44
extensible: sinkModel
55
data:
6+
# path-injection
67
- ["github.com/gofiber/fiber", "Ctx", False, "SendFile", "", "", "Argument[0]", "path-injection", "manual"]
78
- ["github.com/gofiber/fiber", "Ctx", False, "Download", "", "", "Argument[0]", "path-injection", "manual"]
89
- ["github.com/gofiber/fiber", "Ctx", False, "SaveFile", "", "", "Argument[1]", "path-injection", "manual"]
910
- ["github.com/gofiber/fiber", "Ctx", False, "SaveFileToStorage", "", "", "Argument[1]", "path-injection", "manual"] # does not exist in v1
11+
# url-redirection
12+
- ["github.com/gofiber/fiber", "Ctx", True, "Redirect", "", "", "Argument[0]", "url-redirection[receiver]", "manual"]

go/ql/lib/ext/github.com.labstack.echo.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ extensions:
33
pack: codeql/go-all
44
extensible: sinkModel
55
data:
6+
# path-injection
67
- ["github.com/labstack/echo", "Context", False, "Attachment", "", "", "Argument[0]", "path-injection", "manual"]
78
- ["github.com/labstack/echo", "Context", False, "File", "", "", "Argument[0]", "path-injection", "manual"]
9+
# url-redirection
10+
- ["github.com/labstack/echo", "Context", True, "Redirect", "", "", "Argument[1]", "url-redirection", "manual"]
811
- addsTo:
912
pack: codeql/go-all
1013
extensible: summaryModel

go/ql/lib/ext/github.com.revel.revel.model.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ extensions:
55
data:
66
- ["revel", "github.com/revel/revel"]
77
- ["revel", "github.com/robfig/revel"]
8+
- addsTo:
9+
pack: codeql/go-all
10+
extensible: sinkModel
11+
data:
12+
- ["group:revel", "Controller", True, "Redirect", "", "", "Argument[0]", "url-redirection", "manual"] # It is currently assumed that a tainted `value` in `Redirect(url, value)`, which calls `Sprintf(url, value)` internally, cannot lead to an open redirect vulnerability.
813
- addsTo:
914
pack: codeql/go-all
1015
extensible: sourceModel

go/ql/lib/ext/github.com.valyala.fasthttp.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ extensions:
3838
- ["github.com/valyala/fasthttp", "RequestCtx", False, "SendFile", "", "", "Argument[0]", "path-injection", "manual"]
3939
- ["github.com/valyala/fasthttp", "RequestCtx", False, "SendFileBytes", "", "", "Argument[0]", "path-injection", "manual"]
4040
- ["github.com/valyala/fasthttp", "Response", False, "SendFile", "", "", "Argument[0]", "path-injection", "manual"]
41+
# url-redirection
42+
- ["github.com/valyala/fasthttp", "RequestCtx", True, "Redirect", "", "", "Argument[0]", "url-redirection", "manual"]
43+
- ["github.com/valyala/fasthttp", "RequestCtx", True, "RedirectBytes", "", "", "Argument[0]", "url-redirection", "manual"]
4144
- addsTo:
4245
pack: codeql/go-all
4346
extensible: summaryModel

go/ql/lib/ext/gopkg.in.macaron.model.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
extensions:
2+
- addsTo:
3+
pack: codeql/go-all
4+
extensible: sinkModel
5+
data:
6+
- ["gopkg.in/macaron", "Context", True, "Redirect", "", "", "Argument[0]", "url-redirection[receiver]", "manual"]
27
- addsTo:
38
pack: codeql/go-all
49
extensible: sourceModel

go/ql/lib/ext/net.http.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ extensions:
33
pack: codeql/go-all
44
extensible: sinkModel
55
data:
6+
# path-injection
67
- ["net/http", "", False, "ServeFile", "", "", "Argument[2]", "path-injection", "manual"]
8+
# url-redirection
9+
- ["net/http", "", True, "Redirect", "", "", "Argument[2]", "url-redirection[0]", "manual"]
710
- addsTo:
811
pack: codeql/go-all
912
extensible: summaryModel

go/ql/lib/semmle/go/concepts/HTTP.qll

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,47 @@ module Http {
305305
* open redirect exploits; for example, a form field submitted in a POST request.
306306
*/
307307
abstract class UnexploitableSource extends DataFlow::Node { }
308+
309+
private predicate sinkKindInfo(string kind, int rw) {
310+
kind = "url-redirection" and
311+
rw = -2
312+
or
313+
kind = "url-redirection[receiver]" and
314+
rw = -1
315+
or
316+
sinkModel(_, _, _, _, _, _, _, kind, _, _) and
317+
exists(string rwStr |
318+
rwStr.toInt() = rw and
319+
kind = "url-redirection[" + rwStr + "]"
320+
)
321+
}
322+
323+
private class DefaultHttpRedirect extends Range, DataFlow::CallNode {
324+
DataFlow::ArgumentNode url;
325+
int rw;
326+
327+
DefaultHttpRedirect() {
328+
this = url.getCall() and
329+
exists(string kind |
330+
sinkKindInfo(kind, rw) and
331+
sinkNode(url, kind)
332+
)
333+
}
334+
335+
override DataFlow::Node getUrl() {
336+
not url instanceof DataFlow::ImplicitVarargsSlice and
337+
result = url
338+
or
339+
url instanceof DataFlow::ImplicitVarargsSlice and
340+
result = this.getAnImplicitVarargsArgument()
341+
}
342+
343+
override Http::ResponseWriter getResponseWriter() {
344+
rw = -1 and result.getANode() = this.getReceiver()
345+
or
346+
rw >= 0 and result.getANode() = this.getArgument(rw)
347+
}
348+
}
308349
}
309350

310351
/**

0 commit comments

Comments
 (0)