APP应用克隆的研究

关于APP应用克隆的一些研究

Posted by T-bag on March 19, 2018

前言

App引用克隆漏洞的一些研究,主要代码参考的是烟波渺渺正愁予的文章,在此基础上进行了一些修改,添加了利用伪协议进行克隆的方式。

附上我修改后的的demo地址:AppCloneDemo

不想看原理的话,可以直接看攻击流程

攻击流程

app1

漏洞环境

  1. APP的Activity组件设置可导出 android:exported="true",并且使用webview加载页面

  2. webview设置了file域可访问。

    webView.getSettings().setAllowFileAccessFromFileURLs(true);

    webView.getSettings().setAllowUniversalAccessFromFileURLs(true);

  3. 开启JS访问

    webSettings.setJavaScriptEnabled(true);

环境搭建

  1. demo(主要用来作为Android客户端的数据接口)

    app1

    gettocken.jsp:根据用户名返回一个token给安卓客户端

    getinfo.jsp:根据token判断是哪个用户,然后返回其个人信息。

    Applink.jsp: 这个没地方放就放这里了,诱导用户点击的就是该页面,改页面会让用户下载恶意HTML,然后通过伪协议打开对应的Activity

    app1

  2. 攻击者服务器(HackServer)

    receive.php: 主要用来接收APP传过来的token,并保存到newfile.txt中。

    sendToken.htm: 漏洞poc 用来读取shared_prefs下保存的loginState.xml中的token值并发送token到hacker的服务器中

    app1

  3. appclone(漏洞APP)

    漏洞APP。大家可以下载demo下来运行一下,这里稍加修改了一段,可以通过伪协议打开APP进行克隆,主要是模拟正常用户登录操作,并将登录之后的token存放在/data/data/com.example.tbag.appclone/shared_prefs

    app1

    在AndroidMainTest.xml中自定义协议,供浏览器通过协议URI访问APP ,这样就可以通过APP的自定义协议URI打开APP的组件了

    app1

    协议格式类似:<a href="[scheme]://[host]/[path]?[query]">启动应用程序</a>

    下面这段协议就是打开SuccessActivity并向里面传递url等参数

    app1

    在SuccessActivity中我们接受来自协议URI的参数值,这里获取了token和url的值,这里获取的参数的token改为String类型的了,因为不知道怎么把budle类型的数据放入到放入到伪协议中

    app1

    需要开启file域访问和js,设置为true

    app1

    webview将会接受传递过来的的url参数,并加载,因为组件设置导出,所以任何第三方应用都可以打开该组件并往里面传参

    app1

  4. attackapp

    这个是与我们上面讲的伪协议类似,原理都是通过下载恶意HTML,然后将其file域参数通过intent传参到SuccessActivity中,让其webview加载执行恶意HTML,具体看demo,就不赘述了。

    app1

  5. toclone(克隆器)

    通过将获得的token参数传入到SuccesActivity中,实现克隆,直接手工修改也是可以的

    app1

模拟实际攻击流程

首先在两台手机(emulator)分别打开appclone,分别作为用户的手机和攻击者的手机。分别登录user1和user2

app1

用户手机登录user3

app1

登录user3成功

app1

攻击者手机登录user4

app1

登录user4成功

构造链接,诱始用户点击

app1

用户点击链接

首先会提示要下载

app1

用户点击下载后,文件会下载到/sdcard/Download

app1

下载完成后,用户点另一个链接进去拿红包

app1

会打打开对应的SuccesActivity 并将下载好的恶意HTML的file域地址传递给它,file:///sdcard/Download/send.htm

app1

SuccessActivity中的webview接到URL参数之后,将会加载该file域下的send.htm因为webview设置了file域可访问和js可执行,所以恶意代码通过js可以获取到用户file域下的token,并将其发送到攻击者的接受服务器上

app1

攻击者通过该token使用克隆器进行克隆,或者手动替换,就可以完成克隆了,如图,攻击者通过user3的token完成了登录

app1

结语

应用克隆,算是老洞新谈,主要的形成原因还是因为webview的域控不严谨的问题,还有就是程序员的安全意识有待加强,通过关闭不必要的file域访问和禁止一些不必要的组件导出是可以避免这些问题的。

修复方案

  1. 关闭不必要的组件导出

  2. 对于不需要使用 file 协议的应用,禁用 file 协议,明确禁止

    setAllowFileAccess(false); 
    setAllowFileAccessFromFileURLs()
    setAllowUniversalAccessFromFileURLs()
    
  3. 对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。

    setJavaScriptEnabled(false);