Skip to content

Commit a8c3ef9

Browse files
egregius313owen-mc
authored andcommitted
Add squirrel models
1 parent 6d61820 commit a8c3ef9

File tree

3 files changed

+118
-0
lines changed

3 files changed

+118
-0
lines changed

go/ql/lib/ext/github.com.mastermind.squirrel.model.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,38 @@ extensions:
66
- ["squirrel", "github.com/Masterminds/squirrel"]
77
- ["squirrel", "gopkg.in/Masterminds/squirrel"]
88
- ["squirrel", "github.com/lann/squirrel"]
9+
- addsTo:
10+
pack: codeql/go-all
11+
extensible: sourceModel
12+
data:
13+
- ["group:squirrel", "", True, "QueryContextWith", "", "", "ReturnValue[0]", "database", "manual"]
14+
- ["group:squirrel", "", True, "QueryRowContextWith", "", "", "ReturnValue", "database", "manual"]
15+
- ["group:squirrel", "", True, "QueryRowWith", "", "", "ReturnValue", "database", "manual"]
16+
- ["group:squirrel", "", True, "QueryWith", "", "", "ReturnValue[0]", "database", "manual"]
17+
- ["group:squirrel", "DeleteBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
18+
- ["group:squirrel", "DeleteBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
19+
- ["group:squirrel", "DeleteBuilder", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
20+
- ["group:squirrel", "DeleteBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
21+
- ["group:squirrel", "InsertBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
22+
- ["group:squirrel", "InsertBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
23+
- ["group:squirrel", "InsertBuilder", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
24+
- ["group:squirrel", "InsertBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
25+
- ["group:squirrel", "QueryRower", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
26+
- ["group:squirrel", "QueryRowerContext", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
27+
- ["group:squirrel", "Queryer", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
28+
- ["group:squirrel", "QueryerContext", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
29+
- ["group:squirrel", "SelectBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
30+
- ["group:squirrel", "SelectBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
31+
- ["group:squirrel", "SelectBuilder", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
32+
- ["group:squirrel", "SelectBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
33+
- ["group:squirrel", "StdSql", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
34+
- ["group:squirrel", "StdSql", True, "QueryRow", "", "", "ReturnValue", "database", "manual"]
35+
- ["group:squirrel", "StdSqlCtx", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
36+
- ["group:squirrel", "StdSqlCtx", True, "QueryRowContext", "", "", "ReturnValue", "database", "manual"]
37+
- ["group:squirrel", "UpdateBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
38+
- ["group:squirrel", "UpdateBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
39+
- ["group:squirrel", "UpdateBuilder", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
40+
- ["group:squirrel", "UpdateBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
941
- addsTo:
1042
pack: codeql/go-all
1143
extensible: sinkModel

go/ql/lib/go.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import semmle.go.frameworks.Protobuf
5757
import semmle.go.frameworks.Revel
5858
import semmle.go.frameworks.Spew
5959
import semmle.go.frameworks.SQL
60+
import semmle.go.frameworks.Squirrel
6061
import semmle.go.frameworks.Stdlib
6162
import semmle.go.frameworks.SystemCommandExecutors
6263
import semmle.go.frameworks.Testing
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `squirrel` ORM package.
3+
*/
4+
5+
import go
6+
7+
/**
8+
* Provides classes modeling security-relevant aspects of the `squirrel` ORM package.
9+
*/
10+
module Squirrel {
11+
private string packagePath() {
12+
result =
13+
package([
14+
"github.com/Masterminds/squirrel",
15+
"github.com/lann/squirrel",
16+
"gopkg.in/Masterminds/squirrel",
17+
], "")
18+
}
19+
20+
private class RowScan extends TaintTracking::FunctionModel, Method {
21+
FunctionInput inp;
22+
FunctionOutput outp;
23+
24+
RowScan() {
25+
// signature: func (rs *RowScanner) Scan(dest ...interface{}) error
26+
this.hasQualifiedName(packagePath(), "Row", "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+
36+
private class RowScannerScan extends TaintTracking::FunctionModel, Method {
37+
FunctionInput inp;
38+
FunctionOutput outp;
39+
40+
RowScannerScan() {
41+
// signature: func (rs *RowScanner) Scan(dest ...interface{}) error
42+
this.hasQualifiedName(packagePath(), "RowScanner", "Scan") and
43+
inp.isReceiver() and
44+
outp.isParameter(_)
45+
}
46+
47+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
48+
input = inp and output = outp
49+
}
50+
}
51+
52+
private class BuilderScan extends TaintTracking::FunctionModel, Method {
53+
FunctionInput inp;
54+
FunctionOutput outp;
55+
56+
BuilderScan() {
57+
// signature: func (rs *InsertBuilder) Scan(dest ...interface{}) error
58+
this.hasQualifiedName(packagePath(),
59+
["DeleteBuilder", "InsertBuilder", "SelectBuilder", "UpdateBuilder"], "Scan") and
60+
inp.isReceiver() and
61+
outp.isParameter(_)
62+
}
63+
64+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
65+
input = inp and output = outp
66+
}
67+
}
68+
69+
private class BuilderScanContext extends TaintTracking::FunctionModel, Method {
70+
FunctionInput inp;
71+
FunctionOutput outp;
72+
73+
BuilderScanContext() {
74+
// signature: func (rs *InsertBuilder) ScanContext(ctx context.Context, dest ...interface{}) error
75+
this.hasQualifiedName(packagePath(),
76+
["DeleteBuilder", "InsertBuilder", "SelectBuilder", "UpdateBuilder"], "ScanContext") and
77+
inp.isReceiver() and
78+
exists(int i | i > 0 | outp.isParameter(i))
79+
}
80+
81+
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
82+
input = inp and output = outp
83+
}
84+
}
85+
}

0 commit comments

Comments
 (0)