2011/02/10

SuperOneClick v1.6.5 (Root編)

前回から続いて SuperOneClick の詳細を見ていく。
今回は Root ボタンをワンクリックすると何が起きるのかを解説してみる。

Root ボタンの処理は、いつでも自由に root を取得できるように、su のバイナリファイルを Android システム上のパスの通ったディレクトリに配置することを主な目的としている。su が配置されていれば、コンソールで su コマンドを実行すれば root 権限に昇格できるわけだ。
su ファイルを配置したい /system/bin は /system が読み取り専用でマウントされているため書き込みができない。書き込みができるようにするには /system を読み書き可でリマウントする必要がある。そして、リマウントには root 権限が必要となる。
Android に接続しているPC(クライアント)から ADB を経由して Android を操作する場合、Android 上での処理は adbd が行っている。adbd は以下のように shell ユーザの権限で実行されているため、リマウントする前に root に昇格させないといけない。この権限昇格のために、adbdの脆弱性を利用している。
$ ps
ps
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
root      1     0     292    280   ffffffff 00000000 S /init
(略)
shell     2341  1     3308   188   ffffffff 00000000 S /sbin/adbd

順に処理を追っていく。

1. ADB Server の停止と起動
環境によっては Android SDK がインストールされていたりして、既に別バージョンの ADB Server が起動しているかもしれないので、ADB Server を停止して SuperOneClick に同梱されている ADB から ADB Server を起動する。(再起動する目的はこれ以外にもあるかもしれない。)

2. exploit 用のバイナリのコピー
テンポラリの /data/local/tmp/ に、クライアント上の psneuter または rageagainstthecage ファイルをコピーする。
※どちらをコピーするかは、画面でのユーザ選択次第。
実行できるように、コピーしたファイルのパーミッションを 0755 (rwxr-xr-x) にする。

3. exploit の実行
adbd が root 権限に昇格されるまで次の2つ処理を順に繰り返す。
・exploit を実行して root 権限の判定を行う(exploitの実行終了時のプロンプトに#が含まれているかどうかで判定している!かっこいー)
・ADB Server を停止して再度起動する(exploitの実行中に adbd のプロセスを強制終了させるため、ADB Server と再接続させている?)

4. busybox のコピー
/data/local/tmp/ に クライアント上の busybox ファイルをコピーする。
実行できるように、コピーしたファイルのパーミッションを 0755 (rwxr-xr-x) にする。

5. /system のリマウントと su のコピー
mount コマンドを利用して /system にマウントされているデバイスファイルパスを取得する。
/system/build.prop から OS Version (ro.build.version.release プロパティ)を取得する。
取得に失敗した場合はユーザに OS Version が 2.0 以降かどうかを問い合わせる。
/system を 読み書き可でリマウントする。ファイルシステムが使用中の場合は開放されるまで待つ。
OS Version が 2.0 未満の場合はクライアント上の su-v1 を /system/bin/su としてコピーする。
OS Version が 2.0 以降の場合はクライアント上の su-v2 を /system/bin/su としてコピーする。
所有者(root)権限で実行できるように、su のパーミッションを 4755 (rwsr-xr-x) にする。

6. busybox のインストール
/system/xbin ディレクトリを作成して busybox を /system/xbin/ にコピーする。
実行できるように、コピーしたファイルのパーミッションを 0755 (rwxr-xr-x) にする。
busybox を /system/xbin/ にインストールする(busybox の提供しているコマンドのシボリックリンクが作成される)。

参考までに、busybox インストール前の状態は以下の通り。
$ pwd
pwd
/system/xbin
$ ls -l
ls -l
-rwxr-xr-x root     shell      134508 2010-10-13 06:28 strace
-rwxr-xr-x root     shell        5352 2010-10-13 06:28 vfp-crasher
-rwxr-xr-x root     shell        9700 2010-10-13 06:28 ipctool

7. Superuser アプリのインストール
Superuser.apk を /system/app/ にコピーする。コピーに失敗した場合は /data/app/ にコピーする。

8. /system のリマウント
/system を 読み取り専用にしてリマウントする。ファイルシステムが使用中の場合は開放されるまで待つ。
ここまでの処理でやることは全て終了したため、元に戻しておくわけだ。

9. su のテスト
su のテストができる。su コマンドを実行して root 権限に昇格できたかどうかを表示する。

10. 寄付
寄付する場合は Paypal のサイトをブラウザで開く。

以上で終了。Root 処理完了後は、SC-02B 本体を再起動しておくとよい気がする。
mount コマンド等は busybox を利用して実行するが、万一失敗した場合には Android が提供しているコマンドを使ってリトライするようになっている。busybox もインストールされるので、cp コマンド等もそのまま実行できるようになるので便利。
一番肝心な adbd を root 権限に昇格させる exploit の詳細については別エントリでまとめる予定。

0 件のコメント:

コメントを投稿