密钥硬编码漏洞
危害:"密钥硬编码是指在代码中直接将加密算法的密钥设置为一个固定值。通常加密算法本身都是公开的,而加密内容的保密则主要是依赖于加密密钥。如果密钥泄露,根据加密算法和加密后的密文,很容易得到加密前的明文。而密钥硬编码在代码中,通过反编译攻击者可以直接查看密钥内容,整个加密算法将形同虚设。密钥硬编码,可直接造成加密数据被破解,客户端与服务器之间的通信内容被破解,导致应用内的加密文件被破解,或是用户的敏感信
息泄露。"
解决方案: 密钥加密存储或者经过变形处理后用于加解密运算,切勿硬编码到代码中。
首先密钥存在本地很定不是绝对安全的,能做的是提高密钥获取的门槛,在android中主要有以下几个做法:
1、密钥直接明文存在sharedprefs文件中,这是最不安全的。
2、密钥直接硬编码在Java代码中,这很不安全,dex文件很容易被逆向成java代码。
3、将密钥分成不同的几段,有的存储在文件中、有的存储在代码中,最后将他们拼接起来,可以将整个操作写的很复杂,这因为还是在java层,逆向者只要花点时间,也很容易被逆向。
4、用ndk开发,将密钥放在so文件,加密解密操作都在so文件里,这从一定程度上提高了的安全性,挡住了一些逆向者,但是有经验的逆向者还是会使用IDA破解的。
5、在so文件中不存储密钥,so文件中对密钥进行加解密操作,将密钥加密后的密钥命名为其他普通文件,存放在assets目录下或者其他目录下,接着在so文件里面添加无关代码(花指令),虽然可以增加静态分析难度,但是可以使用动态调式的方法,追踪加密解密函数,也可以查找到密钥内容。
如果要想更高级别的密钥安全,那可以考虑使用密钥交换算法,比如DH算法,公钥加密密钥等。
Webview 明文存储密码风险
危害:Android 的 Webview 组件中默认打开了提示用户是否保存密码的功能,如果用户选择保存,用户名和密码将被明文存储到该应用目录databases/webview.db 中。而本地明文存储的用户名和密码,不仅会被该应用随意浏览,其他恶意程序也可能通过提权或者 root 的方式访问该应用的webview 数据库,从而窃取用户登录过的用户名信息以及密码。
解决方案:mWebView.settings.savePassword = false
WebView 安全之 addJavascriptInterface
危害:为了与Web页面实现动态交互,Android应用程序允许WebView通过WebView.addJavascriptInterface接口向Web页面注入Java对象,页面Javascript脚本可直接引用该对象并调用该对象的方法。
在Android <=4.1.2 (API 16),WebView使用WebKit浏览器引擎,并未正确限制addJavascriptInterface的使用方法,在应用权限范围内,攻击者可以通过Java反射机制实现任意命令执行。
在Android >=4.2 (API 17),WebView使用Chromium浏览器引擎,并且限制了Javascript对Java对象方法的调用权限,只有声明了@JavascriptInterace注解的方法才能被Web页面调用。
如:
<script>
function execute(cmdArgs) {
// jsobj是通过addJavascriptInterface添加到js中的java对象
return jsobj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
execute(someCmd);
</script>
解决方案:android 4.2以上使用@Javascriptinterface注解标记js需要调用的原生方法
android 4.2以下建议不要使用,可以通过
public WebResourceResponse shouldInterceptRequest(WebView view, final String url) 拦截来实现js调native。
“应用克隆”漏洞攻击风险
危害:当 Android 应用中存在包含webview 的可被导出 Activity 组件时,setAllowFileAccess=true,setAllowFileAccessFromFileURLs=true,即允许通过 file url 对文件进行访问,并且未对访问的路径进行严格校验,则可能导致“应用克隆”漏洞攻击。
攻击者利用该漏洞,可远程获取用户隐私信息(包括手机应用数据、照片、文档等敏感信息)导致数据泄露,可远程打开并加载恶意HTML 文件,甚至获取 App 中包括用户登录凭证在内的所有本地敏感数据。
攻击流程:
setp1: 构造一个网页,网页代码要包含:1.启动支付宝的Webview 2.下载攻击脚本到本地SD卡的download目录 3.利用file协议加载本地攻击脚本
setp2: 利用支付宝应用定义的URL Scheme,使支付宝Webview加载自己的页面;
setp3: 下载到本地的攻击脚本,利用file协议打开执行攻击脚本,攻击脚本再一次利用file协议读取支付宝的个人数据,并上传到攻击者的服务器或者设备中
解决方案:
1.严格限制包含 WebView 调用的 Activity 组件的导出权限,关闭导出权限
或者限制导出组件的发起者。
2.对于功能要求必须导出的 Activity 组件,手动设置
setAllowFileAccessFromFileURLs(false)或
setAllowUniversalAccessFromFileURLs(false)
或者设置 minSDK 不小于 16,因为此时这两处 API 默认为 false
- 对于必须使用 file URL 对 http 域进行访问时,可对传入的 URL 路径范围
严格控制,例如建立 URL 白名单,设置允许访问的 URL 列表(不要遗漏路
径中可能出现的特殊情况如“../../”等,避免限制被绕过)。举个栗子
:
/构建 webview/
WebView webView = new WebView(this);
webview.setWebViewClient(new WebViewClient{
public boolean shouldOverrideUrlLoading(WebView view, String
url){
/白名单/
String[] allowUrlArr = {
""a.html"",
""b.html"",
""c.js"",
}
/禁止 url 中出现../避免白名单被绕过/
if(-1 != url.indexOf(""../"")){
return true;
}
/应用自己的 HTML 文件放在/data/data/(app)目录下,避免被第三方
替换或修改/
if(url.startsWith(""/data/data/(app)"")){
/检测重定向的 url 是否在白名单中/
for(String s : allowUrlArr){
if(url.endsWith(s)){
return false;
} }}
return true;})
当返回值为 true 时,应该拒绝此 URL 路径下的访问。"
Webview File 同源策略绕过漏洞
危害:Android 应用中存在包含webview 的可被导出 Activity 组件时,WebView setAllowFileAccess = true,setAllowFileAccessFromFileURLs= false,虽然不允许file url访问本地文件,但利用JavaScript 的延时执行能够绕过 file 协议的同源检查,并能够访问受害应用的所有私有文件,即通过 WebView 对 Javascript 的延时执行和将当前 Html文件删除掉并软连接指向其他文件就可以读取到被符号链接所指的文件,然后通过 JavaScript 再次读取 HTML 文件,即可获取到被符号链接所指的文件。大多数使用 WebView 的应用都会受到该漏洞的影响,恶意应用通过该漏洞,可在无特殊权限下盗取应用的任意私有文件,尤其是浏览器,可通过利用该漏洞,获取到浏览器所保存的密码、Cookie、收藏夹以及历史记录等敏感信息,从而造成敏感信息泄露。
解决方案:
- 将不必要导出的组件设置为不导出,并显式设置所注册组件的
“android:exported”属性为 false; - 如果需要导出组件,禁止访问本地File
WebView.getSettings.setAllowFileAccess(false); - 如果需要使用 File 协议,禁止调用 JavaScript:
WebView.getSettings.setJavaScrip"
allowBackup程序任意备份漏洞
危害说明:Android API Level 8 及其以上 Android 系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中 AndroidManifest.xml 文件中的 allowBackup 属性值,其属性值默认是 True。当 allowBackup 标志为 true 时,用户即可通过 adb backup 和 adb restore 来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。
Android 属性 allowBackup 安全风险源于 adb backup 容许任何一个能够打开 USB 调试开关的人从Android 手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore 容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即可在其他 Android 手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。
尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过 adb backup 和 adb restore 进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此为了安全起见,开发者务必将 allowBackup 标志值设置为 false 来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。
解决方案:应用程序中 AndroidManifest.xml 文件中的 allowBackup 属性设备为false。