网易易盾

网易易盾官方号

286篇博客

网易易盾资深工程师侯海飞:Android应用安全提升攻略

网易易盾2019-04-25 18:22

近年来,Android应用安全问题频发,合规性监管不断升级,开发者对应用安全防护也越来越重视。4月20日在广州举行的2019安卓巴士千人开发者大会上,大家对Android应用安全进行了聚焦。

2019安卓巴士千人开发者大会是由安卓巴士技术社区举办。安卓巴士是中国领先的安卓开发者社区,现已聚集超过85万开发者,数年来一直致力于IT从业者的知识分享服务。安卓巴士开发者大会则是安卓巴士技术社区主打的线下技术沙龙品牌,是由其发起并组织的近千人规模的Android开发者线下交流大会。

网易易盾移动安全资深工程师侯海飞
在本次大会,网易易盾移动安全资深工程师侯海飞受邀发表了主题为《Android应用安全提升攻略》的技术分享,就Android应用安全风险案例、常见安全隐患、安全活动周期以及安卓加固常见策略等内容进行了解读。
一、应用安全风险案例

Android应用安全的风险案例数不胜数,侯海飞称,就连很多大厂的App也都中过招,常见的问题点主要是以下这个:

  • 密码学误用导致防御绕过:某外卖APP的数据加密实现于native层,密钥硬编码,且加密逻辑未保护,导致加密数据被破,进一步致使网络访问验证被攻陷。可以用于伪造任意链接发起攻击,比如撞库获取用户信息、伪造电话攻击、业务薅羊毛等。
  • Webview组件使用不当导致应用被克隆:排名非常靠前的某支付工具APP中file跨域访问的权限设置不当,攻击者发送一条恶意链接给用户即可完成攻击,通过Url Scheme方式打开被攻击APP中导出的Webview activity,使之加载恶意链接中的html文件,导致本地数据泄露,并进一步实现应用克隆。
  • 易被逆向,对核心业务逻辑保护不足:某照片恢复APP中未采取任何逆向对抗措施,导致核心付费逻辑被改写,重打包后可免费使用付费功能。

说明:上述相关漏洞均已被修复。

侯海飞以某照片恢复App为例,分析解读了相关安全隐患以及防护策略。


此App的业务场景,包括初始界面、扫描照片、付费流程以及付费结果校验。

应用并没有要求用户注册账户,说明应用核心逻辑并没有和服务端关联,初步反编译后也没有发现任何代码保护措施。由付费提示信息出发,逆向客户端,更改代码控制流即可突破。

因此,侯海飞认为该APP应该采取的防护策略:

  • 核心业务与服务端关联。照片恢复的步骤拆分,将部分内容传入服务端,由服务端校验付费结果,再下发内容给客户端;
  • 字符串加解密。代码的明文字符串,需要加密,防止破解者直接搜索到线索;
  • 防重打包。启动校验签名,非原签名则直接挂机,或者无法正常运行核心逻辑;
  • 核心逻辑抽取至Native层实现。增加逆向门槛;
  • 代码混淆。Java、资源、C/C++均可混淆,增加逆向难度。


讲完真实案例后,侯海飞又分享了常见的安全隐患,包括:

  • 代码可逆向:APP可被逆向,轻易获取代码逻辑,进一步导致控制流被hook,防线被破;
  • 功能泄漏:客户端APP高权限行为和功能被其他未授权的应用程序调用访问;
  • APP可调试:客户端APP能够被调试,动态的提取、修改运行时的程序数据和逻辑
  • 日志信息泄漏:客户端APP将开发调试信息打印泄露,包含敏感参数和执行流程信息;
  • 可二次打包:APP可被修改, 被套壳加入攻击者代码,重新打包发布;
  • 密码学误用:客户端APP代码中使用了不安全的密码学实现,例如固定硬编码的对称加密,ECB模式的对称加密,CBC模式中IV固定等;
  • 敏感信息泄漏:客户端APP代码中泄漏敏感数据,如认证使用的共享密钥、不应被暴露的后台服务器ip地址等;
  • 敏感信息泄漏:客户端APP代码中泄漏敏感数据,如认证使用的共享密钥、不应被暴露的后台服务器IP地址等。


二、应用安全活动周期

侯海飞表示,移动APP安全加固现如今的发展阶段引入了“安全生态链”,因此网易易盾也早就推出了APP开发全链路安全服务。

网易易盾的App全链路安全服务包含了安全开发、应用审计、安全加固、渠道检测四个周期。

  • 开发阶段:开发者应遵循移动应用的安全开发规范,使用一些成熟的安全组件,如安全键盘SDK、防劫持SDK等;定期对客户端进行安全评估;
  • 测试阶段:采用黑盒渗透攻击和白盒代码审计的方式发现移动应用的安全缺陷及安全漏洞,降低安全风险;
  • 上线阶段:上线前使用加固、混淆等技术加固应用,提高攻击门槛和逆向的时间成本;
  • 运营阶段:监控第三方应用市场,及时发现各种盗版、钓鱼、山寨等恶意应用,并做漏洞修复和逆向对抗。

    侯海飞在现场对每个周期进行了详细的分享:

    1、开发阶段:安全开发

    开发阶段需要开展SDL培训,强化安全开发意识,使用较成熟的安全组件。密码输入、加密算法、数据通信、运行环境、应用签名等等具体的相关技术点可以参考下表:
  • 安全开发生命周期(SDL)是侧重于软件开发的安全保证过程,旨在开发出安全的软件应用,尽可能地在产品版本回归前尽早地清除漏洞。其核心理念就是将安全考虑集成在软件开发的每一个阶段:需求分析、设计、编码、测试和维护,从需求、设计到发布产品的每一个阶段每都增加了相应的安全活动,以减少软件中漏洞的数量并将安全缺陷降低到最小程度。

    在这一阶段,安全防护的主要目的是将安全缺陷降低到最小程度,避免后期线上运营阶段出现安全问题,但是自然地成本较高。

    2、测试阶段:应用审计

    测试阶段主要包括安全扫描和渗透测试,具体防护内容可参见下表:

    侯海飞说,根据2018 年金融类应用高危漏洞 TOP10调查显示,ContentProvider敏感信息泄露、不安全Zip文件解压、服务端证书弱校验、客户端XML外部实体注入等漏洞均高居榜首,严重影响着Android应用的安全性。

    但是,并非所有的漏洞都需要修复,从成本和实际防护效果上考量,开发者可根据实际情况进行选择。

    3、上线阶段:安全增强

    侯海飞指出,在第三阶段,需要在基础的安全防护上进行增强,这时候可以根据安全测试结果进行选择性修复。

    从开发者和第三方安全厂商的角度来看:

    • 开发者可以开发逆向对抗产品(反调试、反重打包、反xposed等),提高应用安全性;
    • 第三方安全厂商可以另外提供安全组件SDK、安全加固产品等供选用。

    4、运营阶段:渠道监控

    侯海飞认为,运营阶段的主要防护手段包括爬虫、盗版识别、数据分析。

    • 爬虫:监测主流渠道应用下载数据,包括第三方市场、论坛等;
    • 盗版识别:应用图标、名称、包名、资源文件、代码指纹等,使用相似度算法分析;
    • 数据分析:盗版渠道分布、下载量、盗版溯源、篡改内容等数据分析。


    综上所述,在应用安全的开发、测试、上线、运营这四个活动周期内,可以从安全开发(数据通信、数据安全、核心逻辑保护、调试日志)、应用审计(安全扫描、渗透测试)、安全增强(漏洞修复、应用加固)、渠道检测(盗版监控、数据分析)等细分点进行着力。

    三、安卓加固常见策略


    在分享的后半段,侯海飞对安卓加固的策略进行了解读,他认为,常见的Android加固策略包括应用加固和源码混淆。

    1、应用加固

    在应用加固方面,主要有DEX文件、SDK文件、SO文件加固这三类。(SDK的加固策略和DEX类似,不细说)

    • DEX加固

    在DEX加固上,针对加固程度的不同,可以分为:

    • 混淆代码:最原始也是最基础的防护措施。
    • 整体DEX加固:加壳;
    • 拆分DEX加固:函数抽取及动态恢复,增加内存Dump的难度;
    • 虚拟机加固:自定义指令虚拟机解释器,指令可混淆;
    • Java2C加固:将DEX指令转换为native指令执行,可增加混淆、字符串加密功能。
    • 整体DEX加固,拆分DEX加固,均有相应的脱壳机,当前的防护程度几乎为零。
    • 当前性能最强的加固方案是Java2c,将java指令转成c/c++指令,并做虚假控制流、字符串加密等处理,会让逆向者头痛。如下所示,即为Java2c加固前后的区分:


    • so加固


    该加固方式是指根据so结构特点,在二进制层面进行局部函数加解密。

    2、源码混淆

    常见的源码混淆方式包括Java代码混淆、C/C++代码混淆以及h5 脚本混淆等。

    • Java代码混淆


    部分逆向IDE对中文的支持并不好(涉及中文字符编码的问题),配置起来也并不困难,强烈推荐开发者使用。
    如下所示,为Java代码中文混淆前后的效果:

    • C/C++代码混淆


    此处的混淆不单是字符串层面的,也包括了代码逻辑控制流等。
    C/C++代码混淆前后保护效果如下:

    C/C++代 C/C++代码混淆,可以在LLVM编译器上下点功夫——LLVM不仅仅提供混淆实现,还能通过多重Optimize(优化器),实现多种效果,例如代码控制流扁平化、虚假控制流、字符串加密、符号混淆、指令替换等。
    H5 脚本混淆

    H5脚本混淆
    主要提供字符串加密、混淆、去log、变量名处理、压缩、函数名处理、平台识别、防篡改等功能。保护前后区别如下:


    四、总结

    应用安全是应用不可缺少的一部分,如有不慎很可能会被不发分子利用、薅羊毛,给公司利造成极大损失。

    在逆向对抗中,建议开发者将核心逻辑置于native层,且借助LLVM对Native层代码进行保护;如无多余人力物力投入安全,也可直接使用第三方安全加固产品,比如说网易易盾的加固。