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開発言語を今すぐマスター 速習シリーズ

blog-page_footer_336




blog-page_footer_336




-Android
-, , ,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

[Android] Firebase ML Kit勉強会に参加してきました

1 はじめに2 Firebase ML Kitとは3 準備するもの4 動かすまでの手順4.1 gradleのsyncがうまくいかない場合5 テキスト認識を試してみる6 画像のラベル付けを試してみる7 ...

Kotlin OkHttp3で通信を行なった際の備忘

1 はじめに2 ライブラリの導入方法3 Build時にエラーが発生する4 パーミッションの追加5 main関数で同期処理の通信6 onFailureでUnable to resolve host &# ...

Kotlin ChartsライブラリとCryptowatchAPIでローソク足を描画してみる。

1 はじめに2 CryptoWatchについて2.1 OHLC3 リクエスト方法3.1 CryptoWatchのAPI4 Androidでの実装4.1 実装前の準備4.2 データクラスの作成4.3 リ ...

【Kotlin】FirebaseAuthenticationでメールアドレスで認証機能を実装

1 はじめに2 レイアウト3 新規登録4 ログイン5 さいごに6 参考7 おすすめ書籍 はじめに こんにちは。miyagawaです。 前回は「FirebaseAuthenticationでGoogle ...

Android StudioのInstant Runの種類

1 はじめに2 概要3 全部で3種類4 コールドスワップになる条件5 ビルドおよびデプロイが実行される条件6 再実行について7 参考ページ8 さいごに はじめに はじめまして、nomuraと申します。 ...

フォロー

blog-page_side_responsive

2018年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

アプリ情報

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