Skip to content

Commit f99db23

Browse files
committed
JS: Add test and fix for contextType
1 parent 7ee3846 commit f99db23

File tree

4 files changed

+25
-4
lines changed

4 files changed

+25
-4
lines changed

javascript/ql/src/semmle/javascript/frameworks/React.qll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -650,9 +650,12 @@ private DataFlow::Node getAContextInput(DataFlow::CallNode createContext) {
650650
* ```
651651
*/
652652
pragma[nomagic]
653-
private DataFlow::CallNode getAContextOutput(DataFlow::CallNode createContext) {
654-
result = react().getAMemberCall("useContext") and
655-
getAContextRef(createContext).flowsTo(result.getArgument(0))
653+
private DataFlow::SourceNode getAContextOutput(DataFlow::CallNode createContext) {
654+
exists(DataFlow::CallNode call |
655+
call = react().getAMemberCall("useContext") and
656+
getAContextRef(createContext).flowsTo(call.getArgument(0)) and
657+
result = call
658+
)
656659
or
657660
exists(DataFlow::ClassNode cls |
658661
getAContextRef(createContext).flowsTo(cls.getAPropertyWrite("contextType").getRhs()) and

javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ nodes
147147
| react-use-context.js:10:22:10:32 | window.name |
148148
| react-use-context.js:10:22:10:32 | window.name |
149149
| react-use-context.js:10:22:10:32 | window.name |
150+
| react-use-context.js:16:26:16:36 | window.name |
151+
| react-use-context.js:16:26:16:36 | window.name |
152+
| react-use-context.js:16:26:16:36 | window.name |
150153
| react-use-state.js:4:9:4:49 | state |
151154
| react-use-state.js:4:10:4:14 | state |
152155
| react-use-state.js:4:38:4:48 | window.name |
@@ -711,6 +714,7 @@ edges
711714
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted |
712715
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted |
713716
| react-use-context.js:10:22:10:32 | window.name | react-use-context.js:10:22:10:32 | window.name |
717+
| react-use-context.js:16:26:16:36 | window.name | react-use-context.js:16:26:16:36 | window.name |
714718
| react-use-state.js:4:9:4:49 | state | react-use-state.js:5:51:5:55 | state |
715719
| react-use-state.js:4:9:4:49 | state | react-use-state.js:5:51:5:55 | state |
716720
| react-use-state.js:4:10:4:14 | state | react-use-state.js:4:9:4:49 | state |
@@ -1129,6 +1133,7 @@ edges
11291133
| react-native.js:8:18:8:24 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:8:18:8:24 | tainted | Cross-site scripting vulnerability due to $@. | react-native.js:7:17:7:33 | req.param("code") | user-provided value |
11301134
| react-native.js:9:27:9:33 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:9:27:9:33 | tainted | Cross-site scripting vulnerability due to $@. | react-native.js:7:17:7:33 | req.param("code") | user-provided value |
11311135
| react-use-context.js:10:22:10:32 | window.name | react-use-context.js:10:22:10:32 | window.name | react-use-context.js:10:22:10:32 | window.name | Cross-site scripting vulnerability due to $@. | react-use-context.js:10:22:10:32 | window.name | user-provided value |
1136+
| react-use-context.js:16:26:16:36 | window.name | react-use-context.js:16:26:16:36 | window.name | react-use-context.js:16:26:16:36 | window.name | Cross-site scripting vulnerability due to $@. | react-use-context.js:16:26:16:36 | window.name | user-provided value |
11321137
| react-use-state.js:5:51:5:55 | state | react-use-state.js:4:38:4:48 | window.name | react-use-state.js:5:51:5:55 | state | Cross-site scripting vulnerability due to $@. | react-use-state.js:4:38:4:48 | window.name | user-provided value |
11331138
| react-use-state.js:11:51:11:55 | state | react-use-state.js:10:14:10:24 | window.name | react-use-state.js:11:51:11:55 | state | Cross-site scripting vulnerability due to $@. | react-use-state.js:10:14:10:24 | window.name | user-provided value |
11341139
| react-use-state.js:17:51:17:55 | state | react-use-state.js:16:20:16:30 | window.name | react-use-state.js:17:51:17:55 | state | Cross-site scripting vulnerability due to $@. | react-use-state.js:16:20:16:30 | window.name | user-provided value |

javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ nodes
147147
| react-use-context.js:10:22:10:32 | window.name |
148148
| react-use-context.js:10:22:10:32 | window.name |
149149
| react-use-context.js:10:22:10:32 | window.name |
150+
| react-use-context.js:16:26:16:36 | window.name |
151+
| react-use-context.js:16:26:16:36 | window.name |
152+
| react-use-context.js:16:26:16:36 | window.name |
150153
| react-use-state.js:4:9:4:49 | state |
151154
| react-use-state.js:4:10:4:14 | state |
152155
| react-use-state.js:4:38:4:48 | window.name |
@@ -715,6 +718,7 @@ edges
715718
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted |
716719
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted |
717720
| react-use-context.js:10:22:10:32 | window.name | react-use-context.js:10:22:10:32 | window.name |
721+
| react-use-context.js:16:26:16:36 | window.name | react-use-context.js:16:26:16:36 | window.name |
718722
| react-use-state.js:4:9:4:49 | state | react-use-state.js:5:51:5:55 | state |
719723
| react-use-state.js:4:9:4:49 | state | react-use-state.js:5:51:5:55 | state |
720724
| react-use-state.js:4:10:4:14 | state | react-use-state.js:4:9:4:49 | state |

javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/react-use-context.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useContext } from 'react';
1+
import { useContext, Component } from 'react';
22
import { MyContext } from './react-create-context';
33

44
function useMyContext() {
@@ -9,3 +9,12 @@ export function useDoc1() {
99
let { root } = useMyContext();
1010
root.appendChild(window.name); // NOT OK
1111
}
12+
13+
class C extends Component {
14+
foo() {
15+
let { root } = this.context;
16+
root.appendChild(window.name); // NOT OK
17+
}
18+
}
19+
20+
C.contextType = MyContext;

0 commit comments

Comments
 (0)