Android JavascriptInterface 解决api 17以下漏洞
Posted
技术标签:
【中文标题】Android JavascriptInterface 解决api 17以下漏洞【英文标题】:Android JavascriptInterface solving vulnerability below api 17 【发布时间】:2014-06-24 15:38:58 【问题描述】:我有一个应用程序,它的作用类似于浏览器并在 android webview 中显示结果。其中,一些结果是从我自己的服务器呈现的,并使用 javascriptInterface 对象调用 Java 方法。在 WebviewClient shouldOverrideUrlLoading() 方法中,我只为我的服务器的选择性 url 添加了 javascriptInterface 并删除了剩余 url 的 javascriptInterface 为代码如下:if(url.contains("mypage1.html")||url.contains("mypage2.html"))
webView.addJavascriptInterface(new JavaScriptInterface(),"XYZ");
else
webView.removeJavascriptInterface("XYZ");
包含恶意 javascript 的虚拟 url myevilpage.html 也与 mypage1.html 和 mypage2.html 一起加载。我已验证 myevilpage.html javascript 无法调用 Java 方法。这种方法是否可以确保除了我的特定 url 之外没有其他 url 可以使用 javascriptInterface 桥绑定? 我已经参考了以下链接:http://www.rapid7.com/db/modules/exploit/android/browser/webview_addjavascriptinterfaceAndroid App using Webview/javascript. what can be security concern?Android JavascriptInterface Security?
【问题讨论】:
【参考方案1】:这种方法是否可以确保除了我的特定 url 之外没有其他 url 可以使用 javascriptInterface 桥接绑定?
没有。您使用的是contains()
而不是equals()
,因此攻击者可以轻松地制作一个恰好具有这些子字符串的 URL。此外,可能存在时间问题,因为您在加载该页面之前确定 JS 接口的可用性,这意味着您会立即影响当前加载的页面。
仍有其他可能的攻击(例如,代理服务器、这些页面通过广告网络或其他第三方来源提供的恶意 JS)是 URL 检测无法捕获的,尽管解决这些问题充其量是困难的。
【讨论】:
是的,你是对的,应该有 equals()。对于您提到的时间问题,我已经用我的虚拟邪恶 url 进行了验证,其中的邪恶 javascript 无法调用 Java 方法。同样根据android文档, shouldOverrideUrlLoading 方法中的 url 参数是当前WebView中即将加载的新url。 另外,我只为通过 SSL 链接呈现的 特定 url 添加 javascriptInterface,因此除非在我的特定 url 上发生 其他可能的攻击,如何这些攻击会影响我的应用程序吗? @r.bhardwaj:“同样根据 android 文档,shouldOverrideUrlLoading 方法中的 url 参数是即将在当前 WebView 中加载的新 url”——正确。这意味着在WebView
加载由提供的URL 指示的页面之前,您正在为当前 加载的页面更改WebView
的特征。 WebView
有自己的线程模型,我不知道他们是否暂停了 web worker 等等。
shouldOverrideUrlLoading
将不允许页面在您从该方法返回之前开始加载,但是 add/removeJavaScriptInterface
是异步,因此从技术上讲它们可以到达 在恶意JavaScript有机会运行之后。恕我直言,更好的解决方案是使用两个 WebView(一个受信任的和不受信任的)并在它们之间切换。
@r.bhardwaj - 这当然更好,因为您不会冒任意代码执行的风险。唯一剩下的问题是任何页面(和子框架)都可以调用alert或console.log的“常见”问题。处理 onConsoleMessage/onJsAlert 的代码应该考虑到这一点。此外,类似 loadUrl("javascript:console.log('"+randomNumber+":' + function())");并且仅信任包含正确数字的回调将使任何潜在的攻击者更难欺骗您的应用。以上是关于Android JavascriptInterface 解决api 17以下漏洞的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )