目录
前序
由于近年来Android支付应用的兴起,一些人在root过的手机上发现该类支付性质的应用无法使用。原来,google针对app的安全性推出了Safetynet验证服务。该服务可以为Android设备的app运行安全提供一个相对比较高的标准。
什么是SafetyNet校验?
说白了,她就是一个google play里的一个service,在Android2.3及以上版本可用,专门为了搜集Android设备信息(主要是安全相关),并对其进行身份核验,不过,这里的身份主要就是设备的"运行身份",比如:设备是否root过,设备运行环境是否安全等,然后核验信息反馈给相应设备。当然,既然是google play的东西,我们在国内如果不借助翻墙软件的话是无法使用的,且SafetyNet会通过google play市场不断的更新。下面就简要介绍下其运行原理
Safetynet工作原理
首先,应用程序连接到google服务器,发送校验请求(注意,这里的请求包含一个随机数):
com.google.android.gms.safetynet.SafetyNetApi;->attest(mGoogleApiClient, nonce)
上面attest方法属于google play SDK中的方法,该方法通过binder机制调用下面SafetyNet服务
com.google.android.gms.safetynet.internal.ISafetyNetService
这样就调用到了SafetyNet服务。
然后,google将校验结果反馈给应用程序,结果是JES(JSON Web Signature)的格式(一种JSON实体),包括各种签名以及结果标志"ctsProfileMatch"(true/false)。
最后,开发者(一般是应用所对应的服务端)对google反馈的结果进行校验,需要注意的是,这里也可以继续借助google服务器进行校验。
如果校验通过,即"ctsProfileMatch"为true,则表明该设备的运行状态是安全的。
监控及校验内容
SafetyNet有自己的一套复杂的校验标准,且这些标准都是符合"CTS compatibility"测试标准的,但该校验标准,google是没有公开的,原文如下:
Google does not disclose how exactly it determines "CTS compatibility" based on the collected data. For much of this data it is not very obvious what would constitute 'safe' and what not. For example, if Google collects a list of all the paths of files in the filesystem, an attacker would have to figure out what to hide by trial and error. Even though he would be able to make educated guesses, he wouldn't know what exactly Google is looking for.
主要校验内容每个版本不一样,每个版本都有所更新,主要包括如下内容:
-
default_packages
检查设备当前安装的应用包,特别检查其浏览器是否是com.android.browser或者com.android.chrome
-
su_files
检查/system/bin/su or /system/xbin/su文件是否存在,如果存在,则标志着该设备root了,运行环境可被攻击。
-
settings
从android.provider.Settings$Secure或者android.provider.Settings$Global搜集安全相关的设置值,比如:adb_enabled, install_non_market_apps, isKeyguardSecure(), getNotificationVisibility(), lock_screen_lock_after_timeout, lockscreen.password_type, lock_pattern_autolock.
locale
搜集设备中的本地配置情况
-
ssl_redirect和ssl_handshake
ssl相关
-
proxy
IP相关
-
selinux_status
检查selinux状态,是否使用
-
sd_card_test
检测sd卡是否被攻击
-
logcat
执行logcat -d指令,这里google可以将所有log上传至他们的服务器
......
此外还有很多被监控搜集的模块,这里不一一列举。具体可以参见参考文献中的《SafetyNet: Google's tamper detection for Android》及《Inside SafetyNet - part 2》《Inside SafetyNet - part 3》部分。
实现方式
这里对比参考文献中的《Using the SafetyNet API》简要说明:
假设你的app是一个可以连接远程服务端的应用,通过下面几种实现模式的对比,即可大致了解到SafetyNet服务如何使用,具体过程这里不再解析。
没有使用SafetyNet服务的普通app模式:
这里是传统app的实现方式,直接与服务端交互,没有前面的安全校验部分。
如下两种情况使用了SafetyNet服务,但第一种实现方式缺少了前面与远程服务端的握手校验,以及把google反馈的结果在服务端进行校验,所以这种实现方式不够安全。
不安全地使用了SafetyNet服务:
安全的使用SafetyNet方式:
参考文献:
-
SafetyNet: Google's tamper detection for Android—— https://koz.io/inside-safetynet/
-
Inside SafetyNet - part 3—— https://koz.io/inside-safetynet-3/
- Using the SafetyNet API——https://www.synopsys.com/blogs/software-security/using-safetynet-api/
- com.google.android.gms.safetynet——https://developers.google.com/android/reference/com/google/android/gms/safetynet/package-summary
- Protecting against Security Threats with SafetyNet——https://developer.android.com/training/safetynet/index.html