PONOS Advent Calendar 2020 9日目の記事です。
昨日は@nissy_gpさんのNode.js+Sequelizeで楽観的ロックを使って動作を確認するでした。
##はじめに
前回の記事で「Android開発者向けオプションを使ったチート対策」を紹介しました。
今回は、「root判定によるチート対策」を紹介します。
##この記事の対象者
・アプリ開発者
・Android開発者
##root化された端末の判定
メモリハックによる値書き換えなどのチート行為は
root化された端末を使用して行われるケースが多いです。
今回はアプリ側からsu
コマンドを実行して
IOException
の有無で判定してみましょう。
・IOException
発生の場合はroot権限なし ー> 通常端末
・IOException
発生しない場合はroot権限あり ー> root端末
java.lang.Runtimeクラスの
exec(String command)メソッドを使用します。
boolean isRoot = false;
try {
Process process = Runtime.getRuntime().exec("su");
process.destroy();
isRoot = true;
Log.d(TAG, "Root!!");
} catch (IOException e) {
Log.d(TAG, "NotRoot!!");
} catch (Exception e){
e.printStackTrace();
}
if(isRoot){
//root権限ありの時の処理
//例:情報をサーバーに送信し、root化解除を促すポップアップ表示
}
メリット
アプリのセキュリティーレベルを上げることができる。
実装コストが軽い
デメリット
マニアックな海外製端末で初期出荷状態から
root権限が付与されているケースなどがあり、健全ユーザーがチート扱いされてしまう場合もある。
※経験則になってしまいますが、このパターンはかなりレアケースでした。
注意点
リバースエンジニアリングによるコード改竄で今回のコードを無効化されてしまう恐れもあります。
root対策と同時にリパッケージされた不正アプリ対策を実装するのがお勧めです。
不正アプリ対策
・メモリシャッフル
・難読化
・SafetyNet導入
などがあり、SafetyNet の Attestation APIを使用してリパッケージされていないか判定することができます。
##SafetyNetの紹介
SafetyNetでできること
SafetyNet Attestation API:
正規の Android デバイスで、正規のアプリかどうか判定できる
SafetyNet Safe Browsing API:
URL が Google によって既知の脅威としてマークされているかどうかを判定できる
SafetyNet reCAPTCHA API:
悪意のあるトラフィックを検知することができる
SafetyNet Verify Apps API:
有害なアプリから端末を保護することができる
####SafetyNet Attestation API
実装方法は公式に記載されているので省略しますが
以下の手順で正規アプリかどうか判定することができます。
1.SafetyNet 構成証明をリクエスト
2.SafetyNet 構成認証レスポンスを各種検証
3.apkPackageName: 呼び出し元のアプリのパッケージ名のチェック
4.APK証明書のSHA-256ハッシュ:署名に使用したAPK証明書を検証
5.APKのSHA-256ハッシュ:APKがリリースしたものから改ざんされていないことを確認するために、APKのSHA-256ハッシュが同一か検証
6.BasicIntegrityがtrueであることを確認
※検証処理はサーバー側で行うこと
##まとめ
今回紹介したroot判定は自前で実装する手法でしたが
SafetyNet Attestation API
を使用してでも判定することができます。
構成認証レスポンスのBasicIntegrityがfalseの場合はroot端末です
他にもSafetyNetを使用したチート対策があるので
公式ドキュメントを読んでおくことをお勧めします。
明日は@blockの記事です。
お楽しみに!!