【发布时间】:2011-09-18 22:36:46
【问题描述】:
"使用 addJavascriptInterface() 允许 JavaScript 控制您的应用程序。这可能是一个非常有用的功能或危险的安全问题。当 WebView 中的 HTML 不可信时(例如,部分或全部 HTML 由某些人提供人或进程),然后攻击者可以注入 HTML 来执行您的代码以及可能是攻击者选择的任何代码。 除非此 WebView 中的所有 HTML 均由您编写,否则请勿使用 addJavascriptInterface()。 绑定的 Java 对象在另一个线程中运行,而不是在构造它的线程中。
假设我有一个只显示自定义对话框的界面,或者开始下载到 sd 卡。将这用于任何网址是否不安全?攻击页面如何使用该接口来运行攻击者选择的任何代码?
更新: 根据documentation:
此方法可用于让 JavaScript 控制主机 应用。这是一个强大的功能,但也提供了安全性 针对 API 级别 JELLY_BEAN 或以下的应用程序的风险, 因为 JavaScript 可以使用反射来访问注入对象的 公共领域。在包含不受信任的 WebView 中使用此方法 内容可能允许攻击者在 意想不到的方式,以宿主的权限执行Java代码 应用。在 WebView 中使用此方法时要格外小心 其中可能包含不受信任的内容。
有没有例子说明这种情况是如何发生的?这只是说如果 DOWNLOADINTERFACE.dangerousfunction 是该类的公共方法,则可以调用它?
更新:
我根据下面的漏洞利用示例进行了测试,站点可以通过Android 4.4、4.1和3.2中的接口访问系统。
但是,我没有在 Android 2.2 或 2.3 上看到这个错误,黑客只会导致强制关闭。除了不使用 JSInterface 之外,防止这种黑客攻击的最佳方法是什么?我可以包含这样的虚假函数,以防止未经授权的函数调用吗?
public Object getClass() {
//throw error, return self, or something?
}
或者使用 ajax 重写所有内容并拦截调用?这会导致更好/更差的性能吗?
更新:
我成功移除了 JS 接口,并通过为所有 window.(interface) 函数定义 window.open(specialurl) 命令替换了功能,并覆盖了 shouldOverrideUrlLoading 中的那些。奇怪的是,window.open() 在某些情况下必须使用,或者 webview 会中断显示(比如 javascript 正在停止?),而在其他情况下,应该使用 location.replace,否则它只会显示“interface://specialdata” " 找不到消息。
(我设置了 settings.setJavaScriptCanOpenWindowsAutomatically(true) 所以 window.open 一直在 JS 中工作。)
有人知道用这种行为重写应用程序的最佳方法吗?
【问题讨论】:
-
您是从互联网加载外部文件还是仅在手机上加载本地文件?您是否设置了互联网权限?因为我认为如果黑客无法远程访问手机,他就无法更改 javascript 代码
-
这是来自网络,不是本地的,所以我需要保护这个接口。
-
@NoBugs:您好,不知道您是否在不删除
JavascriptInterface的情况下成功找到了解决此安全漏洞的方法?另外,我注意到你覆盖 getClass() 的方式是不可行的,因为 getClass() 是一种最终方法。 -
@Chan 是的,我发现调用 ajax 并拦截它是 JSinterface 的一个很好的替代方案。
标签: javascript android interface webview android-webview