Skip to content
This repository was archived by the owner on Jan 5, 2023. It is now read-only.

Commit 88e03c3

Browse files
authored
Merge pull request #322 from gagliardetto/standard-lib-pt-11
Add taint-tracking for packages in `html/*`
2 parents 8d7cbe3 + a340270 commit 88e03c3

File tree

6 files changed

+265
-2
lines changed

6 files changed

+265
-2
lines changed

ql/src/semmle/go/frameworks/Stdlib.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import semmle.go.frameworks.stdlib.EncodingHex
2727
import semmle.go.frameworks.stdlib.EncodingJson
2828
import semmle.go.frameworks.stdlib.EncodingPem
2929
import semmle.go.frameworks.stdlib.EncodingXml
30+
import semmle.go.frameworks.stdlib.Html
31+
import semmle.go.frameworks.stdlib.HtmlTemplate
3032
import semmle.go.frameworks.stdlib.Path
3133
import semmle.go.frameworks.stdlib.PathFilepath
3234
import semmle.go.frameworks.stdlib.Reflect
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `html` package.
3+
*/
4+
5+
import go
6+
7+
/** Provides models of commonly used functions in the `html` package. */
8+
module Html {
9+
private class Escape extends EscapeFunction::Range {
10+
Escape() { hasQualifiedName("html", "EscapeString") }
11+
12+
override string kind() { result = "html" }
13+
}
14+
15+
private class FunctionModels extends TaintTracking::FunctionModel {
16+
FunctionInput inp;
17+
FunctionOutput outp;
18+
19+
FunctionModels() {
20+
// signature: func EscapeString(s string) string
21+
hasQualifiedName("html", "EscapeString") and
22+
(inp.isParameter(0) and outp.isResult())
23+
or
24+
// signature: func UnescapeString(s string) string
25+
hasQualifiedName("html", "UnescapeString") and
26+
(inp.isParameter(0) and outp.isResult())
27+
}
28+
29+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
30+
input = inp and output = outp
31+
}
32+
}
33+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `html/template` package.
3+
*/
4+
5+
import go
6+
7+
/** Provides models of commonly used functions in the `html/template` package. */
8+
module HtmlTemplate {
9+
private class TemplateEscape extends EscapeFunction::Range {
10+
string kind;
11+
12+
TemplateEscape() {
13+
exists(string fn |
14+
fn.matches("HTMLEscape%") and kind = "html"
15+
or
16+
fn.matches("JSEscape%") and kind = "js"
17+
or
18+
fn.matches("URLQueryEscape%") and kind = "url"
19+
|
20+
this.hasQualifiedName("html/template", fn)
21+
)
22+
}
23+
24+
override string kind() { result = kind }
25+
}
26+
27+
private class FunctionModels extends TaintTracking::FunctionModel {
28+
FunctionInput inp;
29+
FunctionOutput outp;
30+
31+
FunctionModels() {
32+
// signature: func HTMLEscape(w io.Writer, b []byte)
33+
hasQualifiedName("html/template", "HTMLEscape") and
34+
(inp.isParameter(1) and outp.isParameter(0))
35+
or
36+
// signature: func HTMLEscapeString(s string) string
37+
hasQualifiedName("html/template", "HTMLEscapeString") and
38+
(inp.isParameter(0) and outp.isResult())
39+
or
40+
// signature: func HTMLEscaper(args ...interface{}) string
41+
hasQualifiedName("html/template", "HTMLEscaper") and
42+
(inp.isParameter(_) and outp.isResult())
43+
or
44+
// signature: func JSEscape(w io.Writer, b []byte)
45+
hasQualifiedName("html/template", "JSEscape") and
46+
(inp.isParameter(1) and outp.isParameter(0))
47+
or
48+
// signature: func JSEscapeString(s string) string
49+
hasQualifiedName("html/template", "JSEscapeString") and
50+
(inp.isParameter(0) and outp.isResult())
51+
or
52+
// signature: func JSEscaper(args ...interface{}) string
53+
hasQualifiedName("html/template", "JSEscaper") and
54+
(inp.isParameter(_) and outp.isResult())
55+
or
56+
// signature: func URLQueryEscaper(args ...interface{}) string
57+
hasQualifiedName("html/template", "URLQueryEscaper") and
58+
(inp.isParameter(_) and outp.isResult())
59+
}
60+
61+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
62+
input = inp and output = outp
63+
}
64+
}
65+
66+
private class MethodModels extends TaintTracking::FunctionModel, Method {
67+
FunctionInput inp;
68+
FunctionOutput outp;
69+
70+
MethodModels() {
71+
// signature: func (*Template).Execute(wr io.Writer, data interface{}) error
72+
this.hasQualifiedName("html/template", "Template", "Execute") and
73+
(inp.isParameter(1) and outp.isParameter(0))
74+
or
75+
// signature: func (*Template).ExecuteTemplate(wr io.Writer, name string, data interface{}) error
76+
this.hasQualifiedName("html/template", "Template", "ExecuteTemplate") and
77+
(inp.isParameter(2) and outp.isParameter(0))
78+
}
79+
80+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
81+
input = inp and output = outp
82+
}
83+
}
84+
}

ql/src/semmle/go/frameworks/stdlib/TextTemplate.qll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ module TextTemplate {
1818
fn.matches("URLQueryEscape%") and kind = "url"
1919
|
2020
this.hasQualifiedName("text/template", fn)
21-
or
22-
this.hasQualifiedName("html/template", fn)
2321
)
2422
}
2523

ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Html.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/HtmlTemplate.go

Lines changed: 116 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)