Play Integrity API について
何が起こっている
Google Pay が Play Integrity において最上級のセキュリティ (MEETS_STRONG_INTEGRITY) を要求するようになり,今までの SafetyNet 対策では非接触決済を使えなくなったと思われる Netflix は Play Store へ公開する際の設定で MEETS_STRONG_INTEGRITY を要求するようにしたらしく,やはりこちらも今までの SafetyNet 対策ではインストールできなくなっている
SafetyNet との対応
今までの ctsProfileMatch と basicIntegrity に加えて evaluationType を見るやつが一段階増えたと思えばいいんじゃないだろうか
Universal SafetyNet Fix は Hardware-backed Attestation を求められた時に未実装であるように振る舞わせることで Basic Attestation にフォールバックさせて SafetyNet をパスしていたため,MEETS_STRONG_INTEGRITY をパスできない
https://gyazo.com/a90ec067ed8bd0ba4848855e2bf72ec2 https://developer.android.com/google/play/integrity/migrate#device_integrity_verdict_mapping
ワークアラウンド
fingerprint を Android 11 以前のものに変える
システム全体の fingerprint を変更するのは好ましくない。Play Services の,特に Play Integrity API が呼ばれる時に限って別な fingerprint を返すのが望ましいと kdrag0n 氏。 あくまで現時点の Google Pay に対してのみ有効なワークアラウンドで,これによって MEETS_STRONG_INTEGRITY をパスできるわけではない
謎
Google Pay のバージョンを戻しても通らないのはなぜ
Google Pay は端末の真正性検証について,直接 Play Integrity API を叩かずに Play Services 側に投げているのではないか (どうせ Play Integrity API を受け付ける? のは Play Services だし,そんなことする理由は分からないが)
HARDWARE_BACKED であることも MEETS_STRONG_INTEGRITY の要件に入っているのに,どうして fingerprint をいじるだけで通るのか
1. 今の所は (Google Pay による Play Integrity API の利用が) Android 12 な端末にしかロールアウトされていないから,という説
Android 11 の fingerprint に変えたら通ったというケースはこれだと思う
Google Pay が過去 OS においても SafetyNet に代わって Play Integrity を使うようになったら詰む
2. Hardware-backed Attestation を実装していない太古のデバイスについては互換性のために Basic Attestation でも MEETS_STRONG_INTEGRITY 返してくれるのではないか,という説
例のプルリク が Pixel XL の fingerprint に偽装してるのはそういう意味なのかなと思った でもそれじゃ SafetyNet から Play Integrity に移行した意味がないような……