浅谈Android应用保护(零):出发点和背景
近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点。各种新的思路和玩法层出不穷。所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章。
这5篇文章主要关注客户端代码和数据的保护,介绍了几种针对Android应用的逆向分析、攻击和防护的方法。内容比较浅显,适合没有Android安全研究背景的同学入门和科普阅读。
无线端应用对抗的出发点和背景
根本上来说,手机客户端是完全控制在使用者手上的,是不可信的,不应该依靠客户端来实现任何安全、逻辑、业务相关的控制。客户端应该是极“瘦”的,不做任何安全相关的逻辑上的操作和判断,不存储敏感信息,甚至像浏览器一样简单,所有逻辑都由服务端处理然后下发结果。
1.为了用户体验,本地必须保存登陆者的认证信息,避免每次打开都需要输入密码登录
2.为了用户体验和减少服务器负载,展示给用户的页面大多需要本地绘制
3.有一部分安全逻辑必须由本地控制,如本地手势密码的设置和验证
所以必须要赋予本地客户端部分安全相关和逻辑控制相关的功能。而这些功能和逻辑一旦在本地客户端实现,就一定会面临着请求伪造、逻辑篡改、代码泄露等的风险。(可以类比于B/S架构中的以Js为代表的本地脚本:Js在本地运行,可能会被修改、注入、绕过,Js代码会被攻击者直接看到)。
不过好在安全本身就不是绝对的,是和场景和价值结合起来讨论的。如果能通过一些方法,让应用分析者分析应用的难度提升到一个非常高的水平,或者说让应用分析者分析的过程消耗的资源大于其成功之后获得的回报,再或者说是让应用逆向分析、攻击者获得的成果对用户的资金和安全感的造成的影响很小到可以忽略的话,我们也可以认为是安全的。
无线客户端分析和保护的出发点就是基于上述背景。实现逻辑的控制和绕过,敏感数据的加密和窃取等。在应用攻防中,双方各有优劣。无线应用因为自身所能做的事情有限,在防御中是处于劣势地位。
攻防
攻击者可以使用root权限,可以使用特殊构造的操作系统(TaintDroid等),可以获取并修改应用的动态代码(Xposed,cydia substrate)、系统的环境(Xposed),可以修改重打包应用的静态代码(smali/baksmali/dex2jar)。
而在在防御中,开发者为了保护自己的应用,也相应采取了各种方法,把自己应用的安全性寄托在了各种地方。
1.寄托于破坏攻击者的工具。
2.寄托在java层代码逆向、调试、阅读的难度和java自身的机制上。
3.寄托在Native层(c/c++)代码逆向、调试、阅读的难度上。
这就分别对应了无线客户端攻防的三个维度。
一般而言,对于无线客户端的安全攻防上,企业或开发者由于精力有限可能无法满足应用的安全需求,如鲠在喉般的遏制着应用的健康发展。
作者:纳池@阿里移动安全,更多安全技术文章,请点击这里