We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
2 parents 3bf2416 + bc68e44 commit 5cc34a1Copy full SHA for 5cc34a1
4 files changed
go/ql/lib/ext/database.sql.model.yml
@@ -53,8 +53,6 @@ extensions:
53
- ["database/sql", "Conn", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
54
- ["database/sql", "DB", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
55
- ["database/sql", "DB", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
56
- - ["database/sql", "Row", True, "Scan", "", "", "Argument[receiver]", "Argument[0].ArrayElement", "taint", "manual"]
57
- - ["database/sql", "Rows", True, "Scan", "", "", "Argument[receiver]", "Argument[0].ArrayElement", "taint", "manual"]
58
- ["database/sql", "Scanner", True, "Scan", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"]
59
- ["database/sql", "Tx", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
60
- ["database/sql", "Tx", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
go/ql/lib/semmle/go/frameworks/stdlib/DatabaseSql.qll
@@ -66,4 +66,24 @@ module DatabaseSql {
66
result = this.getReceiver().getAPredecessor*().(DataFlow::MethodCallNode).getAnArgument()
67
}
68
69
+
70
+ // These are expressed using TaintTracking::FunctionModel because varargs functions don't work with Models-as-Data sumamries yet.
71
+ private class SqlMethodModels extends TaintTracking::FunctionModel, Method {
72
+ FunctionInput inp;
73
+ FunctionOutput outp;
74
75
+ SqlMethodModels() {
76
+ // signature: func (*Row) Scan(dest ...interface{}) error
77
+ this.hasQualifiedName("database/sql", "Row", "Scan") and
78
+ (inp.isReceiver() and outp.isParameter(_))
79
+ or
80
+ // signature: func (*Rows) Scan(dest ...interface{}) error
81
+ this.hasQualifiedName("database/sql", "Rows", "Scan") and
82
83
+ }
84
85
+ override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
86
+ input = inp and output = outp
87
88
89
go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected
@@ -2,21 +2,16 @@
2
| StoredCommand.go:14:22:14:28 | cmdName | StoredCommand.go:11:2:11:27 | ... := ...[0] | StoredCommand.go:14:22:14:28 | cmdName | This command depends on a $@. | StoredCommand.go:11:2:11:27 | ... := ...[0] | stored value |
3
edges
4
| StoredCommand.go:11:2:11:27 | ... := ...[0] | StoredCommand.go:13:2:13:5 | rows | provenance | Src:MaD:2 |
5
-| StoredCommand.go:13:2:13:5 | rows | StoredCommand.go:13:2:13:20 | []type{args} | provenance | MaD:3 |
6
-| StoredCommand.go:13:2:13:5 | rows | StoredCommand.go:13:2:13:20 | []type{args} [array] | provenance | MaD:3 |
7
-| StoredCommand.go:13:2:13:20 | []type{args} | StoredCommand.go:13:12:13:19 | &... | provenance | |
8
-| StoredCommand.go:13:2:13:20 | []type{args} | StoredCommand.go:14:22:14:28 | cmdName | provenance | Sink:MaD:1 |
+| StoredCommand.go:13:2:13:5 | rows | StoredCommand.go:13:12:13:19 | &... | provenance | FunctionModel |
9
| StoredCommand.go:13:2:13:20 | []type{args} [array] | StoredCommand.go:13:12:13:19 | &... | provenance | |
10
| StoredCommand.go:13:12:13:19 | &... | StoredCommand.go:13:2:13:20 | []type{args} [array] | provenance | |
11
| StoredCommand.go:13:12:13:19 | &... | StoredCommand.go:14:22:14:28 | cmdName | provenance | Sink:MaD:1 |
12
models
13
| 1 | Sink: os/exec; ; false; Command; ; ; Argument[0]; command-injection; manual |
14
| 2 | Source: database/sql; DB; true; Query; ; ; ReturnValue[0]; database; manual |
15
-| 3 | Summary: database/sql; Rows; true; Scan; ; ; Argument[receiver]; Argument[0].ArrayElement; taint; manual |
16
nodes
17
| StoredCommand.go:11:2:11:27 | ... := ...[0] | semmle.label | ... := ...[0] |
18
| StoredCommand.go:13:2:13:5 | rows | semmle.label | rows |
19
-| StoredCommand.go:13:2:13:20 | []type{args} | semmle.label | []type{args} |
20
| StoredCommand.go:13:2:13:20 | []type{args} [array] | semmle.label | []type{args} [array] |
21
| StoredCommand.go:13:12:13:19 | &... | semmle.label | &... |
22
| StoredCommand.go:14:22:14:28 | cmdName | semmle.label | cmdName |
go/ql/test/query-tests/Security/CWE-079/StoredXss.expected
@@ -5,11 +5,8 @@
| StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | provenance | |
| stored.go:18:3:18:28 | ... := ...[0] | stored.go:25:14:25:17 | rows | provenance | Src:MaD:1 |
-| stored.go:25:14:25:17 | rows | stored.go:25:14:25:34 | []type{args} | provenance | MaD:2 |
-| stored.go:25:14:25:17 | rows | stored.go:25:14:25:34 | []type{args} [array] | provenance | MaD:2 |
-| stored.go:25:14:25:34 | []type{args} | stored.go:25:24:25:26 | &... | provenance | |
-| stored.go:25:14:25:34 | []type{args} | stored.go:25:29:25:33 | &... | provenance | |
-| stored.go:25:14:25:34 | []type{args} | stored.go:30:22:30:25 | name | provenance | |
+| stored.go:25:14:25:17 | rows | stored.go:25:24:25:26 | &... | provenance | FunctionModel |
+| stored.go:25:14:25:17 | rows | stored.go:25:29:25:33 | &... | provenance | FunctionModel |
| stored.go:25:14:25:34 | []type{args} [array] | stored.go:25:24:25:26 | &... | provenance | |
| stored.go:25:14:25:34 | []type{args} [array] | stored.go:25:29:25:33 | &... | provenance | |
| stored.go:25:24:25:26 | &... | stored.go:25:14:25:34 | []type{args} [array] | provenance | |
@@ -18,13 +15,11 @@ edges
| stored.go:59:30:59:33 | definition of path | stored.go:61:22:61:25 | path | provenance | |
| 1 | Source: database/sql; DB; true; Query; ; ; ReturnValue[0]; database; manual |
-| 2 | Summary: database/sql; Rows; true; Scan; ; ; Argument[receiver]; Argument[0].ArrayElement; taint; manual |
23
| StoredXss.go:13:21:13:31 | call to Name | semmle.label | call to Name |
24
| StoredXss.go:13:21:13:36 | ...+... | semmle.label | ...+... |
25
| stored.go:18:3:18:28 | ... := ...[0] | semmle.label | ... := ...[0] |
26
| stored.go:25:14:25:17 | rows | semmle.label | rows |
27
-| stored.go:25:14:25:34 | []type{args} | semmle.label | []type{args} |
28
| stored.go:25:14:25:34 | []type{args} [array] | semmle.label | []type{args} [array] |
29
| stored.go:25:24:25:26 | &... | semmle.label | &... |
30
| stored.go:25:29:25:33 | &... | semmle.label | &... |
0 commit comments