初识SafetyNet简要梳理

article/2025/9/20 4:31:10

目录

前序    2

什么是SafetyNet校验?    2

Safetynet工作原理    2

监控及校验内容    2

实现方式    3

参考文献:    4

 

 

前序

由于近年来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 2—— https://koz.io/inside-safetynet-2/

  • 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

http://chatgpt.dhexx.cn/article/uETrpPtW.shtml

相关文章

【Android安全】Google Hardware-backed Keystore | SafetyNet | 远程证明Remote Attestation

Google Hardware-backed KeyStore Attestation 原理及流程 SafetyNet Hardware-backed Attestation SafetyNet Hardware-backed Attestation:使用了Hardware-backed Keystore SafetyNet 支持Software Attestation 和 Hardware-backed Attestation,根据…

SafetyNet简要梳理

目录 前序 2 什么是SafetyNet校验? 2 Safetynet工作原理 2 监控及校验内容 2 实现方式 3 参考文献: 4 前序 由于近年来Android支付应用的兴起,一些人在root过的手机上发现该类支付性质的应用无法使用。原来&#xf…

什么是跨域?以及解决方案

现在的web项目,很多都是前后端分离,特别容易出现跨域问题 那么什么是跨域问题呢?本篇文章带你彻底从本质上弄明白什么是跨域问题以及如何解决 一、跨域有什么现象 首先我们看一下现象,如何出现的跨域问题。例: 前段&#xff1a…

跨域问题与解决方案

什么是跨域问题? 跨域问题的产生,源自浏览器的同源策略:SOP(Same origin policy)。 同源策略是由 Netscape 提出的一个著名的安全策略,它是浏览器最核心也是最基本的安全功能,所有支持 JavaSc…

跨域常见的解决方案

目录 一:什么是跨域 二:为什么会跨域 三:跨域的解决方案 1.代理服务器 1.1.生产环境 1.2.开发环境 2.JSONP 3.CORS 一:什么是跨域 跨域是指浏览器在向一个服务器发送请求时,该请求的地址与当前页面的地址不同…

React跨域解决方案

一、业务场景: 前后端数据交互时会存在跨域的情况,这个时候就比较难受。传统的解决方案有三种,分别是 Jsonp:但是只能处理get请求 后端CORS:配置注解CrossOrigin(用的最多) 反向代理 &#xff1…

10 种跨域解决方案(附终极方案)

写在前面 嗯。又来了,又说到跨域了,这是一个老生常谈的话题,以前我觉得这种基础文章没有什么好写的,会想着你去了解底层啊,不是很简单吗。但是最近在开发一个 vscode 插件 发现,当你刚入门一样东西的时候&…

可能是最好的跨域解决方案了

今天我们来聊一个老生常谈的话题,跨域!又是跨域,烦不烦 ?网上跨域的文章那么多,跨的我眼睛都疲劳了,不看了不看了 🤣 别走...我尽量用最简单的方式将常见的几种跨域解决方案给大家阐释清楚&…

跨域问题解决方案

跨域问题产生的前提条件 必须要有浏览器,没有浏览器,是不存在跨域问题。浏览器为了安全问题,限制了跨域访问,不允许跨域请求资源。 跨域 浏览器从一个域名的网页去请求另一个域名的资源,域名、端口、协议有任何一个…

跨域理解与解决方案

一 、跨域是啥 为啥会发生? 跨域本质是浏览器基于同源策略的一种安全手段,是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础…

Vue中的跨域解决方案

前言 跨域是因为浏览器存在对不同源页面数据接收的限制。这种限制就是浏览器的同源策略。 同源策略是浏览器的安全机制,跨域的原理就是通过各种方式避开浏览器的安全机制 使用 在项目开发时,对跨域的概念仅限于了解,所以没有注重过程&#xf…

Vue跨域解决方案

文章目录 前言一、跨域是什么?二、解决跨域的办法 前言 跨域错误信息 Access to XMLHttpRequest at ‘http://192.168.2.92:3000/api/b/home’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t …

跨域的几种解决方案(详细)

跨域的几种解决方案 1.什么是跨域2.演示用axios请求网易新闻地址,发现跨域出错3.解决跨域方式3.1 jsonp方式3.2 cors方式3.3 proxy代理转发 1.什么是跨域 .网页所在url的协议、域名、端口号,和Ajax请求url的协议、域名、端口号有一个对应不上&#xff0…

跨域9大解决方案(超详细) 总结

前面的话 我们经常听到跨域这词,这是由于浏览器同源策略限制的一类请求场景。这样做的目的使得 浏览器不容易受到攻击。 推荐文章:九种跨域方式实现原理(完整版) 什么是同源策略? 同源策略(Same origin…

前端跨域解决方案

文章目录 注意,本文已迁移 1.同源政策2.跨域解决方案2.1 CORS普通跨域请求:只需服务端设置Access-Control-Allow-Origin即可携带cookie跨域请求:前后端都需设置 2.2 postMessage跨域2.3 JSONP原理缺点数据格式jsonp跨域实现 2.4 WebSocket属性…

解决跨域的三种方案

解决跨域的三种方案 到目前为止,我们编写的 GET 和 POST 接口,存在一个很严重的问题:不支持跨域请求 解决接口跨域问题的方案主要有三种 CORS (主流的解决方案,推荐使用) 代理 (推荐使用) JSONP (有缺陷的解决方案&#xff1a…

跨域的五种解决方案详解

1.跨域解决方案一:cors技术 CORS :全称cross origin resource share (资源共享) 工作原理: 服务器 在返回响应报文的时候,在响应头中 设置一个允许的header res.setHeader(‘Access-Control-Allow-Origin’, ‘*’) CORS :全称…

Java中parseInt用法(double类似)

1.将字符直接解析为十进制数进行输出 2.如果方法有两个参数, 使用第二个参数指定的基数,将字符串参数解析为有符号的10进制整数。(所谓指定基数:就是将字符串指定为2,8,16等进制数,然后用解析为…

javascript:parseInt用法,特殊用法,进制转换

parseInt( string,radix ) 一、功能: 除了我们众所周知的字符串转换为整数以外,还涉及到进制问题: 将 [ 指定进制的 ] 字符串转换为十进制整数型 用汉语翻一下这个方法: 二、参数: 1、string: 要解析的字符串&a…

前端JS字符串转数值 Number和parseInt用法

Number() 只包含数值的字符串字符串为空则为0 parseInt() 字符串不能为空字符串第一个必须为数值从第一个数值开始取,到最后一个连续数值结束