Skip to content

Commit 8f6cb1c

Browse files
author
Max Schaefer
committed
JavaScript: Add models for many more base64 packages.
No tests; there are too many of these.
1 parent f76efcb commit 8f6cb1c

File tree

2 files changed

+46
-21
lines changed

2 files changed

+46
-21
lines changed

change-notes/1.21/analysis-javascript.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Support for the following frameworks and libraries has been improved:
66
- [socket.io](http://socket.io)
77

8-
* The security queries now track data flow through Base64 decoders such as the Node.js `Buffer` class, the DOM function `atob`, as well as the npm packages [`base-64`](https://www.npmjs.com/package/base-64), [`js-base64`](https://www.npmjs.com/package/js-base64), [`Base64.js`](https://www.npmjs.com/package/Base64) and [`base64-js`](https://www.npmjs.com/package/base64-js).
8+
* The security queries now track data flow through Base64 decoders such as the Node.js `Buffer` class, the DOM function `atob`, and a number of npm packages intcluding [`abab`](https://www.npmjs.com/package/abab), [`atob`](https://www.npmjs.com/package/atob), [`btoa`](https://www.npmjs.com/package/btoa), [`base-64`](https://www.npmjs.com/package/base-64), [`js-base64`](https://www.npmjs.com/package/js-base64), [`Base64.js`](https://www.npmjs.com/package/Base64) and [`base64-js`](https://www.npmjs.com/package/base64-js).
99

1010

1111
## New queries

javascript/ql/src/semmle/javascript/Base64.qll

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -130,18 +130,31 @@ private class Buffer_from extends Base64::Decode::Range, DataFlow::CallNode {
130130
*/
131131
private class NpmBase64Encode extends Base64::Encode::Range, DataFlow::CallNode {
132132
NpmBase64Encode() {
133-
exists(string mod, string meth |
134-
mod = "base-64" and meth = "encode"
135-
or
136-
mod = "Base64" and meth = "btoa"
137-
or
138-
mod = "base64-js" and meth = "toByteArray"
133+
exists(DataFlow::SourceNode enc |
134+
enc = DataFlow::moduleImport("b64u") or
135+
enc = DataFlow::moduleImport("b64url") or
136+
enc = DataFlow::moduleImport("btoa") or
137+
enc = DataFlow::moduleMember("Base64", "btoa") or
138+
enc = DataFlow::moduleMember("abab", "btoa") or
139+
enc = DataFlow::moduleMember("b2a", "btoa") or
140+
enc = DataFlow::moduleMember("b64-lite", "btoa") or
141+
enc = DataFlow::moduleMember("b64-lite", "toBase64") or
142+
enc = DataFlow::moduleMember("b64u", "encode") or
143+
enc = DataFlow::moduleMember("b64u", "toBase64") or
144+
enc = DataFlow::moduleMember("b64u-lite", "toBase64Url") or
145+
enc = DataFlow::moduleMember("b64u-lite", "toBinaryString") or
146+
enc = DataFlow::moduleMember("b64url", "encode") or
147+
enc = DataFlow::moduleMember("b64url", "toBase64") or
148+
enc = DataFlow::moduleMember("base-64", "encode") or
149+
enc = DataFlow::moduleMember("base64-js", "toByteArray") or
150+
enc = DataFlow::moduleMember("base64-url", "encode") or
151+
enc = DataFlow::moduleMember("base64url", "encode") or
152+
enc = DataFlow::moduleMember("base64url", "toBase64") or
153+
enc = DataFlow::moduleMember("js-base64", "Base64").getAPropertyRead("encode") or
154+
enc = DataFlow::moduleMember("js-base64", "Base64").getAPropertyRead("encodeURI") or
155+
enc = DataFlow::moduleMember("urlsafe-base64", "encode")
139156
|
140-
this = DataFlow::moduleMember(mod, meth).getACall()
141-
)
142-
or
143-
exists(string meth | meth = "encode" or meth = "encodeURI" |
144-
this = DataFlow::moduleMember("js-base64", "Base64").getAMemberCall(meth)
157+
this = enc.getACall()
145158
)
146159
}
147160

@@ -156,17 +169,29 @@ private class NpmBase64Encode extends Base64::Encode::Range, DataFlow::CallNode
156169
*/
157170
private class NpmBase64Decode extends Base64::Decode::Range, DataFlow::CallNode {
158171
NpmBase64Decode() {
159-
exists(string mod, string meth |
160-
mod = "base-64" and meth = "decode"
161-
or
162-
mod = "Base64" and meth = "atob"
163-
or
164-
mod = "base64-js" and meth = "fromByteArray"
172+
exists(DataFlow::SourceNode dec |
173+
dec = DataFlow::moduleImport("atob") or
174+
dec = DataFlow::moduleMember("Base64", "atob") or
175+
dec = DataFlow::moduleMember("abab", "atob") or
176+
dec = DataFlow::moduleMember("b2a", "atob") or
177+
dec = DataFlow::moduleMember("b64-lite", "atob") or
178+
dec = DataFlow::moduleMember("b64-lite", "fromBase64") or
179+
dec = DataFlow::moduleMember("b64u", "decode") or
180+
dec = DataFlow::moduleMember("b64u", "fromBase64") or
181+
dec = DataFlow::moduleMember("b64u-lite", "fromBase64Url") or
182+
dec = DataFlow::moduleMember("b64u-lite", "fromBinaryString") or
183+
dec = DataFlow::moduleMember("b64url", "decode") or
184+
dec = DataFlow::moduleMember("b64url", "fromBase64") or
185+
dec = DataFlow::moduleMember("base-64", "decode") or
186+
dec = DataFlow::moduleMember("base64-js", "fromByteArray") or
187+
dec = DataFlow::moduleMember("base64-url", "decode") or
188+
dec = DataFlow::moduleMember("base64url", "decode") or
189+
dec = DataFlow::moduleMember("base64url", "fromBase64") or
190+
dec = DataFlow::moduleMember("js-base64", "Base64").getAPropertyRead("decode") or
191+
dec = DataFlow::moduleMember("urlsafe-base64", "decode")
165192
|
166-
this = DataFlow::moduleMember(mod, meth).getACall()
193+
this = dec.getACall()
167194
)
168-
or
169-
this = DataFlow::moduleMember("js-base64", "Base64").getAMemberCall("decode")
170195
}
171196

172197
override DataFlow::Node getInput() { result = getArgument(0) }

0 commit comments

Comments
 (0)