作者简介
老松树,携程高级开发经理,专注于移动应用的信息安全。
随着移动互联网产业的高速发展,智能手机的全面普及,移动App已经无处不在。据统计,我国智能手机用户达到12亿,手机App总量达到400万款。手机APP在方便人们生活之余,也带来了巨大的安全隐患。
App主要面临的风险:
1)静态攻击风险
APP通常很容易被反编译逆向分析源码,出现被破解、篡改、广告植入、二次打包、仿冒/钓鱼应用等风险。
2)动态攻击风险
由于APP运行环境和用户操作行为不可控,导致APP在运行过程中面临各种动态攻击,如模拟器、多开器、加速器、注入攻击、动态调试、设备篡改、位置欺诈等攻击。
3)业务作弊风险
企业大量业务已经由线下及Web端转至手机APP端,目前地下黑灰产通常在APP注册、登录、营销活动场景进行批量化、机器化作业,威胁平台利益和用户账号安全。
移动安全已经成为互联网企业发展过程中面临的一个重要问题,需要更多的关注和投入。
一、手机APP安全加固介绍
解决移动安全问题,要从APP前端的加固,和业务后端的分析两方面进行。本文将介绍手机APP安全加固方面的知识。
下面从iOS平台着手,从以下几个方面,介绍移动端安全加固的方案。
一个标准的安全加固SDK,要包含以下几个要素:
运行环境检测
环境数据的收集
符号,代码的混淆
算法的混淆
虚拟机技术
确认APP的运行环境是否安全,是APP加固的最基础条件。所以我们的加固SDK中,要尽量靠前的进行APP的检测。越狱检测
Hook检测
Debug检测
重签名检测
模拟器检测
代理检测
2.1 越狱检测
2.1.1 越狱概念
越狱是指利用iOS系统的某些漏洞,取得到iOS的root权限,然后改变一些程序使得设备的功能得到加强,突破封闭式环境。越狱使得第三方管理工具可以完全访问iOS设备的所有目录,并可安装更改系统功能的插件和盗版的软件。对于攻击者来说,越狱一般是iOS设备破解的第一步,只有越狱过才能实现后续的安装插件,砸壳获取二进制文件等一系列操作。根据越狱手机和非越狱手机权限等方面的区别,我们可以检测当前环境是否是越狱设备。/bin/bash
/bin/sh
/var/lib/cydia/
/Applications/Cydia.app
/Library/MobileSubstrate
...
Hook(钩子),实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息。在Hook程序执行完,再决定后续的操作。攻击者在破解APP时,经常会通过Hook方式,对APP中的关键位置的函数进行Hook。通过Hook手段,攻击者可以方便破解分析,可以模拟发送业务请求,可以调用加密方法进行数据处理等。在Hook检测时,可以通过各类Hook的原理和特性,进行反向的检测。对于汇编级别的Hook,通过比较函数内的汇编代码,来判断是否有汇编级别的Hook。在破解App包时,需要通过GDB或LLDB来进行调试。所以对APP的调试检测,也是必须的。可以通过ptrace等方法,查看是否处于调试状态。对于已经发布的包,如果检测出调试状态,应该及时终止进程,阻止攻击者的攻击。并且让崩溃点,尽量远离检测点,并清空进程信息,防止攻击者确认检测关键点位置。App Store下载的应用,在砸壳之后,可以通过重签名的方式,实现App包的安装运行,实现逻辑的修改,APP的多开等功能。攻击者也有可能使用ARM模拟器运行,需要进行模拟器检测。攻击者可以通过设置网络代理,抓取App的业务请求,实现修改重发等操作,要进行必要的代理检测。通过收集App运行手机的环境信息,尽可能的识别和标识运行设备,跟踪危险用户动作行为,进行持续分析。通过设备信息的聚合分析,判断用户的环境是否真实,是否是虚拟的伪造的设备。例如:对于攻击者通过设备,进行自动化的注册登录等行为,通过设备ID等信息的聚合,可以发现其中的一些规律。IDFA 广告标示符
IDFV Vendor(供应商)标识
Appleid appleid的相关的一串id
Wifi Wi-Fi信息
fingerprint 设备指纹信息
os_model 系统型号信息
CUP信息
手机型号
屏幕宽高
内存大小
手机容量
.....
通过种类繁多的设备信息的收集,上传到后端后,由后端通过AI,大数据等手段进行设备打分,设备聚合等一系列操作,给设备定义出一个安全范围。为安全人员的后续分析,提供有力的数据支撑。对代码中,关键部分的代码,类名,函数名等部分,要进行混淆。让攻击者无法轻易通过名称,理解当前代码的功能含义,增加破解难度。#define MyClass FX123ADHZA
#define propertyName XZAF891AFJ
#define method_arg1 KAJ18XA91F
#define method_arg2 JAC12DDASS
#define method_arg3 WIAK198FJS
@interface MyClass : NSObject
@property (nonatomic,copy) NSString * propertyName;
- (void)method_arg1:(NSString *)arg1 method_arg2:(NSString *)arg2 method_arg3:(NSString *)arg3;
@end
编译出来的代码如下图所示,混乱的方法名,让攻击者理解方法含义的成本增加:攻击者在进行逆向分析时,通常会根据一些特定的字符串,查找定位到代码的关键位置。所以在安全加固的过程中,不让关键的字符串以明文的形式存在,要对字符串进行混淆,在运行使用时,再解析出来:例如字符串,对这段字符串可以使用异或等方式进行混淆,混淆后的结果为:常用的加密算法,算法通常都有一些运算的模数。对这些模数,也要进行混淆处理,在使用时再解析出来使用。攻击者逆向过程中,通过砸壳获取到APP的二进制文件。将二进制文件放入IDA软件,可以进行静态分析,还可以通过插件,反编译出伪代码。所以,在安全加固的过程中,要对安全SDK中的关键算法,进行算法的编译混淆。通过Clang,在编译过程中,将算法逻辑打乱重排,嵌套一些while循环,或者switch分支,并且插入一些混淆代码,防止攻击者的反编译。这样的汇编代码,可以在IDA中,通过IDA等分析工具,可以反编译出伪代码,攻击者可以很方便的进行分析,通过调试还原出代码的原始逻辑:而我们在编译过程中,将汇编代码进行打乱重排,插入虚假判断逻辑等,可以有效的进行防范。如下图所示,便是一种混淆模式,将算法混淆之后的效果:混淆后的代码,代码段被切割重排,中间还插入了无用代码,使攻击者无法阅读,更增加了攻击者调试的成本。在安全加固方面,安全性最高的一种加固手段,就是虚拟机加固技术。它是将原始代码的算法代码,编译为动态的VM虚拟机指令,在虚拟机中解释执行,最终计算出计算结果。加密后的代码,具有不可逆性,无法被反编译回源代码。算法代码动态执行,单步执行,难以调试分析。而且,虚拟机处理的算法代码,可以动态下发,极大的提高了算法的安全性。携程安全加固产品,经用户授权后,收集种类相对齐全的设备信息,通过设备信息,后端分析算法,可以高效辨别设备的真实性。通过大数据技术,对设备信息进行多维度分析,给设备进行打分,建立用户安全等级。我们对设备的环境监测,越狱,调试,重签名等检测项,都提供了两种以上的检测方案,做到多方案互备。每种检测方法,都使用了非常隐蔽的调用方法,减少被Hook,被定位的可能性。让加固产品的环境监测更加安全可信。使用了自主实现的代码混淆技术(bnof),对比市面上开源的混淆算法,更加安全和高效。携程的代码混淆技术,可以抗优化,可以灵活调节代码切割粒度,执行效率更加高效。混淆后的汇编代码,无法进行反编译,修复成本极高,能对关键加密代码提供很好的保护。携程的安全加固产品,使用了自主实现的虚拟机技术(VM),安全,稳定,可靠。虚拟机技术为核心的加密代码,提供了极强的保护。在严峻的安全形势下,携程加固产品上线以来,取得了良好的效果,为安全部门和业务部门的风控和反爬虫工作,提供了强力的支持。我们是携程火车票研发团队,负责火车票业务的开发以及创新。火车票研发在多种交通线路联程联运算法、多种交通工具一站式预定、高并发方向不断地深入探索和创新,持续优化用户体验,提高效率,致力于为全球人民买全球火车票。
在火车票研发团队,你可以和众多技术大牛一起,真实地让亿万用户享受你的产品和代码,提升全球旅行者出行体验和幸福指数。
如果你也热爱技术,并渴望不断成长,火车票研发团队期待与你一起高速前行。目前我们前端、后台、算法、大数据、测试等技术岗位均有职位。
简历投递:tech@trip.com 邮件标题:【姓名】-【携程火车票】-【投递职位】