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

Commit 27ba893

Browse files
committed
Add taint-tracking for context package
1 parent 362d210 commit 27ba893

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import semmle.go.frameworks.stdlib.CompressZlib
1515
import semmle.go.frameworks.stdlib.Mime
1616
import semmle.go.frameworks.stdlib.MimeMultipart
1717
import semmle.go.frameworks.stdlib.MimeQuotedprintable
18+
import semmle.go.frameworks.stdlib.Context
1819
import semmle.go.frameworks.stdlib.Path
1920
import semmle.go.frameworks.stdlib.PathFilepath
2021
import semmle.go.frameworks.stdlib.Reflect
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `context` package.
3+
*/
4+
5+
import go
6+
7+
/** Provides models of commonly used functions in the `context` package. */
8+
module Context {
9+
private class FunctionModels extends TaintTracking::FunctionModel {
10+
FunctionInput inp;
11+
FunctionOutput outp;
12+
13+
FunctionModels() {
14+
// signature: func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
15+
hasQualifiedName("context", "WithCancel") and
16+
(inp.isParameter(0) and outp.isResult(0))
17+
or
18+
// signature: func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
19+
hasQualifiedName("context", "WithDeadline") and
20+
(inp.isParameter(0) and outp.isResult(0))
21+
or
22+
// signature: func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
23+
hasQualifiedName("context", "WithTimeout") and
24+
(inp.isParameter(0) and outp.isResult(0))
25+
or
26+
// signature: func WithValue(parent Context, key interface{}, val interface{}) Context
27+
hasQualifiedName("context", "WithValue") and
28+
(inp.isParameter(_) and outp.isResult())
29+
}
30+
31+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
32+
input = inp and output = outp
33+
}
34+
}
35+
36+
private class MethodModels extends TaintTracking::FunctionModel, Method {
37+
FunctionInput inp;
38+
FunctionOutput outp;
39+
40+
MethodModels() {
41+
// signature: func (Context).Value(key interface{}) interface{}
42+
this.implements("context", "Context", "Value") and
43+
(inp.isReceiver() and outp.isResult())
44+
}
45+
46+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
47+
input = inp and output = outp
48+
}
49+
}
50+
}

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

Lines changed: 88 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)