这是一份值得你去查看的Android安全手册

640?wx_fmt=jpeg

/   今日科技快讯   /

昨日,针对近日闹的沸沸扬扬的取消免费送宽带一事,现在网上最新泄露的中国移动内部文件显示,取消58元以下手机套餐免费宽带赠送业务,同时对新宽带用户收取100元左右的安装调试费。

/   作者简介   /

大家周一好,新的一周继续努力哦!

本篇文章来自老司机骑小猪看流星的投稿,分享了他对Android中安全相关内容的整理,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。

骑小猪看流星的博客地址:

https://www.jianshu.com/u/0111a7da544b

/   前言   /

时间:2018年3月

涉事对象:Facebook、剑桥分析公司、美国大选

泄露数据:5000万用户数据

事件回顾:事件源于Facebook与剑桥分析公司的合作,剑桥分析公司为了学术研究,在脸书上创建了一个应用预测用户性格喜好的APP用来测试,可是剑桥分析公司不仅收集了用户的测试结果,还在未经允许地情况下顺道收集了5000万用户在Facebook上的个人信息。

剑桥分析公司获得了5000万活跃用户数据后,建立起用户画像,通过计算机对每个用户的兴趣爱好、性格和行为特点进行精确分析,预测他们的政治倾向。然后定向向用户推送新闻,借助Facebook的广告投放系统,影响用户的投票行为。于是,Facebook对美国大选产生了难以推脱的影响。

东窗事发后,Facebook就被推上舆论风口了,外界开始声讨Facebook,虽然此次主要原因不在Facebook,但如果只是把责任推到剑桥分析公司身上,不从根本上重视用户隐私保护,Facebook未来还会遇到第二个或者第三个“剑桥分析公司”。

当然上面的例子还有很多,谈起Android方面的安全机制、个人认为需要从两个方面去讨论安全:用户安全、公司安全。开发人员需要及时发现系统存在的安全隐患,编码存在的一些问题,及时修复安全问题,提高系统安全设计,保障信息应用系统运行安全以及用户的安全。下面就Android应用列举一些安全问题和解决办法。

/   正文   /

问题:RSA加密算法不安全使用带来的安全风险

RSA加密算法是一种非对称加密算法。当其密钥长度过短,通常认为长度小于512位时,就会存在较高的被破解风险;没有使用正确的工作模式和填充方式,将会存在重放攻击的风险。因RSA加密算法不安全使用造成的加密方法失效,可能造成客户端隐私数据泄露、加密文件破解、传输数据被获取、中间人攻击等后果,导致用户敏感信息被窃取。

解决方案

  1. 使用RSA算法进行数字签名时,建议密钥长不要低于512位,推荐1024位

  2. 使用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接口,需使用以下方法:

  1. 设置minSdkVersion值大于或等于17,使应用不能在4.2以下系统上运行

  2. 允许被JavaScript调用的方法必须以@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等一些基本的安全防护措施这里就不谈了,欢迎补充。

推荐阅读:

欢迎关注我的公众号

学习技术或投稿

640.png?

640?wx_fmt=jpeg

长按上图,识别图中二维码即可关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值