本文已独家授权 郭霖 ( guolin_blog ) 公众号发布!
前言:
时间:2018年3月
涉事对象:Facebook、剑桥分析公司、美国大选
泄露数据:5000万用户数据
事件回顾:事件源于Facebook与剑桥分析公司的合作,剑桥分析公司为了学术研究,在脸书上创建了一个应用预测用户性格喜好的APP用来测试,可是剑桥分析公司不仅收集了用户的测试结果,还在未经允许地情况下顺道收集了5000万用户在Facebook上的个人信息。
剑桥分析公司获得了5000万活跃用户数据后,建立起用户画像,通过计算机对每个用户的兴趣爱好、性格和行为特点进行精确分析,预测他们的政治倾向。然后定向向用户推送新闻,借助Facebook的广告投放系统,影响用户的投票行为。于是,Facebook对美国大选产生了难以推脱的影响。
东窗事发后,Facebook就被推上舆论风口了,外界开始声讨Facebook,虽然此次主要原因不在Facebook,但如果只是把责任推到剑桥分析公司身上,不从根本上重视用户隐私保护,Facebook未来还会遇到第二个或者第三个“剑桥分析公司”。
当然上面的例子还有很多,谈起Android方面的安全机制、个人认为需要从两个方面去讨论安全:用户安全、公司安全。开发人员需要及时发现系统存在的安全隐患,编码存在的一些问题,及时修复安全问题,提高系统安全设计,保障信息应用系统运行安全以及用户的安全。下面就Android应用列举一些安全问题和解决办法。
问题:RSA加密算法不安全使用带来的安全风险
RSA加密算法是一种非对称加密算法。当其密钥长度过短,通常认为长度小于512位时,就会存在较高的被破解风险;没有使用正确的工作模式和填充方式,将会存在重放攻击的风险。因RSA加密算法不安全使用造成的加密方法失效,可能造成客户端隐私数据泄露、加密文件破解、传输数据被获取、中间人攻击等后果,导致用户敏感信息被窃取。
解决方案:
A:使用RSA算法进行数字签名时,建议密钥长不要低于512位,推荐1024位
B:使用RSA加密时,如果设置工作模式为ECB,建议填充方式为OAEPWithSHA256AndMGF1Padding
问题:截屏攻击风险
截屏攻击是指在APP运行过程中,界面被监控并且截屏或者录屏。截屏攻击主要发生在APP登录、身份认证、资金操作等界面。Android5.0中增加了一个MediaProjection接口,它提供截屏或者录屏的服务,准许APP拥有截取屏幕或者记录系统音频的能力。同时系统允许其他消息窗口覆盖在系统的录制提示上,从而在用户无感知的情况下启动录屏或者截屏工具。通过此方式,攻击者可以获取APP关键界面的截图或者录像,从而获取用户的敏感信息。
解决方案:
在Activity的oncreate()方法中调用:getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);或者getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);来达到防止截屏攻击的目的。
问题:ZipperDown漏洞
如果大量应用会读取zip压缩包进行相关逻辑业务,常见的场景就是从服务器下载压缩包,进行资源、代码热更新。在解压zip包时,如果对文件名没有进行限制,通过在文件名加上 ../../ 前缀的方式,可以将文件解压到任意路径。如果攻击者用远程劫持或者本地替换等方式将APP将要加载的正常zip包替换为带有路径前缀的恶意zip包,而APP又未对解压文件的文件名称进行处理,则可能会出现攻击者可以对应用资源、代码进行任意篡改、替换,从而实现远程代码劫持等安全问题
解决方案:
1. 对zip包进行解压操作时,在获取文件名后,添加过滤代码对文件名中可能包含的 ../ 进行过滤判断。
2. 使用通信协议加密技术,对通信过程中的数据进行加密保护,保证数据不被篡改。
3. 建议客户端与服务端使用加密通道进行数据交互,并对传输数据进行完整性校验,防止zip包被拦截替换。
问题:WebView明文存储密码带来的安全漏洞
WebView组件默认开启了密码保存功能,会提示用户是否保存密码,当用户选择保存在WebView中输入的用户名和密码,则会被明文保存到应用数据目录的databases/webview.db中。攻击者可能通过root的方式访问该应用的WebView数据库,从而窃取本地明文存储的用户名和密码。
解决方案:
开发者调用 WebView.getSettings().setSavePassword(false),显示调用API设置为false,让WebView不存储密码
问题:WebView远程代码执行漏洞
Android API level 17以及之前的系统版本,由于程序没有正确限制使用addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法。通过addJavascriptInterface给WebView加入一个 JavaScript桥接接口,JavaScript通过调用这个接口可以直接与本地的Java接口进行交互。就有可能出现手机被安装木马程序、发送扣费短信、通信录或者短信被窃取,甚至手机被远程控制等安全问题
解决方案:
如果一定要使用addJavascriptInterface接口,需使用以下方法:A: 设置minSdkVersion值大于或等于17,使应用不能在4.2以下系统上运行;B: 允许被JavaScript调用的方法必须以@JavascriptInterface进行注解声明。
在在proguard-project文件中有这么一句
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
把注释解除,把fqcn.of.javascript.interface.for.webview换成你自己定义的那个类名(包名也必须有,如果定义的是内部类,则是cn.wj.ui.WebViewActivity$myInterface),在4.1的系统上是没有问题了,但4.2的机子上还是不行,再找找,哦,原来是4.2以上版本调用js接口需要在方法使用声明@JavascriptInterface,然后混淆时可能会弄丢该声明导致,程序无法调用js,需要继续再配置文件中添加条件,
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
问题:动态注册Receiver风险
使用BroadcastReceiver组件需要动态注册或者静态注册,如果动态注册广播,即在代码中使用registerReceiver()方法注册BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册,取消时则调用unregisterReceiver()方法。但registerReceiver()方法注册的BroadcastReceiver是全局的并且默认可导出的,如果没有限制访问权限,可以被任意外部APP访问,向其传递Intent来执行特定的功能。因此,动态注册的BroadcastReceive可能会导致拒绝服务攻击、APP数据泄漏或是越权调用等安全风险
解决方案:
1:在 AndroidManifest.xml 文件中使用静态注册 BroadcastReceiver,同时设置 exported="false"。(关于这个属性后面会说)
2:必须动态注册 BroadcastReceiver时,使用registerReceiver(BroadcastReceiver,IntentFilter,broadcastPermission,android.os.Handle)函数注册。
3:Android8.0新特性想要支持静态广播、需要添加intent.setComponent(new ComponentName()),详情可以自行查阅
问题:公共组件配置风险
Activity、Service、Provider、Receiver四大组件若配置为android:exported =”true”,将可以被外部应用调用,这样存在安全隐患的风险。
解决方案:
在应用的AndroidManifest.xml文件中,设置组件的android:exported 属性为false或者通过设置自定义权限来限制对这些组件的访问。值得一提的是,若部分功能使用前提是配置必须使用exported为true,这种情况开发者应该根据实际情况来进行集成
问题:用户敏感信息明文传输
用户在登录过程中,与服务器端交互时明文传输用户名、密码或者验证码等,可能会导致用户敏感信息暴露。
解决方案:
应用与服务器交互过程中,应该对用户名、密码、手机号和验证码等敏感信息进行加密传输。
问题:So文件加固检测
So文件为APK中包含的动态链接库文件,Android利用NDK技术将C/C++语言实现的核心代码编译为So库文件供Java层调用。So文件被破解可能导致应用的核心功能代码和算法泄露。攻击者利用核心功能与算法可轻易抓取到客户端的敏感数据,并对其解密,导致用户的隐私泄露或直接财产损失。
解决方案:
对so文件进行安全加固、可以使用第三方的安全平台so加固方案
问题:H5文件加固检测
应用内若存在明文存储的H5资源文件,则会泄露页面基本布局和一些重要的信息,如登录界面、支付界面等。攻击者可篡改H5资源文件,可能植入钓鱼页面或者恶意代码,导致用户账号、密码、支付密码等敏感信息泄露。更有甚者,通过H5代码暴露相关活动的业务逻辑,可能被黑产团队用来刷红包、薅羊毛等,造成经济损失。
解决方案:
可以使用第三方的专业安全加固方案,对应用中的H5文件进行加固保护
问题:Java层代码动态调试风险问题
应用级配置文件build.gradlel中的调试标记默认是开启,即可以被Java调试工具如JDB进行调试,但是这样可能会出现被获取和篡改用户敏感信息,甚至可以分析并且修改代码实现的业务逻辑,例如窃取用户密码、绕过验证码防护等。
解决方案:
在应用正式发布前,显示设置android:debuggable属性为false,关闭Java动态调试功能、不允许被调试。
问题:数据越权备份风险
Android 2.1以上的系统可以为APP提供应用程序数据的备份和恢复功能,该功能由AndroidMainfest.xml文件中的allowBackup 属性值控制,其默认值为true。当该属性没有显式设置为false时,攻击者可通过adb backup和adb restore对APP的应用数据进行备份和恢复,从而可能获取明文存储的用户敏感信息,如用户的密码、证件号、手机号、交易密码、身份令牌、服务器通信记录等。利用此类信息攻击者可伪造用户身份,盗取用户账户资产,或者直接对服务器发起攻击。
解决方案:
将AndroidMainfest.xml文件中的allowBackup属性值设置为false来关闭应用程序的备份和恢复功能;也可以使用专业安全加固方案的本地数据保护功能,避免本地数据泄露。
问题:未移除有风险的WebView系统隐藏接口漏洞
根据CVE披露的WebView远程代码执行漏洞信息(CVE-2012-663、CVE-2014-7224),Android系统中存在一共三个有远程代码执行漏洞的隐藏接口。分别是位于android/webkit/webview中的“searchBoxJavaBridge”接口、android/webkit/AccessibilityInjector.java中的“accessibility”接口和“accessibilityTraversal”接口。调用此三个接口的APP在开启辅助功能选项中第三方服务的Android系统上将面临远程代码执行漏洞。
解决方案:
如果应用内使用了WebView组件,那么使用 WebView.removeJavascriptInterface(String name) API时,显示的移除searchBoxJavaBridge、accessibility、accessibilityTraversal这三个接口。
问题:日志数据泄露风险
调试信息函数可能输出重要的调试信息,常见的就是Log日志类其中包含的信息可能会导致用户信息泄露,泄露核心代码逻辑等,为发起攻击提供便利,例如:Activity的组件名;通信交互的日志;跟踪的变量值等
解决方案:
应用内使用统一的Log控制基类,可以灵活的控制Log的输出打印。(测试环境允许打印日志、正式环境不打印);或者使用第三方的日志框架
至于常见的代码混淆、应用加固、Http(条件允许)替换成Https等一些基本的安全防护措施这里就不谈了,欢迎补充。
如果这篇文章对您有开发or学习上的些许帮助,希望各位看官留下宝贵的star,谢谢。
Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用、开源项目仅供学习交流、也希望大家尊重笔者的劳动成果,谢谢。