Android安全测试规范
伴随着Android app的越来越多的应用,关于Android app的安全漏洞也在不断地出现,在面对一个安卓应用时,如何对它进行安全测试,本文将对安全测试方面进行一些介绍。
安装包测试
安装包反编译测试
用例风险:源代码未做混淆使攻击者很轻易反编译出源代码导致代码泄漏风险。
执行步骤:使用反编译工具打开应用,如发现代码内未经过混淆,就说明存在应用可进行反编译,记录漏洞,停止测试。
预期结果:安装包中核心模块与敏感数据经过加密或者混淆
整改建议:建议使用Proguard
等工具对源码进行进一步混淆,避免造成源码泄漏。
安装包签名测试
用例风险: Android
签名机制是一种有效的身份标识,为了保证应用不被恶意修改后重新发布,需要检查应用签名是否有保护机制。
执行步骤
- 解压缩安装包
.apk
文件后,删除META-INF/
目录下的xx.RSA
和xxx.SF
文件 - 使用自己的私钥对删除过后的
apk
文件进行重新签名,首先生成自己的私钥
1 | `keytool -genkey -v -keystore [keystore路径] -alias [密钥别名] -keyalg RSA -keysize 2048 -validity [有效天数]` |
- 然后对
apk
进行二次签名,签名命令格式如下
1 | jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystore名称] [apk文件] [密钥别名] |
-sigalg
:签名算法名称-digestalg
:信息摘要算法-keystore
:签名文件
执行签名命令
1 | jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore android.keystore kaoyan.apk android.keystore |
- 安装重新签名后的apk文件,查看应用是否具有保护机制阻止程序运行。
预期结果: 更换签名后,触发应用防御机制,应用无法启动或提示
整改建议: 内部代码实现apk
二次打包鉴别机制,在程序运行时校验apk
签名是否由官方私钥签名而来。
应用权限测试
用例风险:应用权限分配不合理,可能导致用户隐私数据泄露。
执行步骤
- 使用反编译工具反编译
- 打开源码后,检查应用
AndoridManifest.xml
文件,将应用权限和业务功能需要权限做对比,检查申请应用权限是否大于业务需要权限,有即存在安全隐患。
预期结果:应用申请合理的系统权限
整改建议:为应用分配合理的系统权限
AllowBackup开启
用例风险:当allowBackup
标志值为true
时,即可通过adb backup
和adb restore
来备份和恢复应用程序数据,导致应用数据泄露。
执行步骤
- 打开
AndroidManifest.xml
文件; - 检查应用
AndoridManifest.xml
文件中的配置是否为:android:allowBackup="true"
,即为allowBackup
开启,记录漏洞,停止测试。
预期结果:AllowBackup
关闭
整改建议:在AndroidManifest.xml
文件设置allowBackup
属性值为False
。
备注:allowBackup
属性未配置时默认为true
debuggable开启
用例风险:当debuggable
标志值为true
时,即表示是App
可调试的,存在安全泄露风险。
执行步骤
- 打开解析的
AndroidManifest.xml
文件; - 检查应用
AndoridManifest.xml
文件中的配置是否为:android: debuggable="true"
,即为debuggable
开启。
预期结果 debuggable
关闭
整改建议 在AndroidManifest.xml
文件设置debuggable
属性值,其默认值为false
备注 Debuggable
属性未配置时默认为false
弱加密算法审查
用例风险
使用弱加密算法会大大增加黑客攻击的概率,黑客可能会破解隐私数据、猜解密钥、中间人攻击等,造成隐私信息的泄漏,甚至造成财产损失。容易被破解的加密算法被称为弱加密算法,例如可以使用穷举法在有限的时间内破解DES
算法。
执行步骤
- 使用反编译工具进行反编译
- 打开源码后,查找代码中的敏感数据和敏感函数加密代码,是否使用
DES
弱加密算法,弱加密代码样例:
1 | SecretKeySpec key = new SecretKeySpec(rawKeyData, "DES"); //指定加密方式 |
RSA中
加密不使用Padding
:RSA
加密常用的填充模式有三种:
RSA_PKCS1_PADDING
RSA_PKCS1_OAEP_PADDING
RSA_NO_PADDING
使用RSA
公钥时通常会绑定一个Padding
,原因是为了防止对RSA
算法的攻击。风险代码样例如下: 扩展资料:RSA填充模式
1 | Cipher rsa = null; |
- 使用了不安全的密钥长度,如下演示代码所示密码长度为
512bits
常用的密钥长度有
1024bits
,2048bits
等,使用RSA
加密时,建议密钥长度大于1024bit
1 | public static KeyPair getRSAKey() throws NoSuchAlgorithmException { |
- 使用了不安全的加密模式,如下示例代码中
AES
加密使用了ECB模式
。
ECB
模式是最简单的模式,在其中明文和密文是一一对应的,相同的明文会被加密为相同的密文,这样可以通过观察密文得到明文中重复的组合,并以此为线索来破解密码。
1 | SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); |
预期结果:系统未使用包含风险的加密算法
整改建议
- 使用对称加密算法时避免使用
DES
算法 - 使用
RSA
算法加密时不使用NoPadding
- 在选择加密模式时避免使用
ECB
模式 - 使用
RSA
加密时,建议密钥长度大于1024bit
数据传输测试
敏感信息明文传输
用例风险:如果在传输过程中未对敏感数据进行加密传输,存在被恶意攻击者通过网络窃听等手段获取网络数据包中的敏感数据的威胁。
执行步骤
- 安装应用后,触发应用功能。
- 同时开启抓取数据包工具(如
Charles
),查看数据包中是否明文包含:用户名密码、IP
地址、SIM
序列号,或其他用户、系统等敏感信息。 - 如发现代码内包含以上信息,就说明存在应用中存在敏感数据,记录漏洞,停止测试。
预期结果:传输的数据包中未包含敏感信息
整改建议:确保包含重要敏感信息的数据均已加密的形式或者以https
形式传输。
Java层ssl中间人攻击漏洞
用例风险
在密码学和计算机安全领域中,中间人攻击(Man-in-the-middle attack
,缩写:MITM
)是指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。
执行步骤
- 使用反编译工具打开应用,反编译出应用源码。
- 在源码中搜索类似写法:
1 | public class SSLSocketFactory_poc extends SSLSocketFactory { |
- 检测代码中是否实现域名判断逻辑,未实现域名判断逻辑的代码如下:
1 | HostnameVerifier hostnameVerifier = new HostnameVerifier(){ |
- 检测代码中是否允许所有域名,允许所有域名的代码如下:
1 | SSLSocketFactory sf = new SSLSocketFactory_poc(null,trustStore); |
- 如果在使用证书的时候,像示例代码中的写法类似,未进行域名相关判断、允许所有域名的证书,则风险存在。
预期结果:在使用证书的时候进行相关校验
整改建议:建议开发者对SSL
证书进行强校验,包括证书是否合法、主机域名是否合法和证书的有效期。
数据存储测试
日志中包含敏感信息
安全风险
如果日志中包含用户信息、业务信息,攻击者可以通过抓取日志,搜集整理大量的有用信息。比如有时研发开发时为了调试方便会添加一些debug
日志,如果在打正式发布包时不将这些log
去掉那么很容易泄漏敏感信息。
执行步骤
- 安装应用后,对应用进行使用。
- 同时使用
adb logcat | find "com.youku.phone"(包名)"
捕获输出的日志 - 还可以使用命令
adb logcat | find "com.youku.phone" >C:\Users\Shuqing\Desktop\log.txt
将日志保存到指定文件。 - 如果输出的日志中包含敏感信息,记录漏洞,停止测试。
预期结果:日志中不包含敏感信息
整改建议:为了防止信息泄漏,不要在日志中输出敏感数据
敏感数据明文存储
安全风险:敏感数据明文存储在手机上增加了信息泄露的风险
执行步骤
- 使用软件(如:好压)打开
apk
安装文件查找是否明文存储用户信息、业务数据、服务信息或其他敏感信息。 - 如果存在,记录漏洞,停止测试。
预期结果:文件中未存放用户或系统敏感信息
整改建议:如果一定要在客户端存放系统敏感数据,建议加密后再存储。
安装文件权限检测
安全风险:应用文件被分配了不合理的权限,导致其他应用可以读取和获取文件内容,增加了内容泄露的风险。
执行步骤
- 使用
adb shell
连接设备 - 进入应用目录
cd /data/data/xxxx(包名)
- 执行命令
ls -al
,查看当前目录下所有文件权限。 r
代表只读,w
代表写,x
代表可执行,d
表示是一个目录。- 文件权限为:文件主-组用户-其他用户
预期结果:
- 目录权限为
drwxrwx--x
,允许多一个执行位x
- 文件权限最后三位应为空(类似
-rw-rw----
),即除应用自己以外任何人无法读写;
整改建议
- 避免使用
MODE_WORLD_WRITEABLE
(可写)和MODE_WORLD_READABLE
(可读)模式创建进程间通信的文件,如果需要与其他进程应用进行数据共享,请考虑使用content provider
; - 避免使用
MODE_PRIVATE
模式创建内部存储文件,默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。 - 避免将密码等敏感数据信息明文存储在文件中;为文件使用合适的权限。
数据库敏感数据泄露
安全风险:敏感数据直接存储在sqlite
数据库导致信息泄露的风险。
执行步骤
- 使用进入应用安装文件目录
/data/data/[package name]/databases/
,查找sqlite
数据库文件并复制到PC端 - 使用
DB.Browser.for.SQLite
打开sqlite
文件。 - 查看或检索文件中是否存在用户信息、业务数据、服务系统信息或其他敏感信息。如果存在,记录漏洞,停止测试。
预期结果:客户端数据库文件中不存在敏感数据。
整改建议:如果一定要在客户端存放系统或系统敏感数据,建议加密后再存储。
本地数据库注入/文件遍历检测
安全风险:获取或者篡改app中存储的敏感信息,如手机号、账号、密码等,在业务运行操作时无法保证数据安全。
执行步骤
- 启动
drozer
连接测试设备 - 获取开放的provider:
run app.provider.info -a appname
- 查找可用的URI:
run scanner.provider.finduris -a appname
- 执行SQL注入检测
run scanner.provider.injection -a appname
- 执行文件遍历检测
run scanner.provider.traversal -a appname
预期结果 无法获取到相关数据信息。
整改建议 使用参数化查询防御SQL
注入,限制Provider
组件的权限,取消不必要的Provider
组件接口。
WebView组件安全测试
WebView
是Android
系统提供能显示Web
页面的系统控件,例如混合类型的App
中H5
界面就是使用了WebView
组件。
WebView远程代码执行漏洞
安全风险:Webview中接口addJavascriptInterface
可通过webview
对象向页面javascript
导出java
本地接口,可能导致任意命令执行。
执行步骤
- 使用反编译工具打开应用,反编译出应用源码。
- 在源码中搜索类似写法:
1 | settings.setJavaScriptEnabled(true); //设置开启javascript |
- 如果源码存在上面代码,那么该处就可能存在
Web
组件远程代码执行的风险。 - 如果存在该风险,将会在该页面中显示出存在问题的接口。
预期结果:系统使用安全接口调用webview
整改建议
- 建议禁用危险接口
addJavascriptInterface
导出Java
类及方法,并加强访问的url
的域控制; - 严格控制导出方法的权限,避免越权操作;
WebView密码明文保存漏洞
安全风险
- 在使用
WebView
的过程中开启了setSavePassword
保存密码,当用户在WebView
中输入的用户名和密码,则会被明文保存到应用。 - 用户数据保存到目录的
databases/webview.db
中。 - 如果手机被
root
就可以获取明文保存的密码,造成用户的个人敏感数据泄露。
执行步骤
- 使用反编译工具打开应用,反编译出应用源码。
- 在源码中搜索类似写法:
1 | mWebView.getSettings().setSavePassword(true); //设置开启保存密码 |
- 则说明风险存在,记录漏洞,停止测试。
预期结果:在调用setSavePassword
时设定setSavePassword(false)
整改建议:使用WebView.getSettings().setSavePassword(false)
来禁止保存密码
WebView组件忽略SSL证书验证错误漏洞
安全风险
Android WebView
组件加载网页发生证书认证错误时,会调用WebViewClient
类的onReceivedSslError
方法,如果该方法实现调用了handler.proceed()
来忽略该证书错误,则会受到中间人攻击的威胁,可能导致隐私泄露。
执行步骤
- 使用反编译工具打开应用,反编译出应用源码。
- 在源码中搜索类似写法:
1 | mWebView.getSettings().setJavaScriptEnabled(true); |
- 如上所示代码在
onReceivedSslError
处理时没有进行cancel
,还是使用了proceed()
,忽略掉了发生的SSL
异常。则说明风险存在。记录漏洞,停止测试。
预期结果:正确的处理SSL
错误,避免证书错误的风险。
整改建议:当发生证书认证错误时,采用默认的处理方法handler.cancel()
,停止加载问题页面。
Broadcast组件安全测试
空广播造成Broadcast组件拒绝服务
安全风险:攻击者可以发送恶意的消息,控制Receiver
执行恶意动作或者造成信息泄露。
执行步骤
- 使用工具
Drozer
扫描暴露的broadcast
组件run app.broadcast.info -a xxxx -i
和相关action
信息 - 尝试向应用程序的
receiver
组件发送空值,run app.broadcast.send --action xxx
,查看是否能够造成应用程序崩溃,形成拒绝服务。
预期结果 系统为Broadcast
组件分配了适当权限。
整改建议 AndroidManifest.xml
文件的各receiver
标签中,设置android:exported="false"
;BroadcastReceiver
代码中增加消息异常处理机制。
未指定接收组件造成信息泄露
安全风险
应用程序在广播包含敏感信息的消息时,由于未指定具体的接收组件,攻击者可能仿冒receiver
来接受来自应用程序的消息,从而窃取敏感信息。
执行步骤
- 反编译
apk
获取源代码,在源代码中搜索定位发送广播消息的位置,例如搜索sendBroadcast()
。 - 查看在新建
Intent
时,是否显式指定了接收该广播的组件名称,以及要发送的广播中是否包含敏感信息。 示例代码如下:
1 | public class ServerService extends Service { |
3、 如果应用程序未指定接收组件并且广播中包含类似password
等信息,则存在信息泄露的风险。
预期结果 :显式的制定接收组建、并且分配了合适的权限
整改建议
- 通常采用的安全方式有设置指定
action
与包名
1 | intent.setAction("allow.package.recv.action"); //设置指定的action |
如果指定特殊的receiver
接收可以指定component
:
1 | intent.setComponent(newComponentName("allow.package.recv.packagename", "allow.package.recv.classname")); |
广播如果是APP内部使用,使用
LocalBroadcastManager
,使广播的Intent
仅在该进程内部,而不会让同一APP
的其他进程或者其他APP
接收到。避免使用如下
API
:
sendStickyBroadcast
sendStickyBroadcastAsUser
sendStickyOrderedBroadcast
sendStickyOrderedBroadcastAsUser
Android SDK
文档中也明确说明了存在安全问题, 如果必须使用,广播中不应包含敏感信息,另外需要设置接收权限:
1 | //设置广播权限 |
同时在AndroidManifest.xml
中如下配置:
1 | <uses-permission android:name="broadcast.permission" /> |
android:protectionLevel
为signature
,防止其他APP能够非常容易的窃取权限。
Broadcast组件越权漏洞
安全风险:攻击者可以发送恶意的消息,控制Receiver
执行恶意动作或者造成信息泄露。
执行步骤
- 反编译后检索
registerReceiver()
,查找动态广播接收器。也可以使用命令:
1 | run app.broadcast.info -a com.xxxx -i |
- 同时留意
android:exported="true"
权限的组件。 - 在源代码中搜索
receiver
,找到应用程序定义的在接收到消息时的各项参数以及各种处理逻辑。 - 查看业务逻辑寻找是否能够直接调用
Broadcast
组件,是否越权进行操作。
预期结果:合理分配Broadcast
组件权限
整改建议:
AndroidManifest.xml
文件的receiver
标签中设android:exported="false"
。- 或者在
AndroidManifest.xml
中,申明一个私有权限,级别为signature
; - 私有广播接收器设置
exported='false'
,并且不配置intent-filter
,对接收来的广播进行验证;
Activity组件安全测试
绕过认证调用activity
安全风险:攻击者可以绕过认证阶段,直接调用后续activity
组件。
执行步骤
- 反编译查看配置文件
AndroidManifest.xml
中activity
组件(关注配置了intent-filter
的及未设置export=“false”
的组件)。 - 可使用工具
Drozer
扫描暴露的Activity
:run app.activity.info -a packagename
- 执行命令
run app.activity.start --component 包名 Activity名
- 查看在未经登录的情况下,登录之后的
Activity
能否被正常显示,如果可以则会形成越权、信息泄露等风险。
预期结果 设定正确的activity
权限,避免造成越权或信息泄露。
整改建议
- app内使用的私有
Activity
不应配置intent-filter
,如果配置了intent-filter
需设置exported
属性为false
; - 谨慎处理接收的
intent
以及其携带的信息,当Activity
返回数据时候需注意目标Activity
是否有泄露信息的风险;
隐式启动intent包含敏感数据
安全风险
APP创建Intent
传递数据到其他Activity
,如果创建Activity
时通过addFlags
设置了FLAG_ACTIVITY_NEW_TASK
,Activity
会在另一个Task
中打开,
这种情况很可能被其他的Activity
劫持读取到Intent
内容,跨Task
的Activity
通过Intent
传递敏感信息是不安全的,会导致intent
中的敏感数据泄露。
执行步骤
- 使用反编译工具打开应用,反编译出应用源码。
- 在源码中查找以下示例源码(主要是
FLAG_ACTIVITY_NEW_TASK
标签):
1 | Intent intent = new Intent(); |
- 如果
FLAG_ACTIVITY_NEW_TASK
标签就存在该风险,记录漏洞,停止测试
预期结果:不包含FLAG_ACTIVITY_NEW_TASK
标志的Intent
启动Activity
整改建议:避免使用包含FLAG_ACTIVITY_NEW_TASK
标志的Intent
启动Activity
Content Provider组件测试
Provider组件导致信息泄露
安全风险: 攻击者可以利用开放的Provider Content
获取系统敏感资源
执行步骤
- 查看
AndroidManifest.xml
文件,定位各Provider
,尤其是设置了android:exported="true"
的。 - 可使用工具
Drozer
扫描:run scanner.provider.finduris -a com.mwr.example.sieve
- 如果存在
Accessible content URIs
说明存在注入风险。
预期结果:系统为Content Provider
组件分配合适的权限,不存在信息泄露。
整改建议
AndroidManifest.xml
文件的各provider
标签中,设置android:exported="false"
;- 设置
minSdkVersion
不低于9
; - 内部app通过
content provider
交换数据设置protectionLevel=“signature”
验证签名,仅授予那些和本程序应用了相同密钥来签名的程序 - 公开的
content provider
确保不存储敏感数据;
文件遍历漏洞
安全风险
APP的实现中定义了一个可以访问本地文件的Content Provider
组件,默认的android:exported="true"
,该Provider
实现了openFile()
接口
通过此接口可以访问内部存储app_webview
目录下的数据,由于后台未能对目标文件地址进行有效判断,可以通过"../"
实现目录跨越,导致对任意私有数据的访问。
执行步骤
- 使用
drozer
命令扫描run scanner.provider.traversal -a com.mwr.example.sieve
- 扫描结果中存在
Vulnerable Providers
说明存在文件遍历风险。
预期结果:不存在文件遍历漏洞。
整改建议:系统对在调用文件参数时添加防御。
Service组件测试
Service组件越权漏洞
安全风险:攻击者可以发送恶意的消息,控制Service
执行恶意动作或者造成信息泄露。
执行步骤
- 使用
drozer
命令run app.service.info -a xxxx
查看service
组件暴露。 - 通过定位的
service
,找到应用程序定义的在接收到消息时的各项参数以及各种处理逻辑。 - 查看业务逻辑寻找是否能够直接调用
Service
组件,能否能进行越权操作。如果可以风险存在,停止测试,记录漏洞。
预期结果 系统为Service
组件分配了适当权限
整改建议
AndroidManifest.xml
文件的各receiver
标签中,设置android:exported="false"
。- 或者在
AndroidManifest.xml
中,申明一个私有权限,级别为signature
; - 只被应用本身使用的
service
应设置为私有; - 尽量不发送敏感信息,在
service
接收到的数据需需谨慎处理,对调用的接口做校验;
空广播造成Service组件拒绝服务
安全风险:攻击者可以发送恶意的消息,控制Receiver
执行恶意动作或者造成信息泄露。
执行步骤
- 查看
AndroidManifest.xml
文件,定位各Receiver
,尤其是设置了android:exported="true"
的。 - 尝试调用服务组件,
run app.service.start --action 服务名 --component 包名 服务名
,查看是否能够造成应用程序拒绝服务。
预期结果:系统为Service
组件分配了适当权限
整改建议:AndroidManifest.xml
文件的各组件标签中,设置android:exported="false"
;
组件接收消息代码中增加消息异常处理机制。
备注:其他类型的拒绝服务攻击参考SEC_AN_ PLUS_11.1 intent
应用本地拒绝服务漏洞。
intent应用本地拒绝服务漏洞
安全风险
Android
系统中提供了Intent
机制来协助应用间的交互与通讯,例如:应用A
发出一个intent
信息,系统根据intent
的描述,负责找到可以解析该intent
消息的应用B
。
B
应用负责接收intent
的组件,在解析intent
数据时,会通过Intent
的getXXXExtra()
函数,如果解析为空数据、异常、或是畸形数据,就可能会导致程序崩溃。
执行步骤
- 攻击者向
Intent
传入自定义的序列化对象,被攻击者在组件里解析该序列化数据,可能出现出现找不到类出现ClassNotFoundException
异常而崩溃。攻击代码如下:1
2
3
4
5Intent intent = new Intent();
intent.setAction("serializable_action");
intent.setClassName("com.my.test", "com.my.test.MainActivity"); // 指定攻击目标的包名和Activity入口
intent.putExtra("serializable_obj",XXX); //此处是传入畸形数据
startActivity(intent);
- 数组越界
IndexOutOfBoundsException
异常导致的拒绝服务,如果程序没有对getIntegerArrayListExtra()
等获取到的数据数组元素大小的判断,从而导致数组访问越界而导致应用崩溃;
攻击应用代码片段:
1 | Intent intent = new Intent(); |
预期结果:在使用Intent
获取数据时对异常做了充分的处理。
整改建议
建议处理通过Intent.getXXXExtra()
获取的数据时进行以下判断,以及用try catch
方式进行捕获所有异常,以防止应用出现拒绝服务漏洞:
- 空指针异常;
- 类型转换异常;
- 数组越界访问异常;
- 类未定义异常;
- 其他异常;
开放网络服务安全测试
安全风险
Android应用通常使用PF_UNIX、PF_INET、PF_NETLINK
等不同域名的socket
来进行本地进程间通信或者远程网络通信,这些socket
暴漏了潜在的本地或远程攻击面,历史上也出现过不少利用socket
进行拒绝服务、root
提权或者远程命令执行的案例。
特别是PF_INET
类型的网络socket
,可以通过网络与Android
应用通信,其原本用于linux
环境下开放网络服务,由于缺乏对网络调用者身份或者本地调用者的安全检查机制,在实现不当的情况下,可以突破Android
的沙箱限制,对被攻击的应用执行命令,导致比较严重的漏洞。
执行步骤
- 使用反编译工具打开应用,反编译出应用源码。
- 检测对收到
socket
数据是否进行处理,代码示例如下:
1 | //定义读取socket命令 |
- 如果出现类似以上代码,未对接收到的
socket
和内容做任何校验检查,则风险存在。
预期结果 对socket
数据内容进行校验。
整改建议 直接传递命令或者间接处理敏感信息时,避免使用socket
实现。
运行其它可执行程序风险
安全风险
APP中使用了有运行其他程序的代码逻辑,如果执行的代码是第三方库中,可能会存在未知的恶意行为,如果是程序自身代码,若调用逻辑有缺陷可能会导致执行其他恶意的第三方程序,攻击者可能会利用该缺陷执行恶意代码。
执行步骤
- 使用反编译工具打开应用,反编译出应用源码。
- 在源码中查找使用
Runtime.getRuntime().exec
执行第三方程序的代码样例:
1 | try { |
- 发现使用
Runtime.getRuntime().exec
执行第三方程序后,且检测到调用逻辑中存在缺陷,则风险存在。停止测试,记录漏洞。
预期结果 合理使用Runtime.getRuntime().exec
等函数,防止恶意调用。
整改建议 合理设置程序逻辑防止恶意调用,如果该行为是非期望行为,移除相关代码。
数据的完整性进行校验
安全风险
App向服务器提交的数据易被中间人篡改,对用户数据的完整性造成影响,如用户信息被破解利用等问题。
执行步骤
- 使用
Charles
代理工具连接设备代理,启动app,正常操作app; - 在app上对提交的数据进行修改,重新提交,查看这些参数的值有无变化;
- 对获取数据包参数进行修改并重放,查看是否可正常返回;
- 若数据正常返回,没有提示数据错误,说明app请求参数未进行完整性校验。
预期结果:请求数据中包含完整性校验字段;
整改建议:添加完整性校验逻辑。
键盘劫持测试
安全风险:
攻击者可以通过劫持键盘窃取用户输入数据,可能带来用户账号密码、敏感数据等泄露的风险,特别是银行金融类App。
执行步骤
- 打开应用,选择一处输入点进行输入
- 观察应用程序是否打开自带键盘,如果使用系统键盘输入,则问题存在。记录漏洞,停止测试。
预期结果:App在输入时使用自带键盘
整改建议:在App内集成自带键盘,并采用随机分布式键盘。