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

Commit e9bf331

Browse files
authored
Merge pull request #328 from owen-mc/gorm-exec
Update GORM model
2 parents 3758c6b + 13e82de commit e9bf331

File tree

8 files changed

+831
-28
lines changed

8 files changed

+831
-28
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
lgtm,codescanning
2+
* Support for the [GORM](https://github.com/go-gorm/gorm) ORM library (specifically, its SQL
3+
statement building facilities) has been improved, which may lead to more results from the
4+
security queries.

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,15 @@ module SQL {
161161
}
162162
}
163163

164-
/** A model for sinks of github.com/jinzhu/gorm. */
164+
/** A model for sinks of GORM. */
165165
private class GormSink extends SQL::QueryString::Range {
166166
GormSink() {
167-
exists(Method meth, string name |
168-
meth.hasQualifiedName("github.com/jinzhu/gorm", "DB", name) and
167+
exists(Method meth, string package, string name |
168+
meth.hasQualifiedName(package, "DB", name) and
169169
this = meth.getACall().getArgument(0) and
170-
name in ["Where", "Raw", "Order", "Not", "Or", "Select", "Table", "Group", "Having", "Joins"]
170+
package in ["github.com/jinzhu/gorm", "github.com/go-gorm/gorm", "gorm.io/gorm"] and
171+
name in ["Where", "Raw", "Order", "Not", "Or", "Select", "Table", "Group", "Having",
172+
"Joins", "Exec", "Distinct", "Pluck"]
171173
)
172174
}
173175
}

ql/test/library-tests/semmle/go/frameworks/SQL/Gorm/go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ module gormtest
33
go 1.14
44

55
require (
6-
github.com/jinzhu/gorm v1.9.15
6+
github.com/jinzhu/gorm v1.9.16
7+
gorm.io/gorm v1.20.0
78
)
Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
1-
| gorm.go:15:11:15:19 | untrusted |
2-
| gorm.go:16:9:16:17 | untrusted |
3-
| gorm.go:17:11:17:19 | untrusted |
4-
| gorm.go:18:8:18:16 | untrusted |
5-
| gorm.go:19:12:19:20 | untrusted |
6-
| gorm.go:20:11:20:19 | untrusted |
7-
| gorm.go:21:11:21:19 | untrusted |
8-
| gorm.go:22:12:22:20 | untrusted |
9-
| gorm.go:23:11:23:19 | untrusted |
1+
| gorm.go:20:12:20:20 | untrusted | github.com/jinzhu/gorm | DB | Where |
2+
| gorm.go:21:10:21:18 | untrusted | github.com/jinzhu/gorm | DB | Raw |
3+
| gorm.go:22:10:22:18 | untrusted | github.com/jinzhu/gorm | DB | Not |
4+
| gorm.go:23:12:23:20 | untrusted | github.com/jinzhu/gorm | DB | Order |
5+
| gorm.go:24:9:24:17 | untrusted | github.com/jinzhu/gorm | DB | Or |
6+
| gorm.go:25:13:25:21 | untrusted | github.com/jinzhu/gorm | DB | Select |
7+
| gorm.go:26:12:26:20 | untrusted | github.com/jinzhu/gorm | DB | Table |
8+
| gorm.go:27:12:27:20 | untrusted | github.com/jinzhu/gorm | DB | Group |
9+
| gorm.go:28:13:28:21 | untrusted | github.com/jinzhu/gorm | DB | Having |
10+
| gorm.go:29:12:29:20 | untrusted | github.com/jinzhu/gorm | DB | Joins |
11+
| gorm.go:30:11:30:19 | untrusted | github.com/jinzhu/gorm | DB | Exec |
12+
| gorm.go:31:12:31:20 | untrusted | github.com/jinzhu/gorm | DB | Pluck |
13+
| gorm.go:34:12:34:20 | untrusted | gorm.io/gorm | DB | Where |
14+
| gorm.go:35:10:35:18 | untrusted | gorm.io/gorm | DB | Raw |
15+
| gorm.go:36:10:36:18 | untrusted | gorm.io/gorm | DB | Not |
16+
| gorm.go:37:12:37:20 | untrusted | gorm.io/gorm | DB | Order |
17+
| gorm.go:38:9:38:17 | untrusted | gorm.io/gorm | DB | Or |
18+
| gorm.go:39:13:39:21 | untrusted | gorm.io/gorm | DB | Select |
19+
| gorm.go:40:12:40:20 | untrusted | gorm.io/gorm | DB | Table |
20+
| gorm.go:41:12:41:20 | untrusted | gorm.io/gorm | DB | Group |
21+
| gorm.go:42:13:42:21 | untrusted | gorm.io/gorm | DB | Having |
22+
| gorm.go:43:12:43:20 | untrusted | gorm.io/gorm | DB | Joins |
23+
| gorm.go:44:11:44:19 | untrusted | gorm.io/gorm | DB | Exec |
24+
| gorm.go:45:15:45:23 | untrusted | gorm.io/gorm | DB | Distinct |
25+
| gorm.go:46:12:46:20 | untrusted | gorm.io/gorm | DB | Pluck |
Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package gormtest
22

3+
//go:generate depstubber -vendor github.com/jinzhu/gorm DB
4+
//go:generate depstubber -vendor gorm.io/gorm DB
5+
36
import (
4-
"github.com/jinzhu/gorm"
7+
gorm1 "github.com/jinzhu/gorm"
8+
gorm2 "gorm.io/gorm"
59
)
610

711
func getUntrustedString() string {
@@ -10,16 +14,35 @@ func getUntrustedString() string {
1014

1115
func main() {
1216

13-
db := gorm.DB{}
1417
untrusted := getUntrustedString()
15-
db.Where(untrusted)
16-
db.Not(untrusted)
17-
db.Order(untrusted)
18-
db.Or(untrusted)
19-
db.Select(untrusted)
20-
db.Table(untrusted)
21-
db.Group(untrusted)
22-
db.Having(untrusted)
23-
db.Joins(untrusted)
18+
19+
db1 := gorm1.DB{}
20+
db1.Where(untrusted)
21+
db1.Raw(untrusted)
22+
db1.Not(untrusted)
23+
db1.Order(untrusted)
24+
db1.Or(untrusted)
25+
db1.Select(untrusted)
26+
db1.Table(untrusted)
27+
db1.Group(untrusted)
28+
db1.Having(untrusted)
29+
db1.Joins(untrusted)
30+
db1.Exec(untrusted)
31+
db1.Pluck(untrusted, nil)
32+
33+
db2 := gorm2.DB{}
34+
db2.Where(untrusted)
35+
db2.Raw(untrusted)
36+
db2.Not(untrusted)
37+
db2.Order(untrusted)
38+
db2.Or(untrusted)
39+
db2.Select(untrusted)
40+
db2.Table(untrusted)
41+
db2.Group(untrusted)
42+
db2.Having(untrusted)
43+
db2.Joins(untrusted)
44+
db2.Exec(untrusted)
45+
db2.Distinct(untrusted)
46+
db2.Pluck(untrusted, nil)
2447

2548
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import go
22

3-
from SQL::QueryString qs
4-
select qs
3+
from SQL::QueryString qs, Method meth, string a, string b, string c
4+
where meth.hasQualifiedName(a, b, c) and qs = meth.getACall().getArgument(0)
5+
select qs, a, b, c

0 commit comments

Comments
 (0)