Skip to content

Commit 387a673

Browse files
authored
Merge pull request #11567 from asgerf/js/data-extensions2
JS: Move MaD models to data extensions
2 parents cddb5c5 + fcdb2fa commit 387a673

File tree

31 files changed

+1819
-1682
lines changed

31 files changed

+1819
-1682
lines changed

config/identical-files.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,11 @@
541541
"ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll",
542542
"python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll"
543543
],
544+
"ApiGraphModelsExtensions": [
545+
"javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll",
546+
"ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll",
547+
"python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll"
548+
],
544549
"TaintedFormatStringQuery Ruby/JS": [
545550
"javascript/ql/lib/semmle/javascript/security/dataflow/TaintedFormatStringQuery.qll",
546551
"ruby/ql/lib/codeql/ruby/security/TaintedFormatStringQuery.qll"

javascript/ql/lib/javascript.qll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ import semmle.javascript.frameworks.JWT
9999
import semmle.javascript.frameworks.Handlebars
100100
import semmle.javascript.frameworks.History
101101
import semmle.javascript.frameworks.Immutable
102-
import semmle.javascript.frameworks.ImportGeneratedModels
103102
import semmle.javascript.frameworks.Knex
104103
import semmle.javascript.frameworks.LazyCache
105104
import semmle.javascript.frameworks.LdapJS

javascript/ql/lib/qlpack.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ library: true
77
upgrades: upgrades
88
dependencies:
99
codeql/regex: ${workspace}
10+
dataExtensions:
11+
- semmle/javascript/frameworks/**/model.yml

javascript/ql/lib/semmle/javascript/frameworks/ImportGeneratedModels.qll

Lines changed: 0 additions & 12 deletions
This file was deleted.

javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ private module API = Specific::API;
7272
private module DataFlow = Specific::DataFlow;
7373

7474
private import Specific::AccessPathSyntax
75+
private import ApiGraphModelsExtensions as Extensions
7576

7677
/** Module containing hooks for providing input data to be interpreted as a model. */
7778
module ModelInput {
@@ -236,6 +237,8 @@ predicate sourceModel(string type, string path, string kind) {
236237
row.splitAt(";", 1) = path and
237238
row.splitAt(";", 2) = kind
238239
)
240+
or
241+
Extensions::sourceModel(type, path, kind)
239242
}
240243

241244
/** Holds if a sink model exists for the given parameters. */
@@ -246,6 +249,8 @@ private predicate sinkModel(string type, string path, string kind) {
246249
row.splitAt(";", 1) = path and
247250
row.splitAt(";", 2) = kind
248251
)
252+
or
253+
Extensions::sinkModel(type, path, kind)
249254
}
250255

251256
/** Holds if a summary model `row` exists for the given parameters. */
@@ -258,6 +263,8 @@ private predicate summaryModel(string type, string path, string input, string ou
258263
row.splitAt(";", 3) = output and
259264
row.splitAt(";", 4) = kind
260265
)
266+
or
267+
Extensions::summaryModel(type, path, input, output, kind)
261268
}
262269

263270
/** Holds if a type model exists for the given parameters. */
@@ -268,6 +275,8 @@ private predicate typeModel(string type1, string type2, string path) {
268275
row.splitAt(";", 1) = type2 and
269276
row.splitAt(";", 2) = path
270277
)
278+
or
279+
Extensions::typeModel(type1, type2, path)
271280
}
272281

273282
/** Holds if a type variable model exists for the given parameters. */
@@ -277,6 +286,8 @@ private predicate typeVariableModel(string name, string path) {
277286
row.splitAt(";", 0) = name and
278287
row.splitAt(";", 1) = path
279288
)
289+
or
290+
Extensions::typeVariableModel(name, path)
280291
}
281292

282293
/**
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Defines extensible predicates for contributing library models from data extensions.
3+
*/
4+
5+
/**
6+
* Holds if the value at `(type, path)` should be seen as a flow
7+
* source of the given `kind`.
8+
*
9+
* The kind `remote` represents a general remote flow source.
10+
*/
11+
extensible predicate sourceModel(string type, string path, string kind);
12+
13+
/**
14+
* Holds if the value at `(type, path)` should be seen as a sink
15+
* of the given `kind`.
16+
*/
17+
extensible predicate sinkModel(string type, string path, string kind);
18+
19+
/**
20+
* Holds if calls to `(type, path)`, the value referred to by `input`
21+
* can flow to the value referred to by `output`.
22+
*
23+
* `kind` should be either `value` or `taint`, for value-preserving or taint-preserving steps,
24+
* respectively.
25+
*/
26+
extensible predicate summaryModel(string type, string path, string input, string output, string kind);
27+
28+
/**
29+
* Holds if `(type2, path)` should be seen as an instance of `type1`.
30+
*/
31+
extensible predicate typeModel(string type1, string type2, string path);
32+
33+
/**
34+
* Holds if `path` can be substituted for a token `TypeVar[name]`.
35+
*/
36+
extensible predicate typeVariableModel(string name, string path);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
extensions:
2+
# Contribute empty data sets to avoid errors about an undefined extensionals
3+
- addsTo:
4+
pack: codeql/javascript-all
5+
extensible: sourceModel
6+
data: []
7+
8+
- addsTo:
9+
pack: codeql/javascript-all
10+
extensible: sinkModel
11+
data: []
12+
13+
- addsTo:
14+
pack: codeql/javascript-all
15+
extensible: summaryModel
16+
data: []
17+
18+
- addsTo:
19+
pack: codeql/javascript-all
20+
extensible: typeModel
21+
data: []
22+
23+
- addsTo:
24+
pack: codeql/javascript-all
25+
extensible: typeVariableModel
26+
data: []

javascript/ql/lib/semmle/javascript/frameworks/minimongo/Model.qll

Lines changed: 0 additions & 86 deletions
This file was deleted.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/javascript-all
4+
extensible: typeModel
5+
data:
6+
- [minimongo.HybridCollection, minimongo.HybridCollectionStatic, Instance]
7+
- [minimongo.HybridCollection, "minimongo/lib/HybridDb.HybridCollection", ""]
8+
- [minimongo.HybridCollection, "minimongo/lib/HybridDb.default", "Member[collections].AnyMember"]
9+
- [minimongo.HybridCollectionStatic, "minimongo/lib/HybridDb.HybridCollectionStatic", ""]
10+
- [minimongo.HybridCollectionStatic, "minimongo/lib/HybridDb", "Member[HybridCollection]"]
11+
- [minimongo.HybridCollectionStatic, minimongo, "Member[HybridCollection]"]
12+
- [minimongo.MinimongoBaseCollection, minimongo.HybridCollection, ""]
13+
- [minimongo.MinimongoBaseCollection, minimongo.MinimongoCollection, ""]
14+
- [minimongo.MinimongoBaseCollection, minimongo.MinimongoDb, AnyMember]
15+
- [minimongo.MinimongoBaseCollection, minimongo.MinimongoLocalCollection, ""]
16+
- [minimongo.MinimongoBaseCollection, "minimongo/RemoteDb.Collection", ""]
17+
- [minimongo.MinimongoBaseCollection, "minimongo/lib/types.MinimongoBaseCollection", ""]
18+
- [minimongo.MinimongoCollection, minimongo.HybridCollection, "Member[remoteCol]"]
19+
- [minimongo.MinimongoCollection, minimongo.MinimongoDb, "Member[collections].AnyMember"]
20+
- [minimongo.MinimongoCollection, "minimongo/lib/LocalStorageDb.default", "Member[collections].AnyMember"]
21+
- [minimongo.MinimongoCollection, "minimongo/lib/WebSQLDb.default", "Member[collections].AnyMember"]
22+
- [minimongo.MinimongoCollection, "minimongo/lib/types.MinimongoCollection", ""]
23+
- [minimongo.MinimongoDb, minimongo.MinimongoDb, "Member[remoteDb]"]
24+
- [minimongo.MinimongoDb, minimongo.MinimongoLocalDb, ""]
25+
- [minimongo.MinimongoDb, "minimongo/lib/HybridDb.default", ""]
26+
- [minimongo.MinimongoDb, "minimongo/lib/HybridDb.default", "Member[remoteDb]"]
27+
- [minimongo.MinimongoDb, "minimongo/lib/LocalStorageDb.default", ""]
28+
- [minimongo.MinimongoDb, "minimongo/lib/MemoryDb.default", ""]
29+
- [minimongo.MinimongoDb, "minimongo/lib/RemoteDb.default", ""]
30+
- [minimongo.MinimongoDb, "minimongo/lib/ReplicatingDb.default", "Member[masterDb,replicaDb]"]
31+
- [minimongo.MinimongoDb, "minimongo/lib/WebSQLDb.default", ""]
32+
- [minimongo.MinimongoDb, "minimongo/lib/types.MinimongoDb", ""]
33+
- [minimongo.MinimongoLocalCollection, minimongo.HybridCollection, "Member[localCol]"]
34+
- [minimongo.MinimongoLocalCollection, minimongo.MinimongoCollection, ""]
35+
- [minimongo.MinimongoLocalCollection, minimongo.MinimongoLocalDb, "Member[addCollection].Argument[2].Argument[0]"]
36+
- [minimongo.MinimongoLocalCollection, minimongo.MinimongoLocalDb, "Member[collections].AnyMember"]
37+
- [minimongo.MinimongoLocalCollection, "minimongo/IndexedDb.IndexedDbCollection", ""]
38+
- [minimongo.MinimongoLocalCollection, "minimongo/MemoryDb.Collection", ""]
39+
- [minimongo.MinimongoLocalCollection, "minimongo/ReplicatingDb.Collection", ""]
40+
- [minimongo.MinimongoLocalCollection, "minimongo/ReplicatingDb.Collection", "Member[masterCol,replicaCol]"]
41+
- [minimongo.MinimongoLocalCollection, "minimongo/lib/types.MinimongoLocalCollection", ""]
42+
- [minimongo.MinimongoLocalDb, minimongo.MinimongoDb, "Member[localDb]"]
43+
- [minimongo.MinimongoLocalDb, "minimongo/lib/HybridDb.default", "Member[localDb]"]
44+
- [minimongo.MinimongoLocalDb, "minimongo/lib/IndexedDb.default", ""]
45+
- [minimongo.MinimongoLocalDb, "minimongo/lib/ReplicatingDb.default", ""]
46+
- [minimongo.MinimongoLocalDb, "minimongo/lib/types.MinimongoLocalDb", ""]
47+
- ["minimongo/IndexedDb.IndexedDbCollection", "minimongo/IndexedDb.IndexedDbCollectionStatic", Instance]
48+
- ["minimongo/IndexedDb.IndexedDbCollection", "minimongo/lib/IndexedDb.default", "Member[collections].AnyMember"]
49+
- ["minimongo/MemoryDb.Collection", "minimongo/MemoryDb.CollectionStatic", Instance]
50+
- ["minimongo/MemoryDb.Collection", "minimongo/lib/MemoryDb.default", "Member[collections].AnyMember"]
51+
- ["minimongo/RemoteDb.Collection", "minimongo/RemoteDb.CollectionStatic", Instance]
52+
- ["minimongo/RemoteDb.Collection", "minimongo/lib/RemoteDb.default", "Member[collections].AnyMember"]
53+
- ["minimongo/ReplicatingDb.Collection", "minimongo/ReplicatingDb.CollectionStatic", Instance]
54+
- ["minimongo/ReplicatingDb.Collection", "minimongo/lib/ReplicatingDb.default", "Member[collections].AnyMember"]
55+
- ["minimongo/lib/HybridDb.default", "minimongo/lib/HybridDb.defaultStatic", Instance]
56+
- ["minimongo/lib/HybridDb.defaultStatic", "minimongo/lib/HybridDb", "Member[default]"]
57+
- ["minimongo/lib/HybridDb.defaultStatic", minimongo, "Member[HybridDb]"]
58+
- ["minimongo/lib/IndexedDb.default", "minimongo/lib/IndexedDb.defaultStatic", Instance]
59+
- ["minimongo/lib/IndexedDb.default", minimongo, "Member[utils].Member[autoselectLocalDb].ReturnValue"]
60+
- ["minimongo/lib/IndexedDb.defaultStatic", "minimongo/lib/IndexedDb", "Member[default]"]
61+
- ["minimongo/lib/IndexedDb.defaultStatic", minimongo, "Member[IndexedDb]"]
62+
- ["minimongo/lib/LocalStorageDb.default", "minimongo/lib/LocalStorageDb.defaultStatic", Instance]
63+
- ["minimongo/lib/LocalStorageDb.default", minimongo, "Member[utils].Member[autoselectLocalDb].ReturnValue"]
64+
- ["minimongo/lib/LocalStorageDb.defaultStatic", "minimongo/lib/LocalStorageDb", "Member[default]"]
65+
- ["minimongo/lib/LocalStorageDb.defaultStatic", minimongo, "Member[LocalStorageDb]"]
66+
- ["minimongo/lib/MemoryDb.default", "minimongo/lib/MemoryDb.defaultStatic", Instance]
67+
- ["minimongo/lib/MemoryDb.default", minimongo, "Member[utils].Member[autoselectLocalDb].ReturnValue"]
68+
- ["minimongo/lib/MemoryDb.defaultStatic", "minimongo/lib/MemoryDb", "Member[default]"]
69+
- ["minimongo/lib/MemoryDb.defaultStatic", minimongo, "Member[MemoryDb]"]
70+
- ["minimongo/lib/RemoteDb.default", "minimongo/lib/RemoteDb.defaultStatic", Instance]
71+
- ["minimongo/lib/RemoteDb.defaultStatic", "minimongo/lib/RemoteDb", "Member[default]"]
72+
- ["minimongo/lib/RemoteDb.defaultStatic", minimongo, "Member[RemoteDb]"]
73+
- ["minimongo/lib/ReplicatingDb.default", "minimongo/lib/ReplicatingDb.defaultStatic", Instance]
74+
- ["minimongo/lib/ReplicatingDb.defaultStatic", "minimongo/lib/ReplicatingDb", "Member[default]"]
75+
- ["minimongo/lib/ReplicatingDb.defaultStatic", minimongo, "Member[ReplicatingDb]"]
76+
- ["minimongo/lib/WebSQLDb.default", "minimongo/lib/WebSQLDb.defaultStatic", Instance]
77+
- ["minimongo/lib/WebSQLDb.default", minimongo, "Member[utils].Member[autoselectLocalDb].ReturnValue"]
78+
- ["minimongo/lib/WebSQLDb.defaultStatic", "minimongo/lib/WebSQLDb", "Member[default]"]
79+
- ["minimongo/lib/WebSQLDb.defaultStatic", minimongo, "Member[WebSQLDb]"]
80+
- [mongodb.Collection, minimongo.MinimongoBaseCollection, ""]

0 commit comments

Comments
 (0)