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


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、业务安全以及相应的逻辑检测;


发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>