android-客户端常见漏洞

Android 客户端常见漏洞

组件能力泄漏

  1. 电话拨打权限绕过
    4.1.1-4.4.2
    此漏洞主要是因为一个误导出的BroadCastReceiver:com.android.phone.PhoneGlobals$NotificationBroadcastReceiver,Receiver是导出的,且没有做权限限制,onReceive可以处理三种intent

  2. lanuchAnyWhere
    1 这是一个AccountManagerService的漏洞,利用这个漏洞,我们可以任意调起任意未导出的Activity,突破进程间组件访问隔离的限制。这个漏洞影响2.3 ~ 4.3的安卓系统。
    2 调用过程Alt text
    3 问题出现在Step3中返回的bundle中的intent,AppB可以任意指定这个intent指向的组件
    4 利用过程Alt text
    5 利用场景

    1. 重制PIN码,绕过输入原密码步骤
    2. 调用微信内置浏览器
    3. 调用支付宝内置浏览器
  3. broadAnywhere
    <5
    流程Alt text
    原理:本次的漏洞就发生在流程图的Step1之前, Setting调用了AccountManager.addAccount。在传递的AddAccountOptions参数时加入了一个PendingIntent,其intent类型是Broadcast。注意这个PendingIntent是Settings创建的,拥有system权限。
    以System身份可以发送系统级的广播protected-broadcast,同时还可以将广播发送给未导出的receiver(android:exported=false)和有权限限制的receiver。

  4. content provider 文件目录遍历漏洞:
    http://www.droidsec.cn/content-provider文件目录遍历漏洞浅析/
    http://wolfeye.baidu.com/blog/content-provider-file-traversal/

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

    2. 触发前提:
      对外暴露的Content Provider组件实现了openFile()接口;
      没有对所访问的目标文件Uri进行有效判断,如没有过滤限制如“../”可实现任意可读文件的访问的Content Query Uri;

    3. 过程
      漏洞代码Alt text
      利用Alt text

权限提升

  1. FakeID签名漏洞
    <4.4
    主要的原理就是安卓没有对证书链做验证
    过程
    • 开发机上生成一个根证书(记为CA),并用这个证书去颁发一个子证书(记为SIGN)
    • 然后使用这个子证书为我们即将发布的apk签名,这时APK中的.Rsa文件将包含两个证书,一个是SIGN,一个是CA。并且APK所有的文件都是可以用这个RSA文件验证其合法性的
    • 对这个RSA文件进行篡改,只修改CA证书的内容(替换后的CA记为FakeCA),不修改证书中的SignerInfo部分,不影响PackageManger在安装前使用SignerInfo.encryptedDigest对APK包数据完整性进行校验
    • 这个APK可以被成功安装,并且包含两个证书,一个是SIGN,一个是FakeCA
  2. 本地端口开放风险
    安卓系统内部也有大量使用套接字通信:
    http://dl.acm.org/citation.cfm?doid=2976749.2978297
  3. PrefrenceActivity Fragment注入
    PreferenceActivity是Android框架提供的基类,用来显示用户Preference的层次结构,PreferencePreferenceFragment相关联。PreferenceActivity有两个重要的Intent extras:
    android:show_fragment,用来告诉PreferenceActivity要先显示哪些fragment
    android:show_fragment_arguments,表示Activity获得的参数
    所以这个漏洞 的原理是,恶意APP构造恶意参数调用exportedPreferenceActivity,而PreferenceActivity内部没有对要加载的Fragment作检查。

WebView漏洞

  1. WebView File域同源策略绕过漏洞:
    http://blogs.360.cn/360mobile/2014/09/22/webview跨源攻击分析/
    http://www.droidsec.cn/android-webview-file域攻击杂谈/
    同源是指协议,域名,端口都相同,需要注意的是,对于浏览器上的一个页面来说,页面存放js代码的域并不重要。重要的是加载js的页面所在的域
  2. WebView 远程代码执行漏洞:
    http://www.droidsec.cn/android-webview-远程代码执行之getclassloader/
    因为无视google对getClass的屏蔽,所以与android版本无关,只与targetSDK版本有关,在android4.4,5.0,5.1,6.0上均能实现远程代码执行。
    http://www.droidsec.cn/android-webview远程执行代码漏洞浅析/
    http://www.droidsec.cn/通过-webview-攻击-android-应用/
    http://www.droidsec.cn/新的android-webview远程代码执行漏洞分析与测试方法/
    http://wolfeye.baidu.com/blog/android-webview-cve-2014-7224/
    http://wolfeye.baidu.com/blog/android-webview-cve-2012-6636/
  3. WebView 密码明文保存漏洞
  4. WebView 组件系统隐藏接口未移除漏洞
  5. WebView 组件忽略SSL证书验证错误漏洞

数据存储安全

  1. Shared Preference 安全风险
    http://www.droidsec.cn/android本地数据存储:shared-preferences安全风险浅析/
    http://wolfeye.baidu.com/blog/global-rw-of-sharepreference/
    Android系统提供了以下四种Android应用本地存储方式:Shared Preferences、SQLite Databases、Internal Storage、External Storage等存储方式。Shared Preferences是一种轻量级的基于XML文件存储的键值对(key-value)数据的数据存储方式,一般用于储存应用的配置等信息【1】;
    Shared Preferences存储安全风险源于:1)开发者在创建文件时没有正确的选取合适的创建模式(MODE_PRIVATE、MODE_WORLD_READABLE以及MODE_WORLD_WRITEABLE)进行权限控制;2)开发者过度依赖Android系统内部存储安全机制,将用户信息、密码等敏感重要的信息明文存储在Shared Preferences文件中,导致攻击者可通过root手机来查看敏感信息。
    2) 风险触发前提条件:
    使用MODE_WORLD_READABLE模式创建Shared Preferences文件或使用MODE_WORLD_WRITEABLE模式创建Shared Preferences文件并含有“android:sharedUserId”属性值和测试签名;
    3) 风险原理:
    1. 使用MODE_WORLD_READABLE模式创建Shared Preferences文件,使得其他应用对该Shared Preferences文件具备可读的权限;
    2. 使用MODE_WORLD_WRITEABLE模式创建Shared Preferences文件并含有“android:sharedUserId”属性值,使得其他应用对该应用的Shared Preferences文件具备可写的权限。
    3. 在具备root权限的程序或用户对任何应用程序通过任意模式创建的的Shared Preferences文件都具有可读可写的权限。
  2. Internal Storage 安全风险
    http://www.droidsec.cn/android本地数据存储:internal-storage安全风险浅析/
    http://wolfeye.baidu.com/blog/global-rw-of-file/
    1) 风险位置:
    openFileOutput(String fileName, int mode);
    2) 风险触发前提条件:
    使用了“android:sharedUserId”属性;
    或使用MODE_WORLD_READABLE模式创建内部存储文件;
    或使用MODE_WORLD_WRITEABLE模式创建内部存储文件;
    或Android设备被root;
    3) 本地数据存储风险原理:
    1. 使用“android:sharedUserId”属性,使得其他应用可具有相同该属性值对该内部存储文件具备可读的权限;
    2. 使用MODE_WORLD_READABLE模式创建内部存储文件,使得其他应用对该内部存储文件具备可读的权限;
    3. 使用MODE_WORLD_WRITEABLE模式创建内部存储文件,使得其他应用对该内部存储文件具备可写的权限;
    4. 获取root权限后的应用或用户对任何应用的任何模式创建的内部存储文件都具有可读可写的权限。
  3. DataBase配置模式安全风险
    http://www.droidsec.cn/android-database配置模式安全风险浅析/
    http://wolfeye.baidu.com/blog/global-rw-of-database/
    1) 风险位置:
    openOrCreateDatabase(String fileName, int mode, CursorFactory factory);
    2) 风险触发前提条件:
    使用非MODE_PRIVATE模式创建数据库文件;
    3) 风险原理:
    1. 使用MODE_WORLD_READABLE模式创建数据库文件,使得其他应用对该数据库文件具备可读的权限;
    2. 使用MODE_WORLD_WRITEABLE模式创建数据库文件,使得其他应用对该数据库文件具备可写的权限;

业务逻辑漏洞

  1. 任意账号注册
  2. 账号遍历
  3. 密码找回

代码执行

  1. 外部动态加载DEX安全风险
    http://www.droidsec.cn/外部动态加载dex安全风险浅析/
    http://wolfeye.baidu.com/blog/dynamic-load-dex-file/
    动态加载的DEX文件存储在被其他应用人意读写的目录中(如sdcard),如果没有对外部所加载的DEX文件做完整性校验,应用将会被恶意代码注入,从而执行的是恶意代码;
  2. ZIP文件解压目录风险
    http://wolfeye.baidu.com/blog/traversal-zip-file/
    由于zip允许其中的文件含有 ., /, ¥ 等特殊字符,当从不安全的来源如HTTP下载或者SDK卡获得ZIP格式文件并解压缩时,如果该ZIP文件被劫持插入恶意代码,且没有禁止ZIP目录遍历,可能导致任意代码执行。

中间人攻击

  1. HTTPS 中间人攻击
    http://www.droidsec.cn/android-https中间人劫持漏洞浅析/
    http://www.droidsec.cn/android-https敏感数据劫持漏洞/
    2) 漏洞触发前提条件:
    自定义的X509TrustManager不校验证书;
    或实现的自定义HostnameVerifier不校验域名接受任意域名;
    或使用setHostnameVerifier (ALLOW_ALL_HOSTNAME_VERIFIER);
    3) 漏洞原理:
    由于客户端没有校验服务端的证书,因此攻击者就能与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。
  2. JAVA层ssl中间人攻击
    http://wolfeye.baidu.com/blog/java-ssl-middle-man/
    在密码学和计算机安全领域中,中间人攻击(Man-in-the-middle attack,缩写:MITM)是指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。
    测试方法
    SSLSocketFactory checkServerTrusted 覆盖实现错误
  3. SSL本地库中间人攻击
    http://wolfeye.baidu.com/blog/native-ssl-middle-man/

Manifest 不安全配置

  1. AllowBackup
    http://www.droidsec.cn/android属性allowbackup安全风险浅析/
    http://www.droidsec.cn/详解android-app-allowbackup配置带来的风险/
  2. debug

本地拒绝服务

  1. http://www.droidsec.cn/阿里聚安全扫描器之本地拒绝服务检测详解/
  2. http://www.droidsec.cn/android应用本地拒绝服务漏洞浅析/
  3. http://www.droidsec.cn/android-app通用型拒绝服务漏洞分析报告/
  4. http://wolfeye.baidu.com/blog/local-dos/

随机数漏洞

  1. SecureRandom 漏洞
    http://wolfeye.baidu.com/blog/secure-random/
    http://www.droidsec.cn/securerandom漏洞解析/
    在调用SecureRandom类的构造函数SecureRandom(byte[] seed),这两种方式都会导致生成的随机数可以预测,导致后续依赖于该随机数的加密不安全

数据隐私& 信息泄漏

  1. SQL注入
    http://wolfeye.baidu.com/blog/sql-injection/
    在使用Content Provider时,将组件导出,提供了query接口。由于query接口传入的参数直接或间接由接口调用者传入,攻击者构造sql injection语句,造成信息的泄漏甚至是应用私有数据的恶意改写和删除。具体的攻击案例参考乌云平台
  2. PendingIntent包含隐式intent风险
    http://wolfeye.baidu.com/blog/pendingintent-leak-information/
    PendingIntent可以让其他APP中的代码像是运行自己APP中。PendingIntentintent接收方在使用该intent时与发送方有相同的权限。在使用PendingIntent时,PendingIntent中包装的intent如果是隐式的Intent,容易遭到劫持,导致信息泄露。
  3. 剪贴板敏感数据泄漏
    http://wolfeye.baidu.com/blog/clipboard-leak/
    原因是Android剪贴板的内容向任何权限的app开放,很容易就被嗅探泄密
  4. 日志泄漏
    http://wolfeye.baidu.com/blog/logcat-leak-sensitive-information/
  5. intent敏感数据泄漏
    intent敏感数据泄露风险
  6. 动态注册广播组件暴露
    http://wolfeye.baidu.com/blog/recieve-broadcast-security/
    Android 可以在配置文件中声明一个receiver或者动态注册一个receiver来接收广播信息,攻击者假冒APP构造广播发送给被攻击的receiver,是被攻击的APP执行某些敏感行为或者返回敏感信息等,如果receiver接收到有害的数据或者命令时可能泄露数据或者做一些不当的操作,会造成用户的信息泄漏甚至是财产损失
  7. 发送广播信息泄漏
    http://wolfeye.baidu.com/blog/sendbroadcast-information-leak/
    广播类型

    1. 系统广播:像开机启动、接收到短信、电池电量低这类事件发生的时候系统都会发出特定的广播去通知应用。

    2. 自定义广播:不同于系统广播事件,开发者按照自己需求定义的广播事件。

      • Normal Broadcast
        SendBroadcast,能够异步的发送广播消息,接收该广播的receiver没有顺序限制。
      • Ordered Broadcast
        Ordered Broadcast-有序广播,Normal Broadcast-普通广播,区别是有序广播发出后receiver按照一定的权限顺序接收这个广播,并且前面的receiver可以对广播的内容进行修改,修改的结果被后面receiver接收,优先级高的receiver还可以结束这个广播,后面优先级低的receiver不会再收到广播。Normal Broadcast发出后,receiver接收广播时不存在先后顺序,也不能终止广播。
      • Sticky Broadcast
        sticky broadcast在发送并经过AMS(ActivityManagerService)分发给对应的receiver后,broadcast不会被丢弃,会保存在AMS中。当有新的需要动态注册的receiver请求AMS注册时,如果该receiver能够接收这个broadcast,那么AMS会将在receiver注册成功之后,立即向receiver发送这个broadcastsendStickyBroadcast()顾名思义是发送粘性的广播,需要申请权限android.Manifest.permission.BROADCAST_STICKYsticky broadcast的特点是Intent广播事件结束会一直保留。
      • Local Broadcast
        只能在同一进程发送的广播类型,同一APP的其他进程以及其他APP的进程无法接收
  8. 弱加密风险
    http://wolfeye.baidu.com/blog/weak-encryption/
  9. URL Scheme攻击
    http://wolfeye.baidu.com/blog/intent-scheme-url/
    Intent Scheme URL是一种特殊的URL格式,用来通过Web页面启动已安装应用的Activity组件,大多数主流浏览器都支持此功能。当对Intent URL的处理不当时,就会导致基于Intent的攻击
comments powered by Disqus