Skip to content

Commit a194097

Browse files
committed
support credentials in a Buffer
1 parent ba44ebe commit a194097

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

javascript/ql/src/semmle/javascript/security/dataflow/HardcodedCredentials.qll

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,17 @@ module HardcodedCredentials {
2121

2222
override predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
2323

24-
override predicate isAdditionalFlowStep(DataFlow::Node src, DataFlow::Node trg) {
24+
override predicate isAdditionalFlowStep(DataFlow::Node src, DataFlow::Node trg) {
2525
exists(Base64::Encode encode | src = encode.getInput() and trg = encode.getOutput())
2626
or
2727
trg.(StringOps::ConcatenationRoot).getALeaf() = src and
2828
not exists(src.(StringOps::ConcatenationLeaf).getStringValue()) // to avoid e.g. the ":" in `user + ":" + pass` being flagged as a constant credential.
29+
or
30+
exists(DataFlow::MethodCallNode bufferFrom |
31+
bufferFrom = DataFlow::globalVarRef("Buffer").getAMethodCall("from") and
32+
trg = bufferFrom and
33+
src = bufferFrom.getArgument(0)
34+
)
2935
}
3036
}
3137
}

javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.expected

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,15 @@ nodes
199199
| HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` |
200200
| HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` |
201201
| HardcodedCredentials.js:221:46:221:49 | AUTH |
202+
| HardcodedCredentials.js:231:11:231:29 | username |
203+
| HardcodedCredentials.js:231:22:231:29 | 'sdsdag' |
204+
| HardcodedCredentials.js:231:22:231:29 | 'sdsdag' |
205+
| HardcodedCredentials.js:237:24:237:91 | 'Basic ... ase64') |
206+
| HardcodedCredentials.js:237:24:237:91 | 'Basic ... ase64') |
207+
| HardcodedCredentials.js:237:35:237:72 | Buffer. ... ssword) |
208+
| HardcodedCredentials.js:237:35:237:91 | Buffer. ... ase64') |
209+
| HardcodedCredentials.js:237:47:237:54 | username |
210+
| HardcodedCredentials.js:237:47:237:71 | usernam ... assword |
202211
edges
203212
| HardcodedCredentials.js:5:15:5:22 | 'dbuser' | HardcodedCredentials.js:5:15:5:22 | 'dbuser' |
204213
| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' |
@@ -292,6 +301,14 @@ edges
292301
| HardcodedCredentials.js:216:43:216:46 | PASS | HardcodedCredentials.js:216:32:216:48 | `${USER}:${PASS}` |
293302
| HardcodedCredentials.js:221:46:221:49 | AUTH | HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` |
294303
| HardcodedCredentials.js:221:46:221:49 | AUTH | HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` |
304+
| HardcodedCredentials.js:231:11:231:29 | username | HardcodedCredentials.js:237:47:237:54 | username |
305+
| HardcodedCredentials.js:231:22:231:29 | 'sdsdag' | HardcodedCredentials.js:231:11:231:29 | username |
306+
| HardcodedCredentials.js:231:22:231:29 | 'sdsdag' | HardcodedCredentials.js:231:11:231:29 | username |
307+
| HardcodedCredentials.js:237:35:237:72 | Buffer. ... ssword) | HardcodedCredentials.js:237:35:237:91 | Buffer. ... ase64') |
308+
| HardcodedCredentials.js:237:35:237:91 | Buffer. ... ase64') | HardcodedCredentials.js:237:24:237:91 | 'Basic ... ase64') |
309+
| HardcodedCredentials.js:237:35:237:91 | Buffer. ... ase64') | HardcodedCredentials.js:237:24:237:91 | 'Basic ... ase64') |
310+
| HardcodedCredentials.js:237:47:237:54 | username | HardcodedCredentials.js:237:47:237:71 | usernam ... assword |
311+
| HardcodedCredentials.js:237:47:237:71 | usernam ... assword | HardcodedCredentials.js:237:35:237:72 | Buffer. ... ssword) |
295312
#select
296313
| HardcodedCredentials.js:5:15:5:22 | 'dbuser' | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | The hard-coded value "dbuser" is used as $@. | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | user name |
297314
| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | password |
@@ -356,3 +373,4 @@ edges
356373
| HardcodedCredentials.js:172:18:172:25 | 'sdsdag' | HardcodedCredentials.js:172:18:172:25 | 'sdsdag' | HardcodedCredentials.js:204:35:204:49 | `Basic ${AUTH}` | The hard-coded value "sdsdag" is used as $@. | HardcodedCredentials.js:204:35:204:49 | `Basic ${AUTH}` | authorization headers |
357374
| HardcodedCredentials.js:214:18:214:25 | 'sdsdag' | HardcodedCredentials.js:214:18:214:25 | 'sdsdag' | HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` | The hard-coded value "sdsdag" is used as $@. | HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` | authorization headers |
358375
| HardcodedCredentials.js:215:18:215:25 | 'sdsdag' | HardcodedCredentials.js:215:18:215:25 | 'sdsdag' | HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` | The hard-coded value "sdsdag" is used as $@. | HardcodedCredentials.js:221:37:221:51 | `Basic ${AUTH}` | authorization headers |
376+
| HardcodedCredentials.js:231:22:231:29 | 'sdsdag' | HardcodedCredentials.js:231:22:231:29 | 'sdsdag' | HardcodedCredentials.js:237:24:237:91 | 'Basic ... ase64') | The hard-coded value "sdsdag" is used as $@. | HardcodedCredentials.js:237:24:237:91 | 'Basic ... ase64') | authorization headers |

javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,18 @@
223223
method: 'get',
224224
headers: headers
225225
});
226-
});
226+
});
227+
228+
(async function () {
229+
import fetch from 'node-fetch';
230+
231+
const username = 'sdsdag';
232+
const password = config.get('some_actually_secrect_password');
233+
const response = await fetch(ENDPOINT, {
234+
method: 'get',
235+
headers: {
236+
'Content-Type': 'application/json',
237+
Authorization: 'Basic ' + Buffer.from(username + ':' + password).toString('base64'),
238+
},
239+
});
240+
})

0 commit comments

Comments
 (0)