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


関連記事

Android Studioでエラーログを詳細表示する

1 はじめに2 初期設定でのビルドエラーメッセージ3 詳細なビルドエラーメッセージを出力4 おまけ5 さいごに6 おすすめ書籍 はじめに こんにちは。Android開発を久しぶりにやっているのですが、 ...

Kotlinのスコープ関数を調べて見た

1 はじめに2 スコープ関数とは3 スコープ関数の種類について4 with関数4.1 使い方4.1.1 withを使わない場合4.1.2 withを使う場合4.2 所感5 apply関数5.1 使い方 ...

Android JavaでS3への画像アップロード

1 はじめに2 AWS上での事前準備3 Android StudioのGradleでAWS SDKをインストール4 ManifestにPermissionの追加5 カメラで写真を撮影し、保存先のPat ...

AndroidでWebViewを使用する時に押さえておきたいポイント5選

1 はじめに2 JSのAlert, Confirm, Promptが表示されない!3 読み込み中の進捗を表示する4 UserAgent5 クリアテキスト設定5.1 クリアテキストを無効にする5.2 H ...

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

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

フォロー

follow us in feedly

page_side_300rect

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

アプリ情報

目標を達成したい方を応援する、TODOアプリもリリースしております。 下記のアイコンから無料でダウンロードできます。

Web版MyCoach

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