移动安全测试 腾讯专家教你如何保证应用开发安全

安卓绿色联盟 · 2017年12月01日 · 1295 次阅读

APP 开发者在开发过程中会遇到各种各样的安全问题,出现安全问题的原因多种多样,安卓绿色联盟为解决这些安全问题制定了统一的应用安全标准。

安全问题,可以按照不同的纬度进行归纳,一个是 APP 漏洞、系统的漏洞以及常见的服务器通信协议项的漏洞等;对于攻击手段,可以分为本地攻击、远程攻击或者是基于一些硬件设备的进场攻击;对于攻击的方法,可以植入一些恶意代码,盗取你的隐私信息,比如常见的账号密码。常见的还有游戏以及微信红包的外挂等等,这些都属于移动安全的一些特征。

1、应用程序的基础安全

在应用程序基础安全方面有几种问题:

第一种是 Debug 状态被关闭,Debug 是用来调试的一种开关,谷歌对 Debug 也做了一些升级,在发布状态 Debug 要进行关闭,在一些非 root 手机上,拥有 Debug 开关也可以进行一些调试。调试就是黑客或者是恶意竞争者,去逆向你的应用程序,去发现应用程序中的漏洞或者是一些潜在的安全问题,是安全的一个入口点,所以我们要避免我们的应用程序要被这样的一个逆向或者是动态调试。打开 Debug 开关我们可以通过 USP 进行动态调试,这种调试不是对抗调试的唯一方法,我们可以通过 “从打包” 或者是通过修改 Mainfest 文件进行从打包去达到类似的效果。



第二个是基础属性的 backup 配置,这个跟谷歌开始的系统策略有关系,之前 backup 存在一些系统漏洞,导致一些恶意的攻击程序可以在不授权的情况下去 APP 进行一些备份,这些备份包括私有目录下的一些文件,通过这些备份导致一些隐私信息泄露。

第三个是比较严重的问题,就是 log 的开关。在安卓的版本里面 log 的信息是普通的 APP 都会访问到,后来安卓系统升级以后,log 信息就无法被 APP 看到,现在我们分析的过程中发现很多 APP 的 log 信息没有完全关掉,黑客在去进行分析的时候,log 信息会大大降低黑客分析的难度,在关键函数的插装打点,去输入这些关键信息,就很容易获得相应的逻辑。所以我们应尽可能在 release 版本把这些信息全部关掉。

第四个就是代码混淆,初级的混淆比较常见,但是对于一些核心功能来说,简单的混淆还是远远不够的,就像现在应用的加固,就是为了保证核心的逻辑以及核心业务,避免被轻易逆向,比如一些协议以及安全漏洞,我们除了要做一些简单混淆以外还要做一些调试的检测,对一些核心的代码做一些核心的处理,来提升逆向分析的强度。

案例分析:

情况一:有一些 APP 在 log 里面直接把你登录的账号密码或者其他一些关键信息直接输出来了,这种东西给人的感觉安全性非常低。还有就是通过 log 信息看到很多业务逻辑。

注意事项:
1、关闭 Debug 模式
2、关闭 Allow Backup 模式
3、删除 Log 代码
4、代码进行混淆
5、代码进行加固和反调试

2、安卓开发里面常用的四大组件安全

对于四个组件,最核心的问题就是组件的导出属性未关闭以及有效的控制。导出属性对于开发来讲,一个组件或者 activity,在没有关闭导出属性的时候,外部开发者很容易可以直接调到,尤其是远程的 sevice;对于一些重要的、功能性 APP,导出的 sevice 可能会导致一些严重的问题。

还有一个问题就是导出的组件没有做有效的参数校验,这经常会导致应用 crash,另外一种可以通过构造异常数据可以进行一些代码注入,我们除了要做一个导出的属性判断之外,我们还要对传入的参数做一个严格的校验,为了避免应用 crash,或者是导出的出口去的代码做一些恶意输入。

另外一个就是组件的隐式调用,直接通过组件的隐式调用系统会有相应的提示,对于一些系统应用来说,在开发的过程中尽可能避免使用隐式调用组件,通过明确设定包名的方式避免隐式调用的使用。

隐式调用会导致一些恶意程序的调用,通过隐式调用的方式创建 activity 或者一个 service 属性,会导致调用恶意 sevice 的后果。

最后一个就是 Broadcast 对外广播以及接受外部广播的组件,安卓系统本身的广播组件只是做一个简单的消息分发,在手机使用的过程中,通畅会用广播来传递一些关键数据,比如说登录的账号密码或者是需传递的隐私数据,对于广播的使用相对于 activity 以及 sevice 来说更不规则,对于系统使用的内部广播以及需要在广播上添加的权限等行为都需要进行规范。

通过广播组件可能会触发 APP 里面一些不正常的流程或者导致广播中间传递的信息泄露。

注意事项:

1、除非必要,不要对外导出任何组件,尤其是默认导出的;
2、对外导出的组件,已经要对输入输出的参数进行判断;
3、动态注册的广播要注意对外还是对外(LocalBroadcastManager);
4、调用外部组件尽量不适用隐式调用;
5、不指定 taskAffinity 和 lunchMode,可能导致 Intent 泄露;
6、对外导出的 service,要严格的判断接入者身份;
7、组件使用权限限制的时候要使用高权限;

3、文件操作安全

文件的操作一般分私有的、public 以及全局可读写的三个属性,在做代码处理的时候由于对文件属性的不注意导致文件出现权限问题,从而导致一些隐私泄露以及可外部修改文件造成运行异常。

重要的文件存放在 SD 卡上,对于放在 SD 卡上的数据需要做一个严格的判断,进行相应的分级与校验。如果未对 SD 存放的数据进行有效区分会导致数据动态加载的过程中被恶意窜改。

*注意事项: *
1、私有目录下的文件操作的权限
2、重要数据不要放到 SD 卡上
3、重要的数据需要加密保存

4、浏览器使用安全

APP 常用的浏览器主要是 webview,浏览器的安全问题主要是系统提供的 webview 本身的一些安全性导致的,这里面常见的问题有:
FILE 域未做限制导致执行任意代码,如果不去做 FILE 域的检测,当用 Webview 加载一些本地的静态页面,加载了一些有恶意代码的 JS 文件,可能会通过 FILE 域加载 databases 下面的一些私有文件,导致应用程序隐私数据泄露。

Http 域跨 File 域未做限制,通过 JS 反调 Java 层的一些代码,导致应用程序隐私数据的泄露。

AddJavaScriptInterface 系统漏洞会导致远程任意代码执行

AddJavaScriptInterface 系统漏洞, 默认的 JS 接口,导致远程任意代码的执行;

FILE 域处理符号链接同源策略绕过漏洞、XSS 注入攻击导致了隐私的泄露。

注意事项:
1、尽量不要使用内置浏览器,漏洞比较多;
2、不要开启 JavaScript 属性;
3、过滤 File 域操作;
4、关闭浏览器对本地文件的操作;

5、联网安全

使用 http 协议传送隐私数据会导致数据可以被轻易拦截修改。

使用 https 未做证书校验导致黑客通过中间人攻击(MITM),替换用户访问的目标地址,使得 https 失去校验功能。

中间人攻击 ARP(Address Resolution Protocol,地址解析协议)是一个位于 TCP/IP 协议栈中的网络层,负责将某个 IP 地址解析成对应的 MAC 地址,常见的中间人攻击包括 wifi 破解,免费 wifi,公共 wifi 等网络环境的宽松,还有就是各种工具开源代码泛滥(dSploit)。

注意事项:
1、尽量不要使用明文传输重要数据;
2、TrustManager/HostnameVerifier 要正确设置;
3、路由器安全监测;

6、数据库操作安全

数据库明文存储重要数据会导致数据库中重要数据的泄露。

数据库文件读写权限的错误也会导致数据库重要数据的泄露。

数据库接口不当导致 SQL 注入将导致数据库重要数据的泄露。

注意事项:
1、数据库文件的存储在私有目录下;
2、重要的数据库内容需要加密保存;
3、数据库对外接口的安全;
4、数据库防注入以及参数校验;

7、加密安全

常用加密算法:
1、对称加密: AES/DES/RC4/3DES
2、非对称加密:RSA/ECC
3、基于口令加密:PBE
4、摘要/哈希/散列函数: MD5/SHA1

加密算法的选择:
特别重要的用户数据加解密/签名验证 PBE
本地加解密/签名验证 对称加密
客户端/服务端通信加解密/签名验证 非对称加密

注意事项:
1、当指定的加密算法时显式指定加密模式和填充方式;
2、使用健壮的算法;
3、当使用基于密码的加密算法时不能将密码存储在设备中;
4、使用密码生成 key 时记得加盐;
5、当使用密码生成 key 时指定哈希迭代次数;
6、强制增加密码强度;

8、如何提高 APP 安全性

1、进行相关的安全审计或者安全开发培训,提高开发者安全意识;
2、注意 eclipse 中的 warning;
3、使用外部审计工具进行安全扫描,或者引入其他的安全服务;
4、关注乌云等漏洞论坛中白帽子发现的问题;
5、业务安全以及相应的逻辑检测;

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册