Skip to content

Commit 3d0748c

Browse files
authored
Merge pull request #48 from xiemaisi/js/webview-sinks
Approved by asger-semmle
2 parents 945413a + 14f14c1 commit 3d0748c

File tree

15 files changed

+104
-0
lines changed

15 files changed

+104
-0
lines changed

change-notes/1.18/analysis-javascript.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
- [object.assign](https://github.com/ljharb/object.assign)
4545
- [object.defaults](https://github.com/jonschlinkert/object.defaults)
4646
- [parse-json](https://github.com/sindresorhus/parse-json)
47+
- [React Native](https://facebook.github.io/react-native/)
4748
- [q](http://documentup.com/kriskowal/q/)
4849
- [ramda](https://ramdajs.com)
4950
- [safe-json-parse](https://github.com/Raynos/safe-json-parse)

javascript/ql/src/javascript.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import semmle.javascript.frameworks.HttpFrameworks
6262
import semmle.javascript.frameworks.NoSQL
6363
import semmle.javascript.frameworks.PkgCloud
6464
import semmle.javascript.frameworks.React
65+
import semmle.javascript.frameworks.ReactNative
6566
import semmle.javascript.frameworks.Request
6667
import semmle.javascript.frameworks.SQL
6768
import semmle.javascript.frameworks.UriLibraries
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Provides classes for working with [React Native](https://facebook.github.io/react-native) code.
3+
*/
4+
5+
import javascript
6+
7+
module ReactNative {
8+
/** A `WebView` JSX element. */
9+
class WebViewElement extends DataFlow::ValueNode, DataFlow::DefaultSourceNode {
10+
override JSXElement astNode;
11+
12+
WebViewElement() {
13+
DataFlow::moduleMember("react-native", "WebView").flowsToExpr(astNode.getNameExpr())
14+
}
15+
}
16+
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,21 @@ module CodeInjection {
115115
)
116116
}
117117
}
118+
119+
/**
120+
* An expression which is injected as JavaScript into a React Native `WebView`.
121+
*/
122+
class WebViewInjectedJavaScriptSink extends Sink {
123+
WebViewInjectedJavaScriptSink() {
124+
exists (ReactNative::WebViewElement webView |
125+
// `injectedJavaScript` property of React Native `WebView`
126+
this = webView.getAPropertyWrite("injectedJavaScript").getRhs()
127+
or
128+
// argument to `injectJavascript` method of React Native `WebView`
129+
this = webView.getAMethodCall("injectJavaScript").getArgument(0)
130+
)
131+
}
132+
}
118133
}
119134

120135
/** DEPRECATED: Use `CodeInjection::Source` instead. */

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ module DomBasedXss {
117117
pw.interpretsValueAsHTML() and
118118
this = DataFlow::valueNode(pw.getRhs())
119119
)
120+
or
121+
// `html` or `source.html` properties of React Native `WebView`
122+
exists (ReactNative::WebViewElement webView, DataFlow::SourceNode source |
123+
source = webView or
124+
source = webView.getAPropertyWrite("source").getRhs().getALocalSource() |
125+
this = source.getAPropertyWrite("html").getRhs()
126+
)
120127
}
121128
}
122129

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,20 @@ module ServerSideUrlRedirect {
140140
outcome = true
141141
}
142142
}
143+
144+
/**
145+
* A URL attribute for a React Native `WebView`.
146+
*/
147+
class WebViewUrlSink extends Sink {
148+
WebViewUrlSink() {
149+
// `url` or `source.uri` properties of React Native `WebView`
150+
exists (ReactNative::WebViewElement webView, DataFlow::SourceNode source, string prop |
151+
source = webView and prop = "url" or
152+
source = webView.getAPropertyWrite("source").getRhs().getALocalSource() and prop = "uri" |
153+
this = source.getAPropertyWrite(prop).getRhs()
154+
)
155+
}
156+
}
143157
}
144158

145159
/** DEPRECATED: Use `ServerSideUrlRedirect::Source` instead. */
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| webview.js:6:12:6:56 | <WebVie ... om'}}/> |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import javascript
2+
3+
from ReactNative::WebViewElement wv
4+
select wv
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Component } from 'react';
2+
import { WebView } from 'react-native';
3+
4+
class LgtmView extends Component {
5+
render() {
6+
return <WebView source={{uri: 'https://lgtm.com'}}/>;
7+
}
8+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
| jquery.js:4:5:4:11 | tainted | Cross-site scripting vulnerability due to $@. | jquery.js:2:17:2:33 | document.location | user-provided value |
22
| jquery.js:7:5:7:34 | "<div i ... + "\\">" | Cross-site scripting vulnerability due to $@. | jquery.js:2:17:2:33 | document.location | user-provided value |
33
| jquery.js:8:18:8:34 | "XSS: " + tainted | Cross-site scripting vulnerability due to $@. | jquery.js:2:17:2:33 | document.location | user-provided value |
4+
| 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 |
5+
| 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 |
46
| string-manipulations.js:3:16:3:32 | document.location | Cross-site scripting vulnerability due to $@. | string-manipulations.js:3:16:3:32 | document.location | user-provided value |
57
| string-manipulations.js:4:16:4:37 | documen ... on.href | Cross-site scripting vulnerability due to $@. | string-manipulations.js:4:16:4:32 | document.location | user-provided value |
68
| string-manipulations.js:5:16:5:47 | documen ... lueOf() | Cross-site scripting vulnerability due to $@. | string-manipulations.js:5:16:5:32 | document.location | user-provided value |

0 commit comments

Comments
 (0)