Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゲームセキュリティからみたAndroid解析/android-analysis-from-a-...

 ゲームセキュリティからみたAndroid解析/android-analysis-from-a-game-security-perspective

2020/6/20
コロナウイルス接触追跡アプリ解析(オンライン)
講師役で話した内容。

Doraneko

June 20, 2020
Tweet

More Decks by Doraneko

Other Decks in Technology

Transcript

  1. メモリを読み書きする方法の色々 • ptraceシステムコール ◦ Read:ptrace(PTRACE_PEEKDATA…)、ptrace(PTRACE_PEEKTEXT…) ◦ Write:ptrace(PTRACE_POKEDATA…)、ptrace(PTRACE_POKETEXT…) ※32bitで4バイト毎、64bitで8バイト毎とメモリを読むのが非常に遅い。 • 仮想ファイルシステム空間経由

    ◦ /proc/pid/memをopenする。 ◦ lseek、read/writeを用いてメモリを読み書きする。 ◦ 速度的にはptrace経由より大分高速化する。 • process_vm_readv/process_vm_writev ◦ AndroidNDKでは標準では呼び出せない。 ◦ syscallシステムコール経由で呼び出す必要がある。 ◦ アタッチを必要とせず、対象プロセスでの一時的な停止が発生しない。
  2. メモリを読み書きされることを防ぐには • アンチデバッグ ◦ forkシステムコール等で子プロセスを生成し、子プロセスから親プロセスにアタッチする。 ◦ アタッチできるのは一つのプロセスまでなので、外部からのアタッチを防止できる。 • メモリの暗号化 ◦

    数値に対して乱数と xorを取るなどして生の値をメモリ上に置かない。 (強度は必要) • メモリの改竄検知 ◦ 数値に対してハッシュ値を保存し、整合性を取ることで改竄を検知する。 • 端末のroot権限の監視 ◦ root化されていたらアプリを起動終了させるなどの対応をする。 apk改変の検知などと合わせて行う。 • その他 ◦ /proc/pid/mem等のファイルオープンを監視する。
  3. soファイルを動的に読み込ませる方法1 • Android,Linux等ではdlopen関数を利用するとsoファイルを動的にロードすることが可能。 • void *dlopen(const char *pathname, int mode)

    • 対象プロセスにsoファイルをインジェクションするためには、対象プロセスで dlopenを呼び出させれば良 い。 • 自プロセスでない他のプロセスで任意の関数を呼び出すということは通常は出来ないが、 ptraceシステム コールを利用すれば可能になる。 • ※端末のSELinuxがPermissiveになってる必要がある。
  4. soファイルを動的に読み込ませる方法2 ptraceを利用し対象プロセスにアタッチが成功すると、対象プロセスは停止する。 この停止している間に以下を実行する。 1. プログラムカウンタを dlopenのアドレスに書き換える 2. dlopenの引数であるsoファイルのパスをメモリに書き込む 3. レジスタ(ARM)またはスタック上(x86)にdlopenの引数をセットする

    4. 戻りアドレスを0に設定する(※ここが重要) この状態でプロセスを再開すると dlopenが実行されsoファイルがロードされた後、不正な戻りアドレスがセットさ れていたことにより制御が戻り対象プロセスは再度停止する。 ここで事前に保存して置いた最初の状態の レジスタの値をセットし、再開させることでプログラムは正常に動き 出す。
  5. 5.Fridaによる通信解析・改変 Androidに限らず、アプリケーションの通信処理を特定し解析するのは脆弱性診断時等に非常に重要。 Fridaでないと出来ない訳ではないが、 Fridaを用いることで効率的な解析が可能になる。 実現できること • 通信の暗号化/復号関数の特定や調査。 ◦ 大量の関数を同時にフッキングすることで処理の特定が容易になる。 •

    フッキングによるリプレイアタック。 ◦ 通信を発生させる特定の関数を任意回数強制的に呼び出す。 • 暗号化/復号ロジックを無視した通信傍受、改変。 • 端末のプロキシ設定を無視するアプリに対する対応。 ◦ 宛先アドレスを強制的に変更する。 DNS偽装ではない別の方法。 • 通信のタイムアウト等がある場合無効化する。 etc… ※上記は全てアプリの実装や保護レベルによって不可能な場合もあります。
  6. 出来たこと • ptraceアンチデバッグの無効化 ◦ 1つのプロセスに対して複数プロセスがアタッチできない制限を撤廃。 アンチデバッグを無効化して無限にアタッチできるように !! • root権限無しで他のプロセスにアタッチ •

    root権限無しで権限的に本来不可能なファイルを開く etc 少し修正するだけでも、本来有り得ない恐ろしい AndroidOSが完成する。 攻撃者が突き詰めれば、通常の Androidを前提としたセキュリティ対策は全て突破される危険性がある。 一方でマルウェア等を調査するとき、こうした手法は一定の実用性を持つかも ?