移动端 安卓apk安全测试 2017.8.14

自动化检测
360显微镜(完全免费) http://appscan.360.cn/
阿里聚安全(部分收费)https://jaq.alibaba.com/gc/appsec/index.htm
apk安全知识库 http://appscan.360.cn/vulner/list/
爱加密 加密/监测app市场 看不到检测结果 http://safe.ijiami.cn/
移动APP漏洞自动化检测平台建设 https://security.tencent.com/index.php/blog/msg/109
几维安全 http://www.kiwisec.com/
Android App 漏洞学习(一) https://mp.weixin.qq.com/s/aM3rIkwxE2LuE_1jSdWFkA

【过时】使用 Androl4b 进行安卓 APP 安全测试

http://www.freebuf.com/articles/terminal/110374.html
2017.8.14亲测不好用:android系统版本低造成应用闪退,burp提示版本低且无法升级,办公等冗余应用。

建议1:在虚拟机中的sdk manager升级android系统。

建议2:直接本机安装必备的工具
apktool 下载完执行脚本./apktool https://ibotpeaches.github.io/Apktool/install/

JD-GUI http://jd.benow.ca/ 直接下载打开即可
android虚拟机,或者真机调试

使用apktool

检测网络传输中的问题 - 使用Android调试桥 adb 给android虚拟设备安装apk

adb
https://developer.android.com/studio/command-line/adb.html?hl=zh-cn

在本机终端某目录下有下x.apk 安装到虚拟机中:

adb install /home/andro/Desktop/x.apk

为虚拟设备设置代理 Burp Suite抓包

虚拟设备终端执行:

emulator -avd lab -no-audio -http-proxy http://127.0.0.1:8888

打开burp:
Applications->tools->BurpSuite

apktool - apk逆向工具

安装步骤:
https://ibotpeaches.github.io/Apktool/install/

apktool d testapp.apk

反编译后得到”testapp”目录,中有一个AndroidManifest.xml文件


Drozer – Android APP 安全评估工具

移动终端APP安全评估

App代码安全:代码混淆/加密/app加壳

App数据存储安全:数据持久化时要加密

App网络传输安全:指对数据从客户端传输到Server中间过程的加密,防止网络世界当中其他节点对数据的窃听。

重放攻击 - 时间戳(加密处理)
数据的加密(完整性校验)
明文传输
使用http协议明文传输用户名和密码,并未对用户名和密码进行加密处理。通过监控网络数据就可以截获到用户名和用户密码数据,导致用户信息泄露,给用户带来安全风险。

关键数据明文传输

客户端安全(数据录入)
客户端到服务器安全(数据传输)
服务器端安全(数据存储)

无论客户端,server还是网络传输都要避免明文密码,要使用hash值。客户端不要做任何密码相关的存储,hash值也不行。存储token进行下一次的认证,而且token需要设置有效期,使用refresh token去申请新的token。

APP二次打包

即反编译后重新加入恶意的代码逻辑,或置入新病毒重新生成一个新APK文件。

尽量使用https

https可以过滤掉大部分的安全问题。https在证书申请,服务器配置,性能优化,客户端配置上都需要投入精力,所以缺乏安全意识的开发人员容易跳过https,或者拖到以后遇到问题再优化。https除了性能优化麻烦一些以外其他都比想象中的简单,如果没精力优化性能,至少在注册登录模块需要启用https,这部分业务对性能要求比较低。

不要使用301跳转

301跳转很容易被Http劫持攻击。移动端看不到浏览器地址,无法察觉到被重定向到了其他地址。
如果一定要使用301确保跳转发生在https的环境下,而且https做了证书绑定校验。

HTTPS中间人劫持漏洞

中间人攻击是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上攻击者拦截通讯双方的通话并插入新的内容。
HTTPS中间人攻击漏洞有以下来源:
没有对SSL证书进行校验。
没有对域名进行校验。
证书颁发机构(Certification Authority)被攻击,导致私钥泄露等。

示例:
实现的X509TrustManager接口的Java代码片段 【其中的checkServerTrusted()方法实现为空,即不检查服务器是否可信】:



接受任意域名的Java代码片段


攻击效果:
某App中添加收货地址,使用中间人劫持能获取到手机号、地址、姓名等敏感信息。



我们从上面的攻击效果可以看出来,利用中间人劫持漏洞,攻击者可通过中间人攻击(比如使用钓鱼WiFi),盗取账户密码明文、聊天内容、通讯地址、电话号码以及信用卡支付信息等敏感信息,甚至通过中间人劫持将原有信息替换成恶意链接或恶意代码程序,以达到远程控制、恶意扣费等攻击意图。
在各大漏洞平台上,有大量存在HTTPS证书不校验漏洞, 例如国内绝大部分Android APP存在信任所有证书漏洞、亚马逊最新官方Android版存在一处信任所有证书漏洞、Yahoo雅虎在国内访问遭遇SSL中间人攻击、携程旅游网最新Android客户端https未校验证书导致https通信内容完全被捕获。

登录安全性

暴力破解
安全键盘
使用他人手机号 任意注册
账号找回
撞库

权限问题

垂直越权(管理员)
水平越权

加密算法漏洞

以下几种行为会有产生加密算法漏洞的危险:

使用AES/DES/DESede加密算法时,如果使用ECB模式,容易受到攻击风险,造成信息泄露。
代码中生成秘钥时使用明文硬编码,易被轻易破解。
使用不安全的Hash算法(MD5/SHA-1)加密信息,易被破解。
生成的随机数具有确定性,存在被破解的风险。
而加密信息被破解后,产生的危害也就不言而喻了: 加密信息被泄露。如果加密的是账号、密码、银行卡、身份证等信息,破解后可被不法分子用于诈骗、盗号、盗刷等。

相关案例:

某互联网金融APP加密算法被破解导致敏感信息泄露
某P2P应用客户端,用来加密数据的DES算法的密钥硬编码在Java代码中,而DES算法是对称密码算法,既加密密钥和解密密钥相同。知道了密文和加密算法以及密钥,通过解密操作,可以从文件中恢复出原始的手势密码。

Android组件权限保护

禁止App内部组件被任意第三方程序调用。

若需要供外部调用的组件,应检查对调用者是否做了签名限制

APP 更新

部分 APP 更新会通过接口传输一个是否更新的字段,如果存在新版本,接口会同时返回一个下载地址。如果网络被劫持了,劫持者就可以伪造接口,接口数据返回 APP 需要更新,但是更新地址却是攻击者指定的其它地址,那就可能造成 APP 下载攻击者指定的 APP 的情况出现。

解决这个问题也简单,数据包里加一个完整性的校验,当客户端发现数据包被篡改时可自动注销或提示用户存在风险。进一步的,对下载的 apk 进行签名校验~

表单的 XSS 攻击

APP 中会出现一些需要用户输入的地方,输入之后往往需要在 web/wap 端展现,这里的输入就需要做 xss 过滤。
xss 是攻击的一个重要领域,这里不细说,防 xss 也有很多比较成熟的解决方式,只要服务器做好相应的过滤基本不会出现太大问题。

京东金融App 用户反馈 盲打
</textarea>'"><script src=http://*******></script>

代码安全

可运行于虚拟机
代码未混淆,可直接逆向

webview 非法 URL

我们通常会使用 webview 加载部分内容,由于 webview 通常是作为 APP 的一部分而存在的,所以 webview 通常提供与 APP 一致的用户体验。
另一个背景是 APP 通常有一种外部唤起的机制,通过某特殊方式唤起 APP。
如果上面两个条件均满足,APP 支持外部唤起打开 webview。如果唤起之后打开的是攻击者的钓鱼页面,钓鱼页面引导用户输入用户名密码等信息,就会导致用户信息泄露。

解决办法也是对 webview 打开的网址进行校验,校验不通过提示风险。

正则校验被绕过:
淘宝客户端某漏洞导致可以大规模钓鱼获取淘宝账号

本地存储安全性

iOS 的 APP 存储空间是不能相互访问的。
下载团贷网IOS客户端
使用iTools打开,找到存储cookie的文件(其实这和明文存储密码威胁一样)

sqlite3 数据库
Android 可以把隐私相关文件设置为 PRIVATE 来拒绝用户以及其它 APP 访问。

WebView漏洞

应用中存在WebView漏洞,没有对注册JAVA类的方法调用进行限制,导致攻击者可以利用反射机制调用未注册的其他任何JAVA类,最终导致javascript代码对设备进行任意攻击。

image.png

整改建议
通过在Java的远程方法上面声明一个@JavascriptInterface 来代替addjavascriptInterface;
在使用js2java的bridge时候,需要对每个传入的参数进行验证,屏蔽攻击代码;
Note :控制相关权限或者尽可能不要使用js2java 的bridge 。

AndroidManifest解读

<?xml version="1.0" encoding="UTF-8"?>
<!--
 Copyright 2013 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
     http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    <!--  java主程序包的包名,也是一个应用进程的默认名称-->    
    package="com.example.android.basiccontactables"
    <!--  代表app更新过多少次-->   
    android:versionCode="1"
    <!--  App版本号--> 
    android:versionName="1.0" >
 
    <!-- 描述api level,指定支持的最小版本,目标版本以及最大版本;--> 
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="20" >
 
    <!--  申请系统权限--> 
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!-- Min/target SDK versions (<uses-sdk>) managed by build.gradle 最小版本号 -->
    <!--  提供了供其他程序使用的权限--> 
    <permission android:name="android"></permission>
 
 
    <application
        <!--  将程序加入到系统的备份和恢复架构中--> 
        android:allowBackup="true"
 
        <!-- 应用配置细节 
      icon是图标;
      label是程序名称显示在titlebar中的
      theme是整个程序的主题,这里是自己文件定义的主题,如果想用android的就是@android:style/Theme再加alt+/就可以随便选了--> 
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Sample" >
        <!--  activity配置--> 
        <activity
            android:name="com.example.android.basiccontactables.MainActivity"
            <!--  activity显示的模式--> 
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            <!--  activity的四种启动模式:standard、singleTop、singleTask、singleInstance--> 
            android:launchMode="singleTop">
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
            <!--  来对系统中intent进行过滤处理,action标签用于描述具体消息的名称,category标签用于表示能处理消息组件的类别,data标签则用于描述消息需要处理的数据格式;--> 
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <!--  service配置--> 
        <service >
            <intent-filter >
                <action />
                <category />
                <data />
            </intent-filter>
        <!-- 服务开关android:enabled--> 
        android:enabled=["true" | "false"]
        <!-- 组件是私有的还是公有的,公有组件能够被外部应用使用。注意content provider默认是公有的true,其余组件默认是私有的false--> 
        android:exported[="true" | "false"]
        </service>
 
        <!-- Broadcast Receive配置 -->
        <receiver >
            <intent-filter />
            <meta-data />
        </receiver>
 
        <!-- content Provider配置 -->
        <provider >
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>
 
        <!-- 程序需要的外部库 -->
        <uses-library />
 
 
</application> </manifest>

2017年度移动App安全漏洞与数据泄露现状报告

Activity公开组件暴露
Broadcast Receiver组件调用漏洞
Service组件任意调用漏洞
运行其它可执行程序漏洞
应用反编译
硬编码敏感信息泄露漏洞
本地拒绝服务漏洞
外部存储设备信息泄露漏洞
PendingIntent包含隐式Intent信息泄露漏洞
Android App allowBackup安全漏洞

360

程序可被任意调试

风险描述
安卓AndroidManifest.xml文件中android:debuggable为true。

危害描述
app可以被任意调试。

修复建议
AndroidManifest.xml 配置文件中中设置为android:Debugable="false"。

参考链接
https://developer.android.com/guide/topics/manifest/application-element.html#debug

程序数据任意备份

风险描述
安卓AndroidManifest.xml文件中android: allowBackup=true

属性allowBackup=true

当allowBackup标志为true时,用户可通过adb backup来进行对应用数据的备份,在无root的情况下可以导出应用中存储的所有数据,造成用户数据的严重泄露。


整改建议
将参数android:allowBackup属性设置为false,不能对应用数据备份。

危害描述
app数据可以被备份导出。

修复建议
AndroidManifest.xml 配置文件中中设置为android:allowBackup="false"。

参考链接
https://developer.android.com/guide/topics/manifest/application-element.html#allowbackup

Activity组件暴露

风险描述
Activity组件的属性exported被设置为true或是未设置exported值但IntentFilter不为空时,activity被认为是导出的,可通过设置相应的Intent唤起activity。

危害描述
黑客可能构造恶意数据针对导出activity组件实施越权攻击。

修复建议
如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

参考链接
https://developer.android.com/guide/components/activities.html

Service组件暴露

风险描述
Service组件的属性exported被设置为true或是未设置exported值但IntentFilter不为空时,Service被认为是导出的,可通过设置相应的Intent唤起Service。

危害描述
黑客可能构造恶意数据针对导出Service组件实施越权攻击。

修复建议
如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

参考链接
https://developer.android.com/guide/components/services.html

ContentProvider组件暴露

风险描述
Content Provider组件的属性exported被设置为true或是Android API<=16时,Content Provider被认为是导出的。

危害描述
黑客可能访问到应用本身不想共享的数据或文件。

修复建议
如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

参考链接
https://developer.android.com/guide/topics/providers/content-providers.html

BroadcastReceiver组件暴露

风险描述
BroadcastReceiver组件的属性exported被设置为true或是未设置exported值但IntentFilter不为空时,BroadcastReceiver被认为是导出的。

危害描述
导出的广播可以导致数据泄漏或者是越权。

修复建议
如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

参考链接
https://developer.android.com/guide/topics/manifest/receiver-element.html

Webview存在本地Java接口

风险描述
android的webView组件有一个非常特殊的接口函数addJavascriptInterface,能实现本地java与js之间交互。

危害描述
在targetSdkVersion小于17时,攻击者利用 addJavascriptInterface这个接口添加的函数,可以远程执行任意代码。

修复建议
建议开发者不要使用addJavascriptInterface,使用注入javascript和第三方协议的替代方案。

参考链接
https://developer.android.com/reference/android/webkit/WebView.html

SSL通信服务端检测信任任意证书

风险描述
自定义SSL x509 TrustManager,重写checkServerTrusted方法,方法内不做任何服务端的证书校验。

危害描述
黑客可以使用中间人攻击获取加密内容。

修复建议
严格判断服务端和客户端证书校验,对于异常事件禁止return 空或者null。

参考链接
https://developer.android.com/reference/javax/net/ssl/X509TrustManager.html

隐式意图调用

风险描述
封装Intent时采用隐式设置,只设定action,未限定具体的接收对象,导致Intent可被其他应用获取并读取其中数据。

危害描述
Intent隐式调用发送的意图可能被第三方劫持,可能导致内部隐私数据泄露。

修复建议
将隐式调用改为显式调用。

参考链接
https://developer.android.com/guide/components/intents-filters.html

WebView忽略SSL证书错误

风险描述
WebView调用onReceivedSslError方法时,直接执行handler.proceed()来忽略该证书错误。

危害描述
忽略SSL证书错误可能引起中间人攻击。

修复建议
不要重写onReceivedSslError方法, 或者对于SSL证书错误问题按照业务场景判断,避免造成数据明文传输情况。

参考链接
https://developer.android.com/reference/android/webkit/WebViewClient.html

HTTPS关闭主机名验证

风险描述
构造HttpClient时,设置HostnameVerifier时参数使用ALLOW_ALL_HOSTNAME_VERIFIER或空的HostnameVerifier。

危害描述
关闭主机名校验可以导致黑客使用中间人攻击获取加密内容。

修复建议
APP在使用SSL时没有对证书的主机名进行校验,信任任意主机名下的合法的证书,导致加密通信可被还原成明文通信,加密传输遭到破坏。

参考链接
https://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html

Intent Scheme URLs攻击

风险描述
在AndroidManifast.xml设置Scheme协议之后,可以通过浏览器打开对应的Activity。

危害描述
攻击者通过访问浏览器构造Intent语法唤起app相应组件,轻则引起拒绝服务,重则可能演变为提权漏洞。

修复建议
配置category filter, 添加android.intent.category.BROWSABLE方式规避风险

参考链接
https://developer.android.com/guide/components/intents-filters.html

全局文件可读

风险描述
APP在创建内部存储文件时,将文件设置了全局的可读权限。

危害描述
攻击者恶意读取文件内容,获取敏感信息。

修复建议
请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可读属性。

参考链接
https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

全局文件可写

风险描述
APP在创建内部存储文件时,将文件设置了全局的可写权限。

危害描述
攻击者恶意写文件内容,破坏APP的完整性。

修复建议
请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写属性。

参考链接
https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE

全局文件可读可写

风险描述
APP在创建内部存储文件时,将文件设置了全局的可读写权限。

危害描述
攻击者恶意写文件内容或者,破坏APP的完整性,或者是攻击者恶意读取文件内容,获取敏感信息。。

修复建议
请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写、写属性。

参考链接
https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLEhttps://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

SSL通信客户端检测信任任意证书

风险描述
自定义SSL x509 TrustManager,重写checkClientTrusted方法,方法内不做任何服务端的证书校验。

危害描述
黑客可以使用中间人攻击获取加密内容。

修复建议
严格判断服务端和客户端证书校验,对于异常事件禁止return 空或者null。

参考链接
https://developer.android.com/reference/javax/net/ssl/X509TrustManager.html

配置文件可读

风险描述
使用getSharedPreferences打开文件,第二个参数设置为MODE_WORLD_READABLE。

危害描述
当前文件可以被其他应用读取,导致信息泄漏。

修复建议
使用getSharedPreferences时第二个参数设置为MODE_PRIVATE;如果必须设置为全局可读模式供其他程序使用,请保证存储的数据非隐私数据或是加密后存储。

参考链接
[https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String](https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String), int)https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

配置文件可写

风险描述
使用getSharedPreferences打开文件,第二个参数设置为MODE_WORLD_WRITEABLE。

危害描述
当前文件可以被其他应用写入,导致文件内容被篡改,可能导致影响应用程序的正常运行或更严重的问题。

修复建议
使用getSharedPreferences时第二个参数必须设置为MODE_PRIVATE。

参考链接
[https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String](https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String), int)https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE

配置文件可读可写

风险描述
使用getSharedPreferences打开文件时,如果将第二个参数设置为MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE。

危害描述
当前文件可以被其他应用读取和写入,导致信息泄漏、文件内容被篡改,影响应用程序的正常运行或更严重的问题。

修复建议
使用getSharedPreferences时第二个参数设置为MODE_PRIVATE。禁止使用MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE模式。

参考链接
[https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String](https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String), int)https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLEhttps://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

DEX文件动态加载

风险描述
使用DexClassLoader加载外部的 apk、jar 或 dex文件,当外部文件的来源无法控制时或是被篡改,此时无法保证加载的文件是否安全。

危害描述
加载恶意的dex文件将会导致任意命令的执行。

修复建议
加载外部文件前,必须使用校验签名或MD5等方式确认外部文件的安全性。

参考链接
https://developer.android.com/reference/dalvik/system/DexClassLoader.html

AES弱加密

风险描述
在AES加密时,使用“AES/ECB/NoPadding”或“AES/ECB/PKCS5padding”的模式。

危害描述
ECB是将文件分块后对文件块做同一加密,破解加密只需要针对一个文件块进行解密,降低了破解难度和文件安全性。

修复建议
禁止使用AES加密的ECB模式,显式指定加密算法为:CBC或CFB模式,可带上PKCS5Padding填充。AES密钥长度最少是128位,推荐使用256位。

参考链接
https://developer.android.com/reference/javax/crypto/Cipher.html

Provider文件目录遍历

风险描述
当Provider被导出且覆写了openFile方法时,没有对Content Query Uri进行有效判断或过滤。

危害描述
攻击者可以利用openFile()接口进行文件目录遍历以达到访问任意可读文件的目的。

修复建议
一般情况下无需覆写openFile方法,如果必要,对提交的参数进行“../”目录跳转符或其他安全校验。

参考链接
[https://developer.android.com/reference/android/content/ContentProvider.html#openFile(android.net.Uri](https://developer.android.com/reference/android/content/ContentProvider.html#openFile(android.net.Uri), java.lang.String)

activity绑定browserable与自定义协议

风险描述
activity设置“android.intent.category.BROWSABLE”属性并同时设置了自定义的协议android:scheme意味着可以通过浏览器使用自定义协议打开此activity。

危害描述
可能通过浏览器对app进行越权调用。

修复建议
app对外部调用过程和传输数据进行安全检查或检验。

参考链接
https://developer.android.com/reference/android/content/Intent.html#CATEGORY_BROWSABLE

动态注册广播

风险描述
使用registerReceiver动态注册的广播在组件的生命周期里是默认导出的。

危害描述
导出的广播可以导致拒绝服务、数据泄漏或是越权调用。

修复建议
使用带权限检验的registerReceiver API进行动态广播的注册。

参考链接
[https://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver](https://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver), android.content.IntentFilter, java.lang.String, android.os.Handler)

开放socket端口

风险描述
app绑定端口进行监听,建立连接后可接收外部发送的数据。

危害描述
攻击者可构造恶意数据对端口进行测试,对于绑定了IP 0.0.0.0的app可发起远程攻击。

修复建议
如无必要,只绑定本地ip127.0.0.1,并且对接收的数据进行过滤、验证。

参考链接
[https://developer.android.com/reference/java/net/Socket.html#Socket(java.net.InetAddress](https://developer.android.com/reference/java/net/Socket.html#Socket(java.net.InetAddress), int)

Fragment注入

风险描述
通过导出的PreferenceActivity的子类,没有正确处理Intent的extra值。

危害描述
攻击者可绕过限制访问未授权的界面。

修复建议
当targetSdk大于等于19时,强制实现了isValidFragment方法;小于19时,在PreferenceActivity的子类中都要加入isValidFragment ,两种情况下在isValidFragment 方法中进行fragment名的合法性校验。

参考链接
https://developer.android.com/reference/android/preference/PreferenceActivity.html#isValidFragment(java.lang.String

webview明文存储密码

风险描述
Webview中使用setSavePassword(true),保存在WebView中输入的用户名和密码到应用数据目录的databases/webview.db中。

危害描述
当手机是root或是通过其他漏洞获取webview.db的内容时,将会造成用户敏感数据的泄漏。

修复建议
使用WebView.getSettings().setSavePassword(false)来禁止保存密码。

参考链接
https://developer.android.com/reference/android/webkit/WebSettings.html#setSavePassword(boolean

unzip解压缩

风险描述
解压 zip文件,使用getName()获取压缩文件名后未对名称进行校验。

危害描述
攻击者可构造恶意zip文件,被解压的文件将会进行目录跳转被解压到其他目录,覆盖相应文件导致任意代码执行。

修复建议
解压文件时,判断文件名是否有../特殊字符。

参考链接
https://developer.android.com/reference/java/util/zip/ZipEntry.html#getName()

未使用编译器堆栈保护技术

风险描述
为了检测栈中的溢出,引入了Stack Canaries漏洞缓解技术。在所有函数调用发生时,向栈帧内压入一个额外的被称作canary的随机数,当栈中发生溢出时,canary将被首先覆盖,之后才是EBP和返回地址。在函数返回之前,系统将执行一个额外的安全验证操作,将栈帧中原先存放的canary和.data中副本的值进行比较,如果两者不吻合,说明发生了栈溢出。

危害描述
不使用Stack Canaries栈保护技术,发生栈溢出时系统并不会对程序进行保护。

修复建议
使用NDK编译so时,在Android.mk文件中添加:LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all

参考链接
https://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries

未使用地址空间随机化技术

风险描述
PIE全称Position Independent Executables,是一种地址空间随机化技术。当so被加载时,在内存里的地址是随机分配的。

危害描述
不使用PIE,将会使得shellcode的执行难度降低,攻击成功率增加。

修复建议
NDK编译so时,加入LOCAL_CFLAGS := -fpie -pie开启对PIE的支持。

参考链接
https://en.wikipedia.org/wiki/Position-independent_code#Position-independent_executables

动态链接库中包含执行命令函数

风险描述
在native程序中,有时需要执行系统命令,在接收外部传入的参数执行命令时没有做过滤或检验。

危害描述
攻击者传入任意命令,导致恶意命令的执行。

修复建议
对传入的参数进行严格的过滤。

参考链接
http://baike.baidu.com/subview/627587/14965930.htm#2

随机数不安全使用

风险描述
调用SecureRandom类中的setSeed方法。

危害描述
生成的随机数具有确定性,存在被破解的可能性。

修复建议
使用/dev/urandom或者/dev/random来初始化伪随机数生成器。

参考链接
https://developer.android.com/reference/java/security/SecureRandom.html#setSeed(long

FFmpeg文件读取

风险描述
使用了低版本的FFmpeg库进行视频解码。

危害描述
在FFmpeg的某些版本中可能存在本地文件读取漏洞,可以通过构造恶意文件获取本地文件内容。

修复建议
升级FFmpeg库到最新版。

参考链接
http://ffmpeg.org/

libupnp栈溢出漏洞

风险描述
使用了低于1.6.18版本的的libupnp库文件。

危害描述
构造恶意数据包可造成缓冲区溢出,造成代码执行。

修复建议
升级libupnp库到1.6.18版本或以上。

参考链接
https://sourceforge.net/projects/pupnp/files/pupnp/libUPnP%201.6.18/

Webview组件远程代码执行(调用getClassLoader)

风险描述
使用低于17的targetSDKVersion,并且在Context子类中使用addJavascriptInterface绑定this对象。

危害描述
通过调用getClassLoader可以绕过google底层对getClass方法的限制。

修复建议
targetSDKVersion使用大于17的版本。

参考链接
https://developer.android.com/reference/android/content/Context.html#getClassLoader()

AES/DES硬编码密钥

风险描述
使用AES或DES加解密时,采用硬编码在程序中的密钥。

危害描述
通过反编译拿到密钥可以轻易解密APP通信数据。

修复建议
密钥加密存储或是用过变形后进行加解密运算,切勿硬编码到代码中。

参考链接
[https://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html#SecretKeySpec(byte](https://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html#SecretKeySpec(byte)[], java.lang.String)

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 124,926评论 16 537
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 9,279评论 2 42
  • 拨开水面繁花点点 轻取皎若琉璃的清虚 对语,一叶翻飞的布幔 你不来,我不远 诗意曾几多翩翩 醉倒在夜阑珊的脚边 晓...
    烟雨心清阅读 73评论 7 13
  • 到了西双版纳,明显地感觉步入了另一个世界。这个世界有醉人的暖风,漫山遍野的香蕉树,满街的椰子树,有幽暗潮湿...
    潇湘静女阅读 60评论 0 2
  • 我愿是沙漠中最后一滴干涸的泪。在你,其中一个过客的心上烙下或深或浅的斑驳印迹。 我愿,你能携我而去,即便我化为...
    默沫silent阅读 49评论 2 2