Android安全[app风险]

Activity组件暴露

风险描述

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

危害描述

黑客可能构造恶意数据针对导出activity组件实施越权攻击,注入/越权,拒绝服务,劫持/隐式意图等。

安全建议

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

测试方法

# 启动activity
adb shell am start -n com.zxc.criminalintent/.CrimeCameraActivity

 

Service组件暴露

风险描述

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

危害描述

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

安全建议

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

测试方法

# 启动service
adb shell am startservice -n com.android.traffic/com.android.traffic.maniservice

 

ContentProvider组件暴露

风险描述

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

危害描述

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

安全建议

  1. minSdkVersion不低于9
  2. 不向外部app提供的数据的私有content provider设置exported=“false”避免组件暴露(编译api小于17时更应注意此点)
  3. 使用参数化查询避免注入
  4. 内部app通过content provid交换数据设置protectionLevel=“signature”验证签名
  5. 公开的content provider确保不存储敏感数据
  6. Uri.decode() before use ContentProvider.openFile()
  7. 提供asset文件时注意权限保护

测试方法

drozer:
run app.provider.info -a cn.etouch.ecalendar
run app.provider.query content://##/carriers/preferapn --vertical

 

BroadcastReceiver组件暴露

风险描述

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

危害描述

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

安全建议

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

测试方法

# 发送broadcast,比如在模拟器中发生关机的broadcast
adb shell am broadcast -a android.intent.action.ACTION_SHUTDOWN -c android.intent.category.HOME -n com.andy.androidtest/.ShutdownBroadcastReceiver

 

第三方SDK

风险描述

Sdk自身可能还会存在漏洞。如果这些漏洞被利用,攻击者就能够利用sdk本身存在的强大功能发动恶意的攻击行为。

危害描述

黑客在用户毫无察觉的情况下打开相机拍照,通过发送短信盗取双因素认证令牌,或将设备变成僵尸网络的一部分。

安全建议

对第三方的SDK进行安全测试和评估。

测试方法

###

 

程序可被任意调试

风险描述

安卓AndroidManifest.xml文件中android:debuggable为true。

危害描述

app可以被任意调试。

安全建议

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

测试方法

debug 风险位置: AndroidMannifest.xml 文件 android:debuggable 属性
debug 风险触发前提条件:未将 AndroidMannifest.xml 文件中的 android:debuggable 属性值设为 false
debug 风险原理:其debug属性为true, 允许程序可以在手机上进行调试,那么攻击者就可以在该应用的进程中注入并运行自己的代码。


如果开启了调试模式,使用一下命令查看Dalvik虚拟机监听在模拟器的哪一个端口,在apk运行前后执行进行对比开启的端口
# adb jdwp

比较两次命令执行的结果,发现运行测试应用后多出来的端口,这就是我们测试应用对应的端口,我们需要用JDB去连接该端口
# adb forward tcp:54321 jdwp:多出来的端口

提示:JDWP就是 Java Debug Wire Protocol(Java调试线协议),如果一个应用可被调试,该应用的虚拟机会打开一个唯一端口以便JDB连接调试。Android的Dalvik虚拟机也支持该协议。

jdb -attach localhost:54321 # 连接以后可以进行远程代码注入

查看类的命令: classes
查看 MainActivity$1类中的方法: methods com.example.debug.MainActivity$1
在MainActivity$1.onClick方法中设置断点: stop in com.example.debug.MainActivity$1.onClick(android.view.View)
查看局部变量: locals
执行下一行代码: next
使用”step”命令进入”setText”方法动态修改显示的值: setup
使用”set”命令将”text”变量的值从”Try Again”改为”Hacked”: set text = "Hacked"
执行方法: run

 

程序数据任意备份

风险描述

安卓AndroidManifest.xml文件中android: allowBackup为true。

危害描述

app数据可以被备份导出。

安全建议

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

测试方法

adb backup -f allowBakup.ab -noapk com.handsgo.jiakao.android.system.MyApplication
java -jar ubpack_backup.jar unpack allowBackup.ab allowBackup.tar
tar zxvf allowBackup.tar # 如果是登陆的地方,也许能查看到密码
adb restore allowBackup.ab # 恢复之前数据,如果之前登陆了,打开应用可直接进入

 

SDcard加载dex

风险描述

使用DexClassLoader加载外部的 apk、jar 或 dex文件(如sdcard目录),当外部文件的来源无法控制时或是被篡改,此时无法保证加载的文件是否安全。

危害描述

黑客的代码被自动执行,进一步实施欺诈、获取账号密码或其他恶意行为等危害

安全建议

1. 将所需要动态加载的DEX/APK文件放置在APK内部或应用私有目录中,为了所加载的DEX/APK不被恶意代码注入,建议将要动态加载的DEX/APK放置在APK内部;

2. 使用加密网络协议进行下载加载的DEX/APK文件并将其放置在应用私有目录中,建议使用加密网络协议进行下载并将下载的DEX或APK放置在应用的私有目录;

3. 对不可信的加载来源进行完整性校验;如果应用必须将所加载的DEX或APK放置在能被其他应用人意读写的目录中(如sdcard)或使用没有加密的网络协议进行下载加载源,建议对这些不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入。

测试方法

####

 

编译api/兼容api

风险描述

是指android编译时候使用的API的版本太低,导致产生的一些安全问题;比如针对webview的,17版本之前的是存在漏洞的,17版本之后是不存在漏洞的,不过这个前提也是要看内核;然后针对老版本的API的兼容问题,有很多的自己的判断在里面,比如如果兼容老版本的API,可能会对某些接口进行判断,判断使用的接口是否为存在漏洞的版本,如果存在漏洞的版本就执行##操作之类的。

危害描述

黑客利用低版本的api进行漏洞攻击,从而获取系统权限等

安全建议

1.使用最新版的API

2.对老的API判断是否存在漏洞进行##安全检查和过滤操作

测试方法

####

 

so读写权限

风险描述

Android开发者喜欢将一些核心认证算法等关键功能写在so中,一旦被逆向读取存在安全隐患。

危害描述

黑客利用核心认证算法与系统app通讯或者获取其关键信息操作某些关键性功能

安全建议

混淆,加固,防止黑盒调用。

测试方法

####

 

权限与级别

风险描述

每个应用的功能都有一些权限配置,如果设置不当可能会造成一些安全隐患。

危害描述

恶意的应用直接调用未经权限验证的功能;如摄像头或者电话功能等。

安全建议

对应用的权限和保护级别做严格的设置。

测试方法

####

 

socket加密

风险描述

socket在传输中如果未加密传输,可以被窃取到明文数据信息。

危害描述

黑客在可以直接截获工具获取用户的信息和操作,用来登陆系统篡改数据等。

安全建议

数据加密传输

测试方法

####

 

开放socket端口

风险描述

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

危害描述

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

安全建议

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

测试方法

####

 

配置文件可读

风险描述

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

危害描述

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

安全建议

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

测试方法

####


配置文件可写

风险描述

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

危害描述

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

安全建议

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

测试方法

####

 

配置文件可读可写

风险描述

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

危害描述

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

安全建议

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

测试方法

####


全局文件可读

风险描述

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

危害描述

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

安全建议

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

测试方法

####


全局文件可写

风险描述

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

危害描述

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

安全建议

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

测试方法

####


全局文件可读可写

风险描述

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

危害描述

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

安全建议

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

测试方法

####

 

Webview存在本地Java接口

风险描述

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

危害描述

在targetSdkVersion小于17时,攻击者利用 addJavascriptInterface这个接口添加的函数,可以远程执行任意代码等;另外webview还存在UXSS,明文存储密码,CSP,本地域等弱点。

安全建议

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

测试方法

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>WebView 漏洞检测</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>

<body>
<p>
    <b>如果当前 app 存在漏洞,将会在页面中输出存在漏洞的接口方便程序员做出修改:</b>
</p>
<script type="text/javascript">
    function check()
    {
        for (var obj in window)
        {
            try {
                if ("getClass" in window[obj]) {
                    try{
                        window[obj].getClass();
                        document.write('<span style="color:red">'+obj+'</span>');
                        document.write('<br />');
                    }catch(e){
                    }
                }
            } catch(e) {
            }
        }
    } 
    check();
</script>
</body>
</html>

 

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

风险描述

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

危害描述

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

安全建议

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

测试方法

####


隐式意图调用

风险描述

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

危害描述

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

安全建议

将隐式调用改为显式调用。

测试方法

####


WebView忽略SSL证书错误

风险描述

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

危害描述

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

安全建议

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

测试方法

####


HTTPS关闭主机名验证

风险描述

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

危害描述

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

安全建议

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

测试方法

####


Intent Scheme URLs攻击

风险描述

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

危害描述

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

安全建议

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

测试方法

####


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

风险描述

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

危害描述

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

安全建议

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

测试方法

####


AES弱加密

风险描述

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

危害描述

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

安全建议

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

测试方法

####


Provider文件目录遍历

风险描述

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

危害描述

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

安全建议

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

测试方法

####


activity绑定browserable与自定义协议

风险描述

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

危害描述

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

安全建议

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

测试方法

####


动态注册广播

风险描述

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

危害描述

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

安全建议

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

测试方法

####

 

Fragment注入

风险描述

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

危害描述

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

安全建议

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

测试方法

####


webview启用访问文件数据

风险描述

Webview中使用setAllowFileAccess(true),App可通过webview访问私有目录下的文件数据。

危害描述

在Android中,mWebView.setAllowFileAccess(true)为默认设置。当setAllowFileAccess(true)时,在File域下,可执行任意的JavaScript代码,如果绕过同源策略能够对私有目录文件进行访问,导致用户隐私泄漏。

安全建议

使用WebView.getSettings().setAllowFileAccess(false)来禁止访问私有文件数据。

测试方法

####


unzip解压缩(ZipperDown)

风险描述

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

危害描述

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

安全建议

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

测试方法

####


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

风险描述

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

危害描述

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

安全建议

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

测试方法

####


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

风险描述

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

危害描述

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

安全建议

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

测试方法

####


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

风险描述

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

危害描述

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

安全建议

对传入的参数进行严格的过滤。

测试方法

####


随机数不安全使用

风险描述

调用SecureRandom类中的setSeed方法。

危害描述

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

安全建议

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

测试方法

####


FFmpeg文件读取

风险描述

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

危害描述

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

安全建议

升级FFmpeg库到最新版。

测试方法

####


libupnp栈溢出漏洞

风险描述

使用了低于1.6.18版本的的libupnp库文件。

危害描述

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

安全建议

升级libupnp库到1.6.18版本或以上。

测试方法

####


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

风险描述

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

危害描述

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

安全建议

targetSDKVersion使用大于17的版本。

测试方法

####


AES/DES硬编码密钥

风险描述

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

危害描述

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

安全建议

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

测试方法

####

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值