Skip to content

Commit 07f6ce7

Browse files
authored
Merge pull request github#6398 from erik-krogh/authHeader
Approved by esbena
2 parents 394d334 + f1f44ce commit 07f6ce7

File tree

5 files changed

+70
-1
lines changed

5 files changed

+70
-1
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* The query "Hard-coded credentials" (`js/hardcoded-credentials`) no longer flags deliberately weak authentication headers.

javascript/ql/src/Security/CWE-798/HardcodedCredentials.ql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ where
2828
not (
2929
sink.getNode().(Sink).(DefaultCredentialsSink).getKind() = "password" and
3030
PasswordHeuristics::isDummyPassword(val)
31+
or
32+
sink.getNode().(Sink).getKind() = "authorization header" and
33+
PasswordHeuristics::isDummyAuthHeader(val)
3134
) and
3235
value = "The hard-coded value \"" + val + "\""
3336
)

javascript/ql/src/semmle/javascript/security/SensitiveActions.qll

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,31 @@ module PasswordHeuristics {
188188
normalized.regexpMatch(".*(pass|test|sample|example|secret|root|admin|user|change|auth).*")
189189
)
190190
}
191+
192+
/**
193+
* Holds if `header` looks like a deliberately weak authentication header.
194+
*/
195+
bindingset[header]
196+
predicate isDummyAuthHeader(string header) {
197+
isDummyPassword(header)
198+
or
199+
exists(string prefix, string suffix | prefix = getAnHTTPAuthenticationScheme() |
200+
header.toLowerCase() = prefix + " " + suffix and
201+
isDummyPassword(suffix)
202+
)
203+
or
204+
header.trim().toLowerCase() = getAnHTTPAuthenticationScheme()
205+
}
206+
207+
/**
208+
* Gets a HTTP authentication scheme normalized to lowercase.
209+
* From this list: https://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml
210+
*/
211+
private string getAnHTTPAuthenticationScheme() {
212+
result =
213+
[
214+
"Basic", "Bearer", "Digest", "HOBA", "Mutual", "Negotiate", "OAuth", "SCRAM-SHA-1",
215+
"SCRAM-SHA-256", "vapid"
216+
].toLowerCase()
217+
}
191218
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,16 @@ nodes
213213
| HardcodedCredentials.js:245:22:245:44 | "myHard ... ateKey" |
214214
| HardcodedCredentials.js:246:42:246:51 | privateKey |
215215
| HardcodedCredentials.js:246:42:246:51 | privateKey |
216+
| HardcodedCredentials.js:260:30:260:40 | `Basic foo` |
217+
| HardcodedCredentials.js:260:30:260:40 | `Basic foo` |
218+
| HardcodedCredentials.js:260:30:260:40 | `Basic foo` |
219+
| HardcodedCredentials.js:268:30:268:73 | `${foo ... Token}` |
220+
| HardcodedCredentials.js:268:30:268:73 | `${foo ... Token}` |
221+
| HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' |
222+
| HardcodedCredentials.js:268:39:268:46 | 'Bearer' |
223+
| HardcodedCredentials.js:268:39:268:46 | 'Bearer' |
224+
| HardcodedCredentials.js:268:50:268:56 | 'OAuth' |
225+
| HardcodedCredentials.js:268:50:268:56 | 'OAuth' |
216226
edges
217227
| HardcodedCredentials.js:5:15:5:22 | 'dbuser' | HardcodedCredentials.js:5:15:5:22 | 'dbuser' |
218228
| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' |
@@ -318,6 +328,13 @@ edges
318328
| HardcodedCredentials.js:245:9:245:44 | privateKey | HardcodedCredentials.js:246:42:246:51 | privateKey |
319329
| HardcodedCredentials.js:245:22:245:44 | "myHard ... ateKey" | HardcodedCredentials.js:245:9:245:44 | privateKey |
320330
| HardcodedCredentials.js:245:22:245:44 | "myHard ... ateKey" | HardcodedCredentials.js:245:9:245:44 | privateKey |
331+
| HardcodedCredentials.js:260:30:260:40 | `Basic foo` | HardcodedCredentials.js:260:30:260:40 | `Basic foo` |
332+
| HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' | HardcodedCredentials.js:268:30:268:73 | `${foo ... Token}` |
333+
| HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' | HardcodedCredentials.js:268:30:268:73 | `${foo ... Token}` |
334+
| HardcodedCredentials.js:268:39:268:46 | 'Bearer' | HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' |
335+
| HardcodedCredentials.js:268:39:268:46 | 'Bearer' | HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' |
336+
| HardcodedCredentials.js:268:50:268:56 | 'OAuth' | HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' |
337+
| HardcodedCredentials.js:268:50:268:56 | 'OAuth' | HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' |
321338
#select
322339
| 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 |
323340
| 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 |

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,4 +249,24 @@
249249
jwt.verify(token, publicKey, function(err, decoded) {
250250
console.log(decoded);
251251
});
252-
})();
252+
})();
253+
254+
(async function () {
255+
const fetch = require("node-fetch");
256+
257+
const rsp = await fetch(ENDPOINT, {
258+
method: 'get',
259+
headers: new fetch.Headers({
260+
"Authorization": `Basic foo`, // OK - dummy password
261+
"Content-Type": 'application/json'
262+
})
263+
});
264+
265+
const rsp2 = await fetch(ENDPOINT, {
266+
method: 'get',
267+
headers: new fetch.Headers({
268+
"Authorization": `${foo ? 'Bearer' : 'OAuth'} ${accessToken}`, // OK - just a protocol selector
269+
"Content-Type": 'application/json'
270+
})
271+
});
272+
});

0 commit comments

Comments
 (0)