Android

SafetyNet Attestation APIでRoot化チェック【基本的な検証編】

投稿日:2018年12月26日 更新日:

はじめに

こんにちは。カイザーです。最近、SafetyNet Attestation APIを使用してRoot化チェックについて調査する機会があったので、記事にまとめることにしました。

SafetyNet Attestation APIとは

GoogleがAndroid向けに提供しているAPIで、アプリを実行するAndroid端末のセキュリティチェックを行うことができます。
これにより、Root化をはじめとするOSの改ざんを検知することができ、アプリを安全な環境でのみ実行するための、判断材料とすることができます。

注意点

このAPIは、Androidアプリからリクエストすると、JWS形式で結果がレスポンスされます。
しかし、そのAPIをアプリ内で判定すると、通信が改ざんされた場合や、そもそもアプリ自体が改ざんされて判定ロジックが書き換えらた場合、チェックを通過してしまいます。
下記に注意点をいくつか挙げますが、最終的にはアプリごとに工夫が必要です。

レスポンス結果はアプリ内で判定しない

アプリ内で判定してしまうと、通信やアプリが改ざんされた場合、チェックが効かなくなります。
レスポンス結果は、自前のサーバサイドでAPIを用意し、判断するようにしましょう。

JWSのキーチェーンをチェックする

このAPIレスポンスはJWSで返却されます。JWSは、電子署名されたJSONなので、レスポンス内容を検証し、改ざんを検出することが出来ます。
キーチェーンの証明書の発行元のチェックと、署名の内容のチェックを行い、改ざんされていないことを確認する必要があります。
今回は、Android側の実装をメインとしているため、省略しています。

レスポンス結果は正しくチェックする

JWSのPayloadに格納されているレスポンス結果には、判定結果がbooleanで返却されますが、それ以外の項目も重要な判断材料となります。これらを正しくチェックすることにより改ざんのチェックが可能となります。

  • nonce
    nonceはサーバサイドで発行し、サーバサイドで検証できるようにすると、以前の正常レスポンスでAPIリクエストを行われていることをチェック出来ます。
    ちなみに、このことはリプレイアタックといいます。
  • タイムスタンプ
    タイムスタンプが現在時刻と比較してかけ離れている場合は、リプレイアタックである可能性があります。
    タイムスタンプを検証して、最近のもの以外は弾くようにしましょう。
  • APK証明書のSHA-256ハッシュ
    署名に使用したAPK証明書を検証し、APKが改ざんされて再ビルドされたものではないことを確認します。
  • APKのSHA-256ハッシュ
    APKがGoogle Playなどにリリースしたものから改ざんされていないことを確認するために、APKのSHA-256ハッシュが同一かどうか確認します。

今回は、Android側の実装をメインとしているため、APK証明書のSHA-256ハッシュとAPKのSHA-256ハッシュの検証以外は、省略します。

今回の構成

今回は、Android版の実装をメインで説明するため、サーバサイドでの検証は簡易的なものとします。

なお、実際にRoot化チェックをする場合は、下記のような構成が必要だと考えています。

この構成の場合、検証結果NGの場合はログインさせないようにすることで、この後のサービス利用をブロックするケースとなります。
ただ、サーバサイドがメインになってしまうため、また別記事にしたいと思います。

APIキーの取得

Google API Consoleにアクセスし、APIキーを作成します。
そして「Android Device Verification」を有効にします。
このAPIは無料ですが、1APIキーにつき毎月1万リクエストしかできません。
例えば、起動時のみにチェックするとしても、毎月1万回以上起動されるアプリであれば、上限申請をしましょう。
ただし、上限を撤廃することは出来ないので注意して注意してください。

Android側の実装

先にAndroid側の実装を紹介します。
今回はKotlinで実装していきます。

build.gradle(app)への追記

SafetyNet Attestation APIを使用するため、play-services-safetynetを導入します。
また、自前サーバとのAPI通信を行うため、retrofitとconverter-moshiも導入します。

Retrofitの準備

先に、自前サーバとの通信を実装していきます。

データクラスの作成

今回はJSONからデータクラスへの変換にmoshiを使用します。Kotlinとの親和性が高く、データクラスを作成するだけで、変換できるようになります。
自前サーバのAPIへのリクエストとレスポンスに使用するデータクラスのみ定義します。

APIサービスの定義

今回は確認用API1本のみだけなので、下記インタフェースを定義します。

Attestation APIへのリクエスト

SafetyNet APIのリクエストを行います。

attest()メソッドの第二引数には、GCPで取得したAPIキーを設定します。
APIリクエストが成功した場合は、OnSuccessListenerがコールされます。
ただし、Root化されているかどうかはこの時点ではまだ分からないため、JWS形式のレスポンス内容を確認する必要があります。
通信エラーなどの場合は、OnFailureListenerがコールされます。

自前のチェックAPIコール

先ほど記述した通り、アプリ内でレスポンスを判断することは、抜け道の原因となります。
そのため、レスポンスを判断するためのAPIを自前で用意して、サーバサイドで判断させます。
今回は、チェックAPIを用意したので、そのコールを実装します。

SafetyNet APIのレスポンスのJWSをそのまま送信しています。

サーバサイドの実装

Safety Attestation APIのレスポンスを自前サーバで検証するため、Golangで作成しました。
JWSのパースには、go-joseを使用しました。
なお、payloadの取り出しにUnsafePayloadWithoutVerification()関数を使用していますが、実際にはVerify()関数を使用してください。証明書と署名の検証が出来た場合のみpayloadを取り出すことができるためです。
この辺りの細かい検証関係は、別記事で書きたいと思います。
レスポンスの検証は、下記を行なっています。

  • APKパッケージ名
  • APKのSHA-256ハッシュ値
  • APKの証明書のSHA-256ハッシュ値
  • BasicIntegrityがtrueであること

さいごに

いかがでしたか? ゲームのチート対策など、Root化チェックが必要なアプリは数多いと思います。
しっかり対策して、アプリ・サービスのセキュリティを高めましょう。
今回は、サーバ側でJWSの検証関係を省きましたが、「しっかり検証編」としてさらに調査して続きを書きたいと思います。

おすすめ書籍

Kotlinスタートブック -新しいAndroidプログラミング Kotlinイン・アクション 速習 Kotlin: Javaより簡単!新Android開発言語を今すぐマスター 速習シリーズ

page_footer_300rect




page_footer_300rect




-Android
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

Kotlin MPAndroidChartライブラリを使い移動平均線を描画してみる。

1 はじめに2 MPAndroidChartライブラリについて2.1 ライブラリの導入2.2 描画の準備3 折れ線グラフを描画する3.1 LineChartの設定3.2 LineChart用のデータ作 ...

KotlinでAndroidの双方向DataBindingを利用する

1 はじめに2 MVVMアーキテクチャ2.1 Model2.2 View2.3 ViewModel3 KotlinでAndroid DataBindingを設定4 説明用のサンプルアプリについて5 a ...

Kotlinをはじめよう〜Kotlin基本文法〜

1 はじめに2 事前準備3 基本データ型4 変数5 条件分岐 if式6 条件分岐 when式7 繰り返し制御 while文8 繰り返し制御 for文9 さいごに10 おすすめ書籍 はじめに こんにちは ...

GCM 2.0からFCMに移行する(AWS SNS対応版)

1 はじめに2 FCM移行で大事なポイント3 Firebaseプロジェクトへの引き継ぎ3.1 Firebaseの初期設定4 依存ライブラリの変更4.1 “com.google.androi ...

Kotlinでクラスのネストについて

1 はじめに2 クラスのネスト3 内部クラス3.1 Javaコードとの比較4 さいごに5 おすすめ書籍 はじめに こんにちは。引き続きKotlinの基本文法で、今回はクラスのネストについてです。 Ja ...

フォロー

follow us in feedly

page_side_300rect

2018年12月
« 11月   1月 »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。

Web版MyCoach

私たちはより広い方にコーチングを知ってもらいたいと考えています。 下記のサイトにて、コーチの方々を紹介しておりますので、よろしければご覧ください。