Skip to content

Commit 28770c5

Browse files
authored
Merge pull request #18863 from egregius313/egregius313/go/mad/database/rqlite
Go: Add `database` sources for the `gorqlite` package
2 parents e08ae22 + 4f204ee commit 28770c5

File tree

5 files changed

+347
-0
lines changed

5 files changed

+347
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added `database` source models for the `github.com/rqlite/gorqlite` package.

go/ql/lib/ext/github.com.rqlite.gorqlite.model.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,21 @@ extensions:
33
pack: codeql/go-all
44
extensible: packageGrouping
55
data:
6+
- ["gorqlite", "github.com/kanikanema/gorqlite"]
67
- ["gorqlite", "github.com/rqlite/gorqlite"]
78
- ["gorqlite", "github.com/raindog308/gorqlite"]
9+
- addsTo:
10+
pack: codeql/go-all
11+
extensible: sourceModel
12+
data:
13+
- ["group:gorqlite", "Connection", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
14+
- ["group:gorqlite", "Connection", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
15+
- ["group:gorqlite", "Connection", True, "QueryOne", "", "", "ReturnValue[0]", "database", "manual"]
16+
- ["group:gorqlite", "Connection", True, "QueryOneContext", "", "", "ReturnValue[0]", "database", "manual"]
17+
- ["group:gorqlite", "Connection", True, "QueryOneParameterized", "", "", "ReturnValue[0]", "database", "manual"]
18+
- ["group:gorqlite", "Connection", True, "QueryOneParameterizedContext", "", "", "ReturnValue[0]", "database", "manual"]
19+
- ["group:gorqlite", "Connection", True, "QueryParameterized", "", "", "ReturnValue[0]", "database", "manual"]
20+
- ["group:gorqlite", "Connection", True, "QueryParameterizedContext", "", "", "ReturnValue[0]", "database", "manual"]
821
- addsTo:
922
pack: codeql/go-all
1023
extensible: sinkModel
@@ -33,3 +46,9 @@ extensions:
3346
- ["group:gorqlite", "Connection", True, "WriteOneParameterizedContext", "", "", "Argument[1]", "sql-injection", "manual"]
3447
- ["group:gorqlite", "Connection", True, "WriteParameterized", "", "", "Argument[0]", "sql-injection", "manual"]
3548
- ["group:gorqlite", "Connection", True, "WriteParameterizedContext", "", "", "Argument[1]", "sql-injection", "manual"]
49+
- addsTo:
50+
pack: codeql/go-all
51+
extensible: summaryModel
52+
data:
53+
- ["group:gorqlite", "QueryResult", True, "Map", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"]
54+
- ["group:gorqlite", "QueryResult", True, "Slice", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"]
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `gorqlite` package.
3+
*/
4+
5+
import go
6+
7+
/**
8+
* Provides classes modeling security-relevant aspects of the `gorqlite` package.
9+
*/
10+
module Gorqlite {
11+
private string packagePath() {
12+
result =
13+
package([
14+
"github.com/rqlite/gorqlite", "github.com/raindog308/gorqlite",
15+
"github.com/kanikanema/gorqlite"
16+
], "")
17+
}
18+
19+
// These are expressed using TaintTracking::FunctionModel because varargs functions don't work with Models-as-Data summaries yet.
20+
private class QueryResultScan extends TaintTracking::FunctionModel, Method {
21+
FunctionInput inp;
22+
FunctionOutput outp;
23+
24+
QueryResultScan() {
25+
// signature: func (qr *QueryResult) Scan(dest ...interface{}) error
26+
this.hasQualifiedName(packagePath(), "QueryResult", "Scan") and
27+
inp.isReceiver() and
28+
outp.isParameter(_)
29+
}
30+
31+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
32+
input = inp and output = outp
33+
}
34+
}
35+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package test
2+
3+
//go:generate depstubber -vendor github.com/rqlite/gorqlite Connection,QueryResult
4+
5+
import (
6+
"context"
7+
8+
"github.com/rqlite/gorqlite"
9+
)
10+
11+
func parameterize(query string) gorqlite.ParameterizedStatement {
12+
return gorqlite.ParameterizedStatement{
13+
Query: query,
14+
Arguments: []interface{}{},
15+
}
16+
}
17+
18+
func test_rqlite_gorqlite(conn *gorqlite.Connection, ctx context.Context, query []string) {
19+
v1, err := conn.Query(query) // $ source
20+
if err != nil {
21+
return
22+
}
23+
24+
sink(v1) // $ hasTaintFlow="v1"
25+
26+
v2, err := conn.QueryContext(ctx, query) // $ source
27+
if err != nil {
28+
return
29+
}
30+
31+
sink(v2) // $ hasTaintFlow="v2"
32+
33+
v3, err := conn.QueryOne(query[0]) // $ source
34+
if err != nil {
35+
return
36+
}
37+
38+
r3, err := v3.Slice()
39+
if err != nil {
40+
return
41+
}
42+
43+
sink(r3) // $ hasTaintFlow="r3"
44+
45+
v4, err := conn.QueryOneContext(ctx, query[0]) // $ source
46+
if err != nil {
47+
return
48+
}
49+
50+
var r41, r42, r43 string
51+
v4.Scan(&r41, &r42, &r43)
52+
53+
v5, err := conn.QueryOneParameterized(parameterize(query[0])) // $ source
54+
if err != nil {
55+
return
56+
}
57+
58+
r5, err := v5.Map()
59+
60+
r5Name := r5["name"]
61+
62+
sink(r5Name) // $ hasTaintFlow="r5Name"
63+
64+
v6, err := conn.QueryOneParameterizedContext(ctx, parameterize(query[0])) // $ source
65+
if err != nil {
66+
return
67+
}
68+
69+
sink(v6) // $ hasTaintFlow="v6"
70+
71+
v7, err := conn.QueryParameterized([]gorqlite.ParameterizedStatement{parameterize(query[0])}) // $ source
72+
if err != nil {
73+
return
74+
}
75+
76+
sink(v7) // $ hasTaintFlow="v7"
77+
78+
v8, err := conn.QueryParameterizedContext(ctx, []gorqlite.ParameterizedStatement{parameterize(query[0])}) // $ source
79+
if err != nil {
80+
return
81+
}
82+
83+
sink(v8) // $ hasTaintFlow="v8"
84+
}

go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/rqlite/gorqlite/stub.go

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