Skip to content

Commit f69037c

Browse files
committed
Added ability to detect direct write to global AWS.config
1 parent 05e4677 commit f69037c

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ module AWS {
4141
getAWSImport().getMember(getAWSServiceName()).getAnInstantiation().getReturn().asSource()
4242
}
4343

44+
/**
45+
* Gets a node representing the AWS global config object.
46+
*/
47+
private API::Node getAWSConfig() { result = getAWSImport().getMember("config") }
48+
49+
/**
50+
* Gets a property write to the AWS config object.
51+
* This captures assignments to AWS.config properties.
52+
*/
53+
private DataFlow::PropWrite configAssigment() {
54+
result = getAWSConfig().asSource().getAPropertyWrite()
55+
}
56+
4457
/**
4558
* Holds if the `i`th argument of `invk` is an object hash for `AWS.Config`.
4659
*/
@@ -82,6 +95,20 @@ module AWS {
8295
or
8396
prop = "secretAccessKey" and kind = "password"
8497
)
98+
or
99+
// `AWS.config.accessKeyId = <user>` or `AWS.config.secretAccessKey = <password>`
100+
exists(string prop, DataFlow::PropWrite propWrite |
101+
propWrite = configAssigment() and
102+
this = propWrite.getRhs() and
103+
prop = propWrite.getPropertyName() and
104+
(
105+
kind = "user name" and
106+
prop = "accessKeyId"
107+
or
108+
kind = "password" and
109+
prop = "secretAccessKey"
110+
)
111+
)
85112
}
86113

87114
override string getCredentialsKind() { result = kind }

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@
161161
| HardcodedCredentials.js:506:41:506:51 | "AccessID1" | HardcodedCredentials.js:506:41:506:51 | "AccessID1" | HardcodedCredentials.js:506:41:506:51 | "AccessID1" | The hard-coded value "AccessID1" is used as $@. | HardcodedCredentials.js:506:41:506:51 | "AccessID1" | user name |
162162
| HardcodedCredentials.js:507:43:507:53 | "AccessID1" | HardcodedCredentials.js:507:43:507:53 | "AccessID1" | HardcodedCredentials.js:507:43:507:53 | "AccessID1" | The hard-coded value "AccessID1" is used as $@. | HardcodedCredentials.js:507:43:507:53 | "AccessID1" | user name |
163163
| HardcodedCredentials.js:508:63:508:73 | "AccessID1" | HardcodedCredentials.js:508:63:508:73 | "AccessID1" | HardcodedCredentials.js:508:63:508:73 | "AccessID1" | The hard-coded value "AccessID1" is used as $@. | HardcodedCredentials.js:508:63:508:73 | "AccessID1" | user name |
164+
| HardcodedCredentials.js:510:30:510:44 | "SOMEACCESSKEY" | HardcodedCredentials.js:510:30:510:44 | "SOMEACCESSKEY" | HardcodedCredentials.js:510:30:510:44 | "SOMEACCESSKEY" | The hard-coded value "SOMEACCESSKEY" is used as $@. | HardcodedCredentials.js:510:30:510:44 | "SOMEACCESSKEY" | user name |
165+
| HardcodedCredentials.js:511:34:511:43 | "hgfedcba" | HardcodedCredentials.js:511:34:511:43 | "hgfedcba" | HardcodedCredentials.js:511:34:511:43 | "hgfedcba" | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:511:34:511:43 | "hgfedcba" | password |
164166
| HardcodedCredentials.js:520:20:520:34 | "SOMEACCESSKEY" | HardcodedCredentials.js:520:20:520:34 | "SOMEACCESSKEY" | HardcodedCredentials.js:520:20:520:34 | "SOMEACCESSKEY" | The hard-coded value "SOMEACCESSKEY" is used as $@. | HardcodedCredentials.js:520:20:520:34 | "SOMEACCESSKEY" | user name |
165167
| HardcodedCredentials.js:521:24:521:33 | "hgfedcba" | HardcodedCredentials.js:521:24:521:33 | "hgfedcba" | HardcodedCredentials.js:521:24:521:33 | "hgfedcba" | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:521:24:521:33 | "hgfedcba" | password |
166168
| __tests__/HardcodedCredentialsDemo.js:5:15:5:22 | 'dbuser' | __tests__/HardcodedCredentialsDemo.js:5:15:5:22 | 'dbuser' | __tests__/HardcodedCredentialsDemo.js:5:15:5:22 | 'dbuser' | The hard-coded value "dbuser" is used as $@. | __tests__/HardcodedCredentialsDemo.js:5:15:5:22 | 'dbuser' | user name |
@@ -557,6 +559,8 @@ nodes
557559
| HardcodedCredentials.js:507:73:507:89 | "NotSoSecretKey1" | semmle.label | "NotSoSecretKey1" |
558560
| HardcodedCredentials.js:508:63:508:73 | "AccessID1" | semmle.label | "AccessID1" |
559561
| HardcodedCredentials.js:508:93:508:109 | "NotSoSecretKey1" | semmle.label | "NotSoSecretKey1" |
562+
| HardcodedCredentials.js:510:30:510:44 | "SOMEACCESSKEY" | semmle.label | "SOMEACCESSKEY" |
563+
| HardcodedCredentials.js:511:34:511:43 | "hgfedcba" | semmle.label | "hgfedcba" |
560564
| HardcodedCredentials.js:520:20:520:34 | "SOMEACCESSKEY" | semmle.label | "SOMEACCESSKEY" |
561565
| HardcodedCredentials.js:521:24:521:33 | "hgfedcba" | semmle.label | "hgfedcba" |
562566
| __tests__/HardcodedCredentialsDemo.js:5:15:5:22 | 'dbuser' | semmle.label | 'dbuser' |

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,8 +507,8 @@
507507
const swf = new AWS.SWF({accessKeyId: "AccessID1", secretAccessKey: "NotSoSecretKey1"}); // $ Alert
508508
const stepfunctions = new AWS.StepFunctions({accessKeyId: "AccessID1", secretAccessKey: "NotSoSecretKey1"}); // $ Alert
509509

510-
AWS.config.accessKeyId = "SOMEACCESSKEY"; // $ MISSING: Alert
511-
AWS.config.secretAccessKey = "hgfedcba"; // $ MISSING: Alert
510+
AWS.config.accessKeyId = "SOMEACCESSKEY"; // $ Alert
511+
AWS.config.secretAccessKey = "hgfedcba"; // $ Alert
512512

513513
const creds = new AWS.Credentials(
514514
"SOMEACCESSKEY", // $ MISSING: Alert

0 commit comments

Comments
 (0)