SafetyNet簡要梳理

 

目錄

前序    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方式:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

參考文獻: