Jailbreakの仕組み
root化の仕組み
脆弱性を使って、現在のタスク(プロセス又はスレッド)の権限をrootにしてシェルを実行します。具体的に言うと、特権を持った何か(root権限のプロセスやカーネルスレッド)を使って current->cred->uid = current->cred->euid = current->cred->gid = current->cred->egid = 0 にさせてから、シェルを実行します。もしくは、特権を持った何かから直接シェルを起動させるという方法もあります。
ROM焼きの仕組み
一般的にAndroidのシステムはNANDフラッシュに入っています。NANDフラッシュにはハードディスクやSSDとは特性が異なるため、NAND用の特殊なファイルシステムが使われています。
ここに書きこむことによってシステムを改造したり、別のシステムへと変えることができます。
通常、システムのファイルシステムやブロックデバイスへの書き込みにはroot権限が必要なため、ROM焼きをするためにはroot化が必要です。
また、IS01には別のプロテクトが存在するためにカーネルでのコード実行が必要です。
脆弱性とは
脆弱性とは、ソフトウェアの考慮ミスによって生まれた裏道のようなものです。
正当性の検証を迂回することによって、権限やメモリ・レジスタの値を想定外のものにすることができます。
それによって本来の権限よりも高い権限でコードを実行することが可能になります。
脆弱性の種類 |
可能な事 |
スタックバッファオーバーフロー |
スタックにあるバッファの境界チェックにある問題を突くことで、後続する想定外のメモリに書き込みできる |
ヒープバッファオーバーフロー |
ヒープにあるバッファの境界チェックにある問題を突くことで、後続する想定外のメモリに書き込みできる |
不十分な正当性検証 |
十分な正当性検証が備わっていない部分を突くことで、コーナーケースなどで正当性検証を迂回できる |
メモリ破壊 |
メモリアドレスの正当性検証が正しく行われていない部分を突くことで、想定外のメモリの書き換えができる |
整数オーバーフロー |
整数型の最大値を越えさせることで正当性検証を迂回できる |
整数アンダーフロー |
整数型の最小値を越えさせることで正当性検証を迂回できる |
競合状態 |
マルチスレッドやプリエンプションの未考慮部分を突くことで、競合を起こして正当性検証を迂回できる |
情報リーク |
初期化し忘れなどの部分を突くことで、隠されていた情報を盗み見ることができる |
NULLの参照外し |
アーキテクチャによってはNULL付近にデータを置くことでコードを実行させることが可能になる |
開放済みメモリの使用 |
場合によっては任意のコードが実行できる |
二重開放 |
場合によっては任意のコードが実行できる |
権限昇格 |
権限の管理のミスを突くことで、上位権限に移行できる |
書式文字列脆弱性 |
任意のコードが実行できる |
複数の脆弱性を組み合わせる事で、可能になることが増えます。
脆弱性の使い方
脆弱性を突く方法を知るには、既存のJailbreakのソースコードや既存の脆弱性実証コード(exploit)を読むのが簡単です。exploitはExploits Databaseにまとまっています。遠隔でも使えるものをremote exploit、システム内でしか使えないものをlocal exploitと呼びます。また、攻撃の種類によっても区別されます。
攻撃の種類 |
説明 |
Root Exploit |
root権限のユーザープロセスでのコードの実行をする |
ring0 Root Exploit |
カーネルでのコードの実行をする (ARMでは特権モードをring0とは言わないので注意) |
Stack Disclosure Exploit |
スタックメモリを盗み見する |
Kernel Memory Disclosure Exploit |
カーネルメモリを盗み見する |
Denial of Service Exploit |
システムサービスを妨害する |
一部のexploitは、ビルドするためにカーネルのビルドが必要です。
最終更新:2010年11月24日 06:14