移动端 安卓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()方法实现为空,即不检查服务器是否可信】:

移动端 安卓apk安全测试 2017.8.14_第1张图片


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


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


移动端 安卓apk安全测试 2017.8.14_第2张图片

我们从上面的攻击效果可以看出来,利用中间人劫持漏洞,攻击者可通过中间人攻击(比如使用钓鱼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 用户反馈 盲打
'">

代码安全

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

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代码对设备进行任意攻击。

移动端 安卓apk安全测试 2017.8.14_第3张图片
image.png

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

AndroidManifest解读



 
    
    package="com.example.android.basiccontactables"
       
    android:versionCode="1"
     
    android:versionName="1.0" >
 
     
    
 
     
    
    
     
    
 
 
     
        android:allowBackup="true"
 
         
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Sample" >
         
         
            android:label="@string/app_name"
            android:screenOrientation="portrait"
             
            android:launchMode="singleTop">
            
             
            
                
            
            
                
                
            
        
 
         
        
            
                
                
                
            
         
        android:enabled=["true" | "false"]
         
        android:exported[="true" | "false"]
        
 
        
        
            
            
        
 
        
        
            
            
            
        
 
        
        
 
 
 

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的情况下可以导出应用中存储的所有数据,造成用户数据的严重泄露。

移动端 安卓apk安全测试 2017.8.14_第4张图片

整改建议
将参数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)

你可能感兴趣的:(移动端 安卓apk安全测试 2017.8.14)