Skip to content

Commit 269bb3f

Browse files
committed
Added modeling of firebase-admin and some other functions.
1 parent 0ed3758 commit 269bb3f

File tree

7 files changed

+38
-12
lines changed

7 files changed

+38
-12
lines changed

javascript/ql/lib/ext/firebase.model.yml

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@ extensions:
77
- ["FirebaseDBRef", "FirebaseDBRef", "Member[once,on].Argument[1].Parameter[0]"]
88
- ["FirebaseDBRef", "FirebaseDBRef", "Member[once,on].ReturnValue.Member[then].Argument[0].Parameter[0]"]
99
- ["FirebaseDBRef", "FirebaseDBRef", "Member[ref,root,parent,before,after]"]
10-
- ["FirebaseDBRef", "FirebaseDBRef", "Member[child].ReturnValue"]
11-
10+
- ["FirebaseDBRef", "FirebaseDBRef", "Member[child,once,on,orderByChild,equalTo,endAt,startAt,limitToLast,orderByKey].ReturnValue"]
1211
- ["FirebaseDBRef", "firebase-functions", "Member[database].Member[ref,refFromURL].ReturnValue"]
13-
- ["FirebaseDBRef", "FirebaseDBRef", "Member[onCreate,onUpdate].Argument[0].Parameter[0]"]
12+
- ["FirebaseDBRef", "FirebaseDBRef", "Member[onCreate,onUpdate,onWrite,onDelete,transaction].Argument[0].Parameter[0]"]
13+
- ["FirebaseDBRef", "firebase-admin", "Member[database].ReturnValue.Member[ref,refFromURL].ReturnValue"]
14+
- ["FirebaseApp", "firebase-admin", "Member[initializeApp,app].ReturnValue"]
15+
- ["FirebaseDBRef", "FirebaseApp", "Member[database].ReturnValue.Member[ref,refFromURL].ReturnValue"]
16+
1417
- addsTo:
1518
pack: codeql/javascript-all
1619
extensible: sourceModel
1720
data:
1821
- ["FirebaseDBRef", "Member[val,exportVal].ReturnValue", 'remote']
1922
- ["FirebaseDBRef", "Member[forEach].Argument[0].Parameter[0].Member[val,exportVal].ReturnValue", 'remote']
20-

javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected

+2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
| firebase-client.js:33:52:33:65 | snapshot.val() | firebase-client.js:33:52:33:65 | snapshot.val() | firebase-client.js:33:52:33:65 | snapshot.val() | Cross-site scripting vulnerability due to $@. | firebase-client.js:33:52:33:65 | snapshot.val() | user-provided value |
7474
| firebase-client.js:38:56:38:67 | userData.bio | firebase-client.js:37:22:37:35 | snapshot.val() | firebase-client.js:38:56:38:67 | userData.bio | Cross-site scripting vulnerability due to $@. | firebase-client.js:37:22:37:35 | snapshot.val() | user-provided value |
7575
| firebase-client.js:44:55:44:74 | parentSnapshot.val() | firebase-client.js:44:55:44:74 | parentSnapshot.val() | firebase-client.js:44:55:44:74 | parentSnapshot.val() | Cross-site scripting vulnerability due to $@. | firebase-client.js:44:55:44:74 | parentSnapshot.val() | user-provided value |
76+
| firebase-client.js:52:57:52:70 | snapshot.val() | firebase-client.js:52:57:52:70 | snapshot.val() | firebase-client.js:52:57:52:70 | snapshot.val() | Cross-site scripting vulnerability due to $@. | firebase-client.js:52:57:52:70 | snapshot.val() | user-provided value |
7677
| jquery.js:7:5:7:34 | "<div i ... + "\\">" | jquery.js:2:17:2:40 | documen ... .search | jquery.js:7:5:7:34 | "<div i ... + "\\">" | Cross-site scripting vulnerability due to $@. | jquery.js:2:17:2:40 | documen ... .search | user-provided value |
7778
| jquery.js:8:18:8:34 | "XSS: " + tainted | jquery.js:2:17:2:40 | documen ... .search | jquery.js:8:18:8:34 | "XSS: " + tainted | Cross-site scripting vulnerability due to $@. | jquery.js:2:17:2:40 | documen ... .search | user-provided value |
7879
| jquery.js:10:5:10:40 | "<b>" + ... "</b>" | jquery.js:10:13:10:20 | location | jquery.js:10:5:10:40 | "<b>" + ... "</b>" | Cross-site scripting vulnerability due to $@. | jquery.js:10:13:10:20 | location | user-provided value |
@@ -994,6 +995,7 @@ nodes
994995
| firebase-client.js:38:56:38:63 | userData | semmle.label | userData |
995996
| firebase-client.js:38:56:38:67 | userData.bio | semmle.label | userData.bio |
996997
| firebase-client.js:44:55:44:74 | parentSnapshot.val() | semmle.label | parentSnapshot.val() |
998+
| firebase-client.js:52:57:52:70 | snapshot.val() | semmle.label | snapshot.val() |
997999
| jquery.js:2:7:2:40 | tainted | semmle.label | tainted |
9981000
| jquery.js:2:17:2:40 | documen ... .search | semmle.label | documen ... .search |
9991001
| jquery.js:4:5:4:11 | tainted | semmle.label | tainted |

javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected

+1
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ nodes
174174
| firebase-client.js:38:56:38:63 | userData | semmle.label | userData |
175175
| firebase-client.js:38:56:38:67 | userData.bio | semmle.label | userData.bio |
176176
| firebase-client.js:44:55:44:74 | parentSnapshot.val() | semmle.label | parentSnapshot.val() |
177+
| firebase-client.js:52:57:52:70 | snapshot.val() | semmle.label | snapshot.val() |
177178
| hana.js:11:37:11:40 | rows | semmle.label | rows |
178179
| hana.js:11:37:11:51 | rows[0].comment | semmle.label | rows[0].comment |
179180
| hana.js:16:37:16:40 | rows | semmle.label | rows |

javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/firebase-client.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ function fun2(category){
4949
dbPath = 'users/' + firebase.auth().currentUser.uid;
5050
dbRef = firebase.database().ref(dbPath);
5151
dbRef.set({'test': randomString}).then(function() {return dbRef.once('value');}).then(function(snapshot) {
52-
document.getElementById("userData").innerHTML = snapshot.val(); // $ MISSING: Alert
52+
document.getElementById("userData").innerHTML = snapshot.val(); // $ Alert
5353
return dbRef.remove();
5454
});
5555
}

javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected

+14
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@
3333
| firebase-server.js:14:10:14:23 | x.before.val() | firebase-server.js:14:10:14:23 | x.before.val() | firebase-server.js:14:10:14:23 | x.before.val() | This code execution depends on a $@. | firebase-server.js:14:10:14:23 | x.before.val() | user-provided value |
3434
| firebase-server.js:15:10:15:22 | x.after.val() | firebase-server.js:15:10:15:22 | x.after.val() | firebase-server.js:15:10:15:22 | x.after.val() | This code execution depends on a $@. | firebase-server.js:15:10:15:22 | x.after.val() | user-provided value |
3535
| firebase-server.js:17:14:17:38 | grandPa ... t.val() | firebase-server.js:17:14:17:38 | grandPa ... t.val() | firebase-server.js:17:14:17:38 | grandPa ... t.val() | This code execution depends on a $@. | firebase-server.js:17:14:17:38 | grandPa ... t.val() | user-provided value |
36+
| firebase-server.js:21:10:21:27 | change.after.val() | firebase-server.js:21:10:21:27 | change.after.val() | firebase-server.js:21:10:21:27 | change.after.val() | This code execution depends on a $@. | firebase-server.js:21:10:21:27 | change.after.val() | user-provided value |
37+
| firebase-server.js:22:10:22:28 | change.before.val() | firebase-server.js:22:10:22:28 | change.before.val() | firebase-server.js:22:10:22:28 | change.before.val() | This code execution depends on a $@. | firebase-server.js:22:10:22:28 | change.before.val() | user-provided value |
38+
| firebase-server.js:26:10:26:21 | change.val() | firebase-server.js:26:10:26:21 | change.val() | firebase-server.js:26:10:26:21 | change.val() | This code execution depends on a $@. | firebase-server.js:26:10:26:21 | change.val() | user-provided value |
39+
| firebase-server.js:27:10:27:21 | change.val() | firebase-server.js:27:10:27:21 | change.val() | firebase-server.js:27:10:27:21 | change.val() | This code execution depends on a $@. | firebase-server.js:27:10:27:21 | change.val() | user-provided value |
40+
| firebase-server.js:33:25:33:44 | statusSnapshot.val() | firebase-server.js:33:25:33:44 | statusSnapshot.val() | firebase-server.js:33:25:33:44 | statusSnapshot.val() | This code execution depends on a $@. | firebase-server.js:33:25:33:44 | statusSnapshot.val() | user-provided value |
41+
| firebase-server.js:44:12:44:30 | childSnapshot.val() | firebase-server.js:44:12:44:30 | childSnapshot.val() | firebase-server.js:44:12:44:30 | childSnapshot.val() | This code execution depends on a $@. | firebase-server.js:44:12:44:30 | childSnapshot.val() | user-provided value |
42+
| firebase-server.js:55:10:55:19 | snap.val() | firebase-server.js:55:10:55:19 | snap.val() | firebase-server.js:55:10:55:19 | snap.val() | This code execution depends on a $@. | firebase-server.js:55:10:55:19 | snap.val() | user-provided value |
3643
| module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | This code execution depends on a $@. | module.js:9:16:9:29 | req.query.code | user-provided value |
3744
| module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | This code execution depends on a $@. | module.js:11:17:11:30 | req.query.code | user-provided value |
3845
| react-native.js:8:32:8:38 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:8:32:8:38 | tainted | This code execution depends on a $@. | react-native.js:7:17:7:33 | req.param("code") | user-provided value |
@@ -156,6 +163,13 @@ nodes
156163
| firebase-server.js:14:10:14:23 | x.before.val() | semmle.label | x.before.val() |
157164
| firebase-server.js:15:10:15:22 | x.after.val() | semmle.label | x.after.val() |
158165
| firebase-server.js:17:14:17:38 | grandPa ... t.val() | semmle.label | grandPa ... t.val() |
166+
| firebase-server.js:21:10:21:27 | change.after.val() | semmle.label | change.after.val() |
167+
| firebase-server.js:22:10:22:28 | change.before.val() | semmle.label | change.before.val() |
168+
| firebase-server.js:26:10:26:21 | change.val() | semmle.label | change.val() |
169+
| firebase-server.js:27:10:27:21 | change.val() | semmle.label | change.val() |
170+
| firebase-server.js:33:25:33:44 | statusSnapshot.val() | semmle.label | statusSnapshot.val() |
171+
| firebase-server.js:44:12:44:30 | childSnapshot.val() | semmle.label | childSnapshot.val() |
172+
| firebase-server.js:55:10:55:19 | snap.val() | semmle.label | snap.val() |
159173
| module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code |
160174
| module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code |
161175
| react-native.js:7:7:7:33 | tainted | semmle.label | tainted |

javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected

+7
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ nodes
8888
| firebase-server.js:14:10:14:23 | x.before.val() | semmle.label | x.before.val() |
8989
| firebase-server.js:15:10:15:22 | x.after.val() | semmle.label | x.after.val() |
9090
| firebase-server.js:17:14:17:38 | grandPa ... t.val() | semmle.label | grandPa ... t.val() |
91+
| firebase-server.js:21:10:21:27 | change.after.val() | semmle.label | change.after.val() |
92+
| firebase-server.js:22:10:22:28 | change.before.val() | semmle.label | change.before.val() |
93+
| firebase-server.js:26:10:26:21 | change.val() | semmle.label | change.val() |
94+
| firebase-server.js:27:10:27:21 | change.val() | semmle.label | change.val() |
95+
| firebase-server.js:33:25:33:44 | statusSnapshot.val() | semmle.label | statusSnapshot.val() |
96+
| firebase-server.js:44:12:44:30 | childSnapshot.val() | semmle.label | childSnapshot.val() |
97+
| firebase-server.js:55:10:55:19 | snap.val() | semmle.label | snap.val() |
9198
| module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code |
9299
| module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code |
93100
| react-native.js:7:7:7:33 | tainted | semmle.label | tainted |

javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/firebase-server.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ functions.database.ref('x').onUpdate(x => {
1818
});
1919
});
2020
functions.database.ref('/messages/{messageId}').onWrite((change, context) => {
21-
eval(change.after.val()); // $ MISSING: Alert[js/code-injection]
22-
eval(change.before.val()); // $ MISSING: Alert[js/code-injection]
21+
eval(change.after.val()); // $ Alert[js/code-injection]
22+
eval(change.before.val()); // $ Alert[js/code-injection]
2323
});
2424

2525
functions.database.ref('/messages/{messageId}').onDelete((change, context) => {
26-
eval(change.val()); // $ MISSING: Alert[js/code-injection]
27-
eval(change.val()); // $ MISSING: Alert[js/code-injection]
26+
eval(change.val()); // $ Alert[js/code-injection]
27+
eval(change.val()); // $ Alert[js/code-injection]
2828
});
2929

3030
functions.database.ref('/status/{uid}').onUpdate(async (change, context) => {
3131
const eventStatus = change.after.val();
3232
const statusSnapshot = await change.after.ref.once('value');
33-
const status = eval(statusSnapshot.val()); // $ MISSING: Alert[js/code-injection]
33+
const status = eval(statusSnapshot.val()); // $ Alert[js/code-injection]
3434
return null;
3535
});
3636

@@ -41,7 +41,7 @@ function fun(category){
4141
let messages = [];
4242
snapshot.forEach((childSnapshot) => {
4343
messages.push({key: childSnapshot.key, message: childSnapshot.val().message});
44-
eval(childSnapshot.val()); // $ MISSING: Alert[js/code-injection]
44+
eval(childSnapshot.val()); // $ Alert[js/code-injection]
4545
});
4646
}
4747

@@ -52,5 +52,5 @@ async function fun3(uid, postId, size) {
5252
app = admin.initializeApp(config, uid);
5353
const imageUrlRef = app.database().ref(`/posts`);
5454
const snap = await imageUrlRef.once('value');
55-
eval(snap.val()); // $ MISSING: Alert[js/code-injection]
55+
eval(snap.val()); // $ Alert[js/code-injection]
5656
}

0 commit comments

Comments
 (0)