Skip to content

Commit b780f82

Browse files
author
Esben Sparre Andreasen
committed
JS: sharpen js/clear-text-logging (ODASA-7485)
1 parent 33111b6 commit b780f82

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

change-notes/1.19/analysis-javascript.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
| **Query** | **Expected impact** | **Change** |
3737
|--------------------------------|----------------------------|----------------------------------------------|
3838
| Ambiguous HTML id attribute | Lower severity | The severity of this rule has been revised to "warning". |
39+
| Clear-text logging of sensitive information | Fewer results | This rule now tracks flow more precisely. |
3940
| Client side cross-site scripting | More results | This rule now also flags HTML injection in the body of an email. |
4041
| Client-side URL redirect | Fewer false-positive results | This rule now recognizes safe redirects in more cases. |
4142
| Conflicting HTML element attributes | Lower severity | The severity of this rule has been revised to "warning". |

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ module CleartextLogging {
5252
}
5353

5454
override predicate isAdditionalFlowStep(DataFlow::Node src, DataFlow::Node trg) {
55-
any (TaintTracking::StringConcatenationTaintStep s).step(src, trg)
55+
StringConcatenation::taintStep(src, trg)
5656
or
5757
exists (string name | name = "toString" or name = "valueOf" |
5858
src.(DataFlow::SourceNode).getAMethodCall(name) = trg

javascript/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ nodes
2222
| passwords.js:28:16:28:17 | {} |
2323
| passwords.js:29:17:29:20 | obj3 |
2424
| passwords.js:30:14:30:21 | password |
25-
| passwords.js:77:9:77:55 | temp |
26-
| passwords.js:77:16:77:55 | { encry ... sword } |
2725
| passwords.js:77:37:77:53 | req.body.password |
28-
| passwords.js:78:17:78:20 | temp |
2926
| passwords.js:78:17:78:38 | temp.en ... assword |
3027
| passwords.js:80:9:80:25 | secret |
3128
| passwords.js:80:18:80:25 | password |
@@ -49,6 +46,13 @@ nodes
4946
| passwords.js:123:17:123:48 | name + ... lueOf() |
5047
| passwords.js:123:31:123:38 | password |
5148
| passwords.js:123:31:123:48 | password.valueOf() |
49+
| passwords.js:127:9:132:5 | config |
50+
| passwords.js:127:18:132:5 | {\\n ... )\\n } |
51+
| passwords.js:130:12:130:19 | password |
52+
| passwords.js:131:12:131:24 | getPassword() |
53+
| passwords.js:135:17:135:22 | config |
54+
| passwords.js:136:17:136:24 | config.x |
55+
| passwords.js:137:17:137:24 | config.y |
5256
| passwords_in_browser1.js:2:13:2:20 | password |
5357
| passwords_in_browser2.js:2:13:2:20 | password |
5458
| passwords_in_server_1.js:6:13:6:20 | password |
@@ -71,11 +75,7 @@ edges
7175
| passwords.js:28:9:28:17 | obj3 | passwords.js:29:17:29:20 | obj3 |
7276
| passwords.js:28:16:28:17 | {} | passwords.js:28:9:28:17 | obj3 |
7377
| passwords.js:30:14:30:21 | password | passwords.js:28:16:28:17 | {} |
74-
| passwords.js:77:9:77:55 | temp | passwords.js:78:17:78:20 | temp |
75-
| passwords.js:77:16:77:55 | { encry ... sword } | passwords.js:77:9:77:55 | temp |
76-
| passwords.js:77:37:77:53 | req.body.password | passwords.js:77:16:77:55 | { encry ... sword } |
7778
| passwords.js:77:37:77:53 | req.body.password | passwords.js:78:17:78:38 | temp.en ... assword |
78-
| passwords.js:78:17:78:20 | temp | passwords.js:78:17:78:38 | temp.en ... assword |
7979
| passwords.js:80:9:80:25 | secret | passwords.js:81:24:81:29 | secret |
8080
| passwords.js:80:18:80:25 | password | passwords.js:80:9:80:25 | secret |
8181
| passwords.js:81:24:81:29 | secret | passwords.js:81:17:81:31 | `pw: ${secret}` |
@@ -89,6 +89,12 @@ edges
8989
| passwords.js:122:31:122:49 | password.toString() | passwords.js:122:17:122:49 | name + ... tring() |
9090
| passwords.js:123:31:123:38 | password | passwords.js:123:31:123:48 | password.valueOf() |
9191
| passwords.js:123:31:123:48 | password.valueOf() | passwords.js:123:17:123:48 | name + ... lueOf() |
92+
| passwords.js:127:9:132:5 | config | passwords.js:135:17:135:22 | config |
93+
| passwords.js:127:18:132:5 | {\\n ... )\\n } | passwords.js:127:9:132:5 | config |
94+
| passwords.js:130:12:130:19 | password | passwords.js:127:18:132:5 | {\\n ... )\\n } |
95+
| passwords.js:130:12:130:19 | password | passwords.js:136:17:136:24 | config.x |
96+
| passwords.js:131:12:131:24 | getPassword() | passwords.js:127:18:132:5 | {\\n ... )\\n } |
97+
| passwords.js:131:12:131:24 | getPassword() | passwords.js:137:17:137:24 | config.y |
9298
| passwords_in_server_5.js:4:7:4:24 | req.query.password | passwords_in_server_5.js:7:12:7:12 | x |
9399
| passwords_in_server_5.js:7:12:7:12 | x | passwords_in_server_5.js:8:17:8:17 | x |
94100
#select
@@ -113,6 +119,11 @@ edges
113119
| passwords.js:119:21:119:46 | "Passwo ... assword | passwords.js:119:39:119:46 | password | passwords.js:119:21:119:46 | "Passwo ... assword | Sensitive data returned by $@ is logged here. | passwords.js:119:39:119:46 | password | an access to password |
114120
| passwords.js:122:17:122:49 | name + ... tring() | passwords.js:122:31:122:38 | password | passwords.js:122:17:122:49 | name + ... tring() | Sensitive data returned by $@ is logged here. | passwords.js:122:31:122:38 | password | an access to password |
115121
| passwords.js:123:17:123:48 | name + ... lueOf() | passwords.js:123:31:123:38 | password | passwords.js:123:17:123:48 | name + ... lueOf() | Sensitive data returned by $@ is logged here. | passwords.js:123:31:123:38 | password | an access to password |
122+
| passwords.js:135:17:135:22 | config | passwords.js:127:18:132:5 | {\\n ... )\\n } | passwords.js:135:17:135:22 | config | Sensitive data returned by $@ is logged here. | passwords.js:127:18:132:5 | {\\n ... )\\n } | an access to password |
123+
| passwords.js:135:17:135:22 | config | passwords.js:130:12:130:19 | password | passwords.js:135:17:135:22 | config | Sensitive data returned by $@ is logged here. | passwords.js:130:12:130:19 | password | an access to password |
124+
| passwords.js:135:17:135:22 | config | passwords.js:131:12:131:24 | getPassword() | passwords.js:135:17:135:22 | config | Sensitive data returned by $@ is logged here. | passwords.js:131:12:131:24 | getPassword() | a call to getPassword |
125+
| passwords.js:136:17:136:24 | config.x | passwords.js:130:12:130:19 | password | passwords.js:136:17:136:24 | config.x | Sensitive data returned by $@ is logged here. | passwords.js:130:12:130:19 | password | an access to password |
126+
| passwords.js:137:17:137:24 | config.y | passwords.js:131:12:131:24 | getPassword() | passwords.js:137:17:137:24 | config.y | Sensitive data returned by $@ is logged here. | passwords.js:131:12:131:24 | getPassword() | a call to getPassword |
116127
| passwords_in_server_1.js:6:13:6:20 | password | passwords_in_server_1.js:6:13:6:20 | password | passwords_in_server_1.js:6:13:6:20 | password | Sensitive data returned by $@ is logged here. | passwords_in_server_1.js:6:13:6:20 | password | an access to password |
117128
| passwords_in_server_2.js:3:13:3:20 | password | passwords_in_server_2.js:3:13:3:20 | password | passwords_in_server_2.js:3:13:3:20 | password | Sensitive data returned by $@ is logged here. | passwords_in_server_2.js:3:13:3:20 | password | an access to password |
118129
| passwords_in_server_3.js:2:13:2:20 | password | passwords_in_server_3.js:2:13:2:20 | password | passwords_in_server_3.js:2:13:2:20 | password | Sensitive data returned by $@ is logged here. | passwords_in_server_3.js:2:13:2:20 | password | an access to password |

javascript/ql/test/query-tests/Security/CWE-312/passwords.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,18 @@
122122
console.log(name + ", " + password.toString()); // NOT OK
123123
console.log(name + ", " + password.valueOf()); // NOT OK
124124
});
125+
126+
(function() {
127+
var config = {
128+
password: x,
129+
hostname: "tarski",
130+
x: password,
131+
y: getPassword()
132+
};
133+
var cfg = x? config: config;
134+
console.log(config.hostname); // OK
135+
console.log(config); // NOT OK
136+
console.log(config.x); // NOT OK
137+
console.log(config.y); // NOT OK
138+
console.log(config[x]); // OK (probably)
139+
});

0 commit comments

Comments
 (0)