おすすめ書籍はじめにこんにちは。APIを使用してRoot化チェックについて調査する機会があったので、記事にまとめることにしました。APIとはGoogleがAndroid向けに提供しているAPIで、アプリを実行するAndroid端末のセキュリティチェックを行うことができます。これにより、Root化をはじめとするOSの改ざんを検知することができ、アプリを安全な環境でのみ実行するための、判断材料とすることができます。注意点このAPIは、Androidアプリからリクエストすると、JWS形式で結果がレスポンスされます。そのAPIをアプリ内で判定すると、通信が改ざんされた場合や、そもそもアプリ自体が改ざんされて判定ロジックが書き換えらた場合、チェックを通過してしまいます。下記に注意点をいくつか挙げますが、最終的にはアプリごとに工夫が必要です。レスポンス結果はアプリ内で判定しないアプリ内で判定してしまうと、通信やアプリが改ざんされた場合、チェックが効かなくなります。レスポンス結果は、自前のサーバサイドでAPIを用意し、判断するようにしましょう。JWSのキーチェーンをチェックするこのAPIレスポンスはJWSで返却されます。JWSは、電子署名されたJSONなので、レスポンス内容を検証し、改ざんを検出することが出来ます。キーチェーンの証明書の発行元のチェックと、署名の内容のチェックを行い、改ざんされていないことを確認する必要があります。今回は、Android側の実装をメインとしているため、省略しています。レスポンス結果は正しくチェックするJWSのPayloadに格納されているレスポンス結果には、判定結果がbooleanで返却されますが、それ以外の項目も重要な判断材料となります。これらを正しくチェックすることにより改ざんのチェックが可能となります。noncenonceはサーバサイドで発行し、サーバサイドで検証できるようにすると、以前の正常レスポンスでAPIリクエストを行われていることをチェック出来ます。ちなみに、このことはリプレイアタックといいます。タイムスタンプタイムスタンプが現在時刻と比較してかけ離れている場合は、リプレイアタックである可能性があります。タイムスタンプを検証して、最近のもの以外は弾くようにしましょう。APK証明書のSHA-256ハッシュ署名に使用したAPK証明書を検証し、APKが改ざんされて再ビルドされたものではないことを確認します。Playなどにリリースしたものから改ざんされていないことを確認するために、APKのSHA-256ハッシュが同一かどうか確認します。今回は、Android側の実装をメインとしているため、APK証明書のSHA-256ハッシュとAPKのSHA-256ハッシュの検証以外は、省略します。今回は、Android版の実装をメインで説明するため、サーバサイドでの検証は簡易的なものとします。実際にRoot化チェックをする場合は、下記のような構成が必要だと考えています。この構成の場合、検証結果NGの場合はログインさせないようにすることで、この後のサービス利用をブロックするケースとなります。サーバサイドがメインになってしまうため、また別記事にしたいと思います。Consoleにアクセスし、APIキーを作成します。Verification」を有効にします。このAPIは無料ですが、1APIキーにつき毎月1万リクエストしかできません。起動時のみにチェックするとしても、毎月1万回以上起動されるアプリであれば、上限申請をしましょう。上限を撤廃することは出来ないので注意して注意してください。先にAndroid側の実装を紹介します。今回はKotlinで実装していきます。APIを使用するため、play-services-safetynetを導入します。自前サーバとのAPI通信を行うため、retrofitとconverter-moshiも導入します。先に、自前サーバとの通信を実装していきます。今回はJSONからデータクラスへの変換にmoshiを使用します。Kotlinとの親和性が高く、データクラスを作成するだけで、変換できるようになります。自前サーバのAPIへのリクエストとレスポンスに使用するデータクラスのみ定義します。今回は確認用API1本のみだけなので、下記インタフェースを定義します。APIのリクエストを行います。リクエストに必要なnonce生成。リクエストに必要なnonce生成。byteStream.toByteArray()}attest()メソッドの第二引数には、GCPで取得したAPIキーを設定します。APIリクエストが成功した場合は、OnSuccessListenerがコールされます。Root化されているかどうかはこの時点ではまだ分からないため、JWS形式のレスポンス内容を確認する必要があります。通信エラーなどの場合は、OnFailureListenerがコールされます。自前のチェックAPIコール先ほど記述した通り、アプリ内でレスポンスを判断することは、抜け道の原因となります。そのため、レスポンスを判断するためのAPIを自前で用意して、サーバサイドで判断させます。今回は、チェックAPIを用意したので、そのコールを実装します。APIのレスポンスのJWSをそのまま送信しています。APIのレスポンスを自前サーバで検証するため、Golangで作成しました。JWSのパースには、go-joseを使用しました。payloadの取り出しにUnsafePayloadWithoutVerification()関数を使用していますが、実際にはVerify()関数を使用してください。証明書と署名の検証が出来た場合のみpayloadを取り出すことができるためです。この辺りの細かい検証関係は、別記事で書きたいと思います。レスポンスの検証は、下記を行なっています。本来であれば、証明書の検証と署名の検証が必要だが、今回は省略。本来であれば、証明書の検証と署名の検証が必要だが、今回は省略。ゲームのチート対策など、Root化チェックが必要なアプリは数多いと思います。対策して、アプリ・サービスのセキュリティを高めましょう。今回は、サーバ側でJWSの検証関係を省きましたが、「しっかり検証編」としてさらに調査して続きを書きたいと思います。助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。コメントをキャンセルメールアドレスが公開されることはありません。名前メールサイト上に表示された文字を入力してください。MPAndroidChartライブラリを使いボリンジャーバンドを描画してみる。...PREV[Swift]iOSの脱獄チェックを行う。私たちは無料アプリもリリースしています、ぜひご覧ください。下記のアイコンから無料でダウンロードできます。