Skip to content

Commit 39a7c7b

Browse files
authored
Merge pull request github#11282 from egregius313/egregiu313/webview-addjavascriptinterface
Java: Query for detecting addJavascriptInterface method calls
2 parents 016c7a8 + 72484b9 commit 39a7c7b

File tree

8 files changed

+108
-0
lines changed

8 files changed

+108
-0
lines changed

java/ql/lib/semmle/code/java/frameworks/android/WebView.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ class WebViewGetUrlMethod extends Method {
3939
}
4040
}
4141

42+
/** The method `addJavascriptInterface` of the class `android.webkit.WebView` */
43+
class WebViewAddJavascriptInterfaceMethod extends Method {
44+
WebViewAddJavascriptInterfaceMethod() {
45+
this.getDeclaringType() instanceof TypeWebView and
46+
this.hasName("addJavascriptInterface")
47+
}
48+
}
49+
4250
/**
4351
* A method allowing any-local-file and cross-origin access in the class `android.webkit.WebSettings`.
4452
*/
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<!DOCTYPE qhelp PUBLIC
2+
"-//Semmle//qhelp//EN"
3+
"qhelp.dtd">
4+
<qhelp>
5+
<overview>
6+
<p>
7+
Calling the <code>addJavascriptInterface</code> method of
8+
the <code>android.webkit.WebView</code> class allows the web pages of a
9+
WebView to access a Java object's methods via JavaScript.
10+
</p>
11+
12+
<p>
13+
Objects exposed to JavaScript are available in all frames of the
14+
WebView.
15+
</p>
16+
</overview>
17+
18+
<recommendation>
19+
<p>
20+
If you need to expose Java objects to JavaScript, guarantee that no
21+
untrusted third-party content is loaded into the WebView.
22+
</p>
23+
</recommendation>
24+
25+
<example>
26+
<p>
27+
In the following (bad) example, a Java object is exposed to JavaScript.
28+
</p>
29+
30+
<sample src="AndroidWebViewAddJavascriptInterfaceExample.java"/>
31+
32+
</example>
33+
34+
<references>
35+
<li>
36+
Android Documentation: <a href="https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String)">addJavascriptInterface</a>
37+
</li>
38+
</references>
39+
40+
</qhelp>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* @name Access Java object methods through JavaScript exposure
3+
* @id java/android-webview-addjavascriptinterface
4+
* @description Exposing a Java object in a WebView with a JavaScript interface can lead to malicious JavaScript controlling the application.
5+
* @kind problem
6+
* @problem.severity warning
7+
* @security-severity 6.1
8+
* @precision medium
9+
* @tags security
10+
* external/cwe/cwe-079
11+
*/
12+
13+
import java
14+
import semmle.code.java.frameworks.android.WebView
15+
16+
from MethodAccess ma
17+
where ma.getMethod() instanceof WebViewAddJavascriptInterfaceMethod
18+
select ma, "JavaScript interface to Java object added in Android WebView."
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import android.webkit.JavascriptInterface;
2+
import android.database.sqlite.SQLiteOpenHelper;
3+
4+
class ExposedObject extends SQLiteOpenHelper {
5+
@JavascriptInterface
6+
public String studentEmail(String studentName) {
7+
// SQL injection
8+
String query = "SELECT email FROM students WHERE studentname = '" + studentName + "'";
9+
10+
Cursor cursor = db.rawQuery(query, null);
11+
cursor.moveToFirst();
12+
String email = cursor.getString(0);
13+
14+
return email;
15+
}
16+
}
17+
18+
webview.getSettings().setJavaScriptEnabled(true);
19+
webview.addJavaScriptInterface(new ExposedObject(), "exposedObject");
20+
webview.loadData("", "text/html", null);
21+
22+
String name = "Robert'; DROP TABLE students; --";
23+
webview.loadUrl("javascript:alert(exposedObject.studentEmail(\""+ name +"\"))");
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: newQuery
3+
---
4+
* Added a new query `java/android-webview-addjavascriptinterface` to detect the use of `addJavascriptInterface`, which can lead to cross-site scripting.
5+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| WebViewAddJavascriptInterface.java:10:9:10:61 | addJavascriptInterface(...) | JavaScript interface to Java object added in Android WebView. |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.example.test;
2+
3+
import android.webkit.WebView;
4+
5+
class WebViewAddJavascriptInterface {
6+
class Greeter {
7+
}
8+
9+
public void addGreeter(WebView view) {
10+
view.addJavascriptInterface(new Greeter(), "greeter");
11+
}
12+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Security/CWE/CWE-079/AndroidWebViewAddJavascriptInterface.ql

0 commit comments

Comments
 (0)