aamall

2013年04月14日

Androidのroot化の仕組み/restoreを用いたrooted part2

お久しぶりです。

長いお休みでしたが、帰って来ました。

さて、復活第一弾を何にしようか悩んでいたのですが、
13日に、ちょうどブログコメントにて質問も頂いていましたし、
Androidのroot化な話題で行こうと思います。






前回はAndroidのroot化の仕組みとして、少し古い手法である、
 exploit を用いた root権限奪取について簡単に書きました。

今回は、より実践的に、Android 4.X の端末で実際に使用されて
いる、 所謂 restore芸 の仕組みについて簡単に解説します。

○restore芸のやろうとしていることは何か?

基本的な方針としては
 /data/local.prop
の改竄を目指すハックです。

Androidには多くの設定ファイルが存在しますが、
/data/local.prop には特にシステムに対する設定を記述することができます。

platform_system_core-init-property_service.c

に、対策以前は
   load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
    load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
    load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);

との記述がありました。ちなみに、

 #define PROP_PATH_SYSTEM_BUILD "/system/build.prop"
 #define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop" 
 #define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"

と定義されているので、
/system/build.prop
→ /system/default.prop
→ /data/local.prop

と順番に設定を読み込んで local.porp は OVERRIDE と明示されているのが
わかるように後に読み込んだものはより優先されるようになっています。
Androidで使用電力のチューンなどを行ったことがある方は
 build.prop などは馴染みのファイルですね。


さて、つまり /data/local.prop に設定を書き込むと build.prop などがどんな
設定になっていても、優先的に設定が可能になっているわけです。

さらに

platform_system_core-adb-adb.c
を見てみると

  /* run adbd in secure mode if ro.secure is set and
    ** we are not in the emulator
    */
    property_get("ro.kernel.qemu", value, "");
    if (strcmp(value, "1") != 0) {
        property_get("ro.secure", value, "1");
        if (strcmp(value, "1") == 0) {
            // don’t run as root if ro.secure is set…
            secure = 1;

ro.kernel.qemu という設定項目があります。
ro.kernel.qemu=1ではない時
 ro.secure の値が 1 なら secure = 1 に設定しています。

secure = 1 になっているとAndroidをUSBケーブルなどで接続して
デバッグすることができる ADBの機能を使った時、shellという
ユーザーIDを与えられて一般権限しか使えなくなります。

secure = 0 の場合は ADBにて root権限が行使できます。

qemuというのは Android SDK(ソフト開発環境)で使われる
エミュレータで、デバッグなどに用いるため、rootの権限が必要に
なることを想定した実装です。

さて、ここまで見ればわかるように
 /data/local.prop
に ro.kernel.qemu=1 という一行を書き加えると、
AndroidとPCをUSBケーブルでつないだ時に、デバッグ機能から
root権限を呼び出すことができる!

というわけです。

ですが、そう簡単でもありません。
/data/ 以下は通常 root権限がなければ書き込み不能なので、
rootを使えるようにする設定ためにroot権限が必要
という状態になっています。

そこで、なんらかのテクニックを用いて
 /data/local/prop というファイルを生成し、
その中に ro.kernel.qemu=1 を記述する方法が必要です。




○tmp芸

tmp芸 は Android 4.0 の初期に使えた、上記の local.prop
を改竄するタイプのテクニックです。

Androidは 起動時に init.rc という起動に必要な処理が書かれた
スクリプトを実行するようになっています。その中の実装が問題でした。

起動時に
/data/local/ や
/data/local/tmp
というディレクトリを生成しますが、このディレクトリは重要ディレクトリ
ではないのでこのスクリプト内で

    mkdir /data/local 0771 shell shell
    mkdir /data/local/tmp 0771 shell shell

と言った感じに shellユーザーでも使えるようにしてくれていました。

これが問題でした。


ところで
Android というより UNIX/Linuxのコマンドに
ln -s というコマンドがあります。
このコマンドは "シンボリックリンク" というものを生成するコマンドです。

あるファイルにシンボリックリンクをはると、リンク情報だけが記された
データサイズは0のファイルが作成されます。このシンボリックリンクに
通常のファイルのようにアクセスすると、自動的に リンク元のデータを
読み書きすることができます。

ということで、
 ln -s /data/local.prop  /data/local/tmp

とコマンドを実行します。こうすることで
 /data/local/tmp へのアクセスは /data/local.prop
へのアクセスと同じ事になります。

この状態でinit.rcは  /data/local/tmp の権限を shell ユーザーが
アクセス可能に変更するので、当然 /data/local.prop のアクセス権も
shellさんがアクセス可能なものに変更されるわけです。

つまりは ln -s しておけば、起動時に勝手に権限を書き換えて
くれる。という間抜け状態にすることができました。

流石にこのミスはすぐに修正されてしまいましたが、この
シンボリックリンクを使った方法は、その後も使うことができます。

restore芸もこのシンボリックリンクを使っています。



○restore芸

tmp芸で証明されたように、
システムが勝手にディレクトリを生成するなどした時、
そのディレクトリがshellユーザーのアクセスを許すものなら、
そのディレクトリに シンボリックリンクを貼ることで、
 local.prop が生成でき、同時にshellユーザがアクセスできる
ようにできます。

restore芸では、 Androidの Backup/Restore の機能を使って
この状態を引き起こしています。

バックアップ作業中にシステムが操作するディレクトリの一つが
アクセス権限 777 = 誰でも読み書き可能
に設定されるので、これを用いて、tmp芸と同じように
 /data/local.prop
の権限改竄が可能になった。


というわけです。

ちなみに ICSでは adb backup [パッケージ名] 
で backup.ab というファイルが出力されますが、
パスワード無しで生成した場合
 24バイトのヘッダ + 本体となっており
Linux系OSなら
$ dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar

などでstripすることで解凍し、用意に改竄が可能です。
ちなみに先頭のヘッダ 24byte は
--------------------------------
ANDROID BACKUP
1
1
none
--------------------------------
を意味する
41 4E 44 52 4F 49 44 20 42 41 43 4B 55 50 0A 31 0A 31 0A 6E 6F 6E 65 0A
です。


○おまけ restore芸を用いた FT103 v2 の rooted

先日 FT103 v2 を購入しました。

簡単に商品の説明をすると、 21.5型 1920x1080 の
ディスプレイ で、 microHDMI で映像を入力できます。
まったタッチパネルを搭載しており、 USB接続を合わせて
行うことでタッチパネルとして動作します。
Linuxでもタッチパネルとして動作しますよ!

そして、このディスプレイは、ディスプレイ独自にAndroidタブレット
としての機能があり。映像入力がない場合は、Android 4.0
タブレットとして振る舞います。
プロセッサ等は非力ですが、PCが起動していないとき、
ちょっとブラウザを開いたり、NASにおいてある音楽,動画を見たり
SIPクライアントとして、机の上から家中の内線に電話を掛けたり、
と色々マニアックな使い方ができます。




もともとニッチな製品ではありますが、
日本で取り扱っている同系製品のなかでは飛び抜けてコストパフォーマンスが
高いのが特徴です。

さて、この端末、当然半自動なroot化ツールなど存在しないだろう。

と、僕は手動で root化しました。

実はその後 root化ツールが公開されている
らしいことを友人に教えてもらいました。。。早く気づけばよかったです。。。


まぁ今更しょうがないので、僕が root化した際に入力したコマンドを解説を入れつつ
記しておきます。。。
多くのAndroid 4.0 搭載端末で同様の手法が有効です。


#必要な環境
 ADBにてAndroidに接続可能であること
 dummy.ab ・・・resotre を実行するためのダミー復元ファイル。拾い物(f-10d.ab)をリネーム
 suバイナリ ・・・ su コマンドのバイナリデータ。参考にした lootkit から流用
 Superuser_3.1.3.apk ・・・root権限を必要とするアプリの権限昇格を管理するアプリ。
                 入手もとは同上


○ シンボリックリンクの作成
adb shellにて
:$ In -s /data/local.prop  /data/data/com.android.settings/a/file99

下記の dummy.ab をリストアすると
/data/data/com.android.settings/a/ 以下に
file00 から file99 までが生成されます。
そして この /a 以下は

 drwxrwxrwx system   system
に設定されるので、 /data/local.prop も 777 になるという手順です。

○リストア用データのセット
PC端末上にて
$ adb restore dummy.ab

この段階で 端末から バックアップと復元 の画面にて
リストアを選択します。
すると、上記のとおり、 /data/local.prop が 777の状態に
なります。

asb shell にて
$ ls /data/local.prop

で local.prop の生成を確認します。

ここで端末の再起動を行います。

再度 adb shell にアクセスします。
この時点でadb shell では root権限が行使可能です。

○suの配置と権限設定

adb から su の送信
$ adb push su /data/local/tmp/su

asb shellにて
# /data/local/tmp/su  /system/bin/su
# chown root.shell    /system/bin/su
# chmod 06775        /system/bin/su
# rm /data/local.prop

ここで再度再起動します。
※セキュリティ的によろしくないので su 配置後は
/data/local.prop を削除したためです。


○Superuerのインストール

$ adb install  Superuser_3.1.3.apk


以上で完了です。


次回以降は色々考えていますが
Androidが今ホットな気がするので

12345





Androidでそれなりに実用的、本格的な ミュージックプレーヤの
実装を趣味でやっているので、その辺りを取り上げてみようかな。。。
と思っています。









[!]Linuxをはじめよう!の運営にご協力ください
こちらよりAmazonギフト券による支援を募集しております。

受取人のEメールに hirohorse2-suplbl(アットマーク)yahoo.co.jp を設定してください
少額でも非常に助かりますので、お気に召されました記事がありましたら、何卒ご支援の方よろしくおねがいします。



hiroumauma at 20:18│Comments(21)TrackBack(0) Android | Hacking

トラックバックURL

この記事へのコメント

             
1. Posted by えくすぺりーぬさん   2013年04月14日 22:29
part2心待ちにしてました!
2. Posted by 名無氏   2013年04月14日 23:05
浪人生活がんばってください
3. Posted by 風吹けば名無し   2013年04月14日 23:10
ありゃ浪人ですか、大変ですね・・・
開発諸々頑張って下さいね!
4. Posted by 復活記念   2013年04月15日 10:47
前回よりちょっと難しいです…。

じっくり読みたいと思います。

ともあれ復活おめでとうございます!!
5. Posted by 男子高校生   2013年04月29日 00:17
ありゃ、浪人ですか
大変ですね

androidアプリの作り方について興味があるのでぜひ記事にしてください
6. Posted by 平松   2013年05月16日 14:52
初めまして、

SO-03Dのroot化で日夜、がんばっているのですが、うまくいきません。
root権限がとれず困っています。
症状はrootingKitの中で、
LT-26Wのバッチ処理実行時、
Error!bckup.tarがありません。のメッセージが出て前へ進みません。
何が原因か御教授願いませんか?
7. Posted by hiroumauma   2013年05月16日 23:12
>平松さん

SO-03Dはroot化に成功してからある程度時間もたっており、正しく作業すれば高い確率で正常にrootをとることができるはずです。

こちらの通りにやれば問題ないはずです。
> http://xperia-freaks.org/2012/11/27/so03d-rooted/

他には下のような方法もあります
> http://www50.atwiki.jp/acrohd/pages/72.html
8. Posted by 平松   2013年05月19日 17:51
言われた通りすれば、見事、ルート化出来ました。有難うございました。
目的は、APN強制解除なんですが、1を0に変更し、その下の3行削除、端末リセットしました。
デザリングエラーは、なくなりましたが、ネットには、つながりませんでした。
モバイルネットワークは、IIJMIOです。
あと、何が原因なのでしょうか?
御教授願います。
9. Posted by hiroumauma   2013年05月19日 18:27
>平松さん
その手順では確かに不十分です。

こちらの方法が有効です。
> http://higitune.blog106.fc2.com/blog-entry-78.html

上記サイトでは、dbファイルを摘出して、Windows上で処理を行なっていますが、端末でsqliteコマンドが使えれば端末単体でも操作可能です。

sqliteコマンドの整備ですが、Titanium Backupを使用していればパッケージに含まれていますので簡単に使用することができます。

>http://mstssk.blogspot.jp/2011/12/xperia-rayrooted.html

↑こちら参考です
10. Posted by 平松   2013年05月27日 23:03
いつもお世話になります。
その後、バックアップと復元(SO-03D本体)の復元を行い、デザリングが出来ました。
又、CWMrecovery導入で、無事、backupも取れました。
有難うございました。
11. Posted by プログラマ   2013年08月23日 11:36
5 こんにちは。
いろいろ面白いこと書いてるなーと
思って、ここ見てたら、
まだ高校生(浪人生)だったのですね。

驚きました。
まだごく一部しか見ていないのですが、
中学ぐらいから探究心旺盛だったのですね。

目標とする大学は東大か東工大ですかね?

私は社会人ですが、東大の図書館に
見たい書物や資料があるので、
来春受験して、社会人学生してやろうかと
思っている次第です。

では受験がむばってくださいね~!
12. Posted by 平松   2013年09月07日 18:53
御無沙汰してます。
以前、SO-03Droot化でお世話になった、平松です。又、別件で御教授できませんか??
Xperia GX SO-04Dをroot化したくて、9.1.C.0.475)におけるワンクリックroot取得 を
したところ、見事、root化出来ました。
これで、デザリングのためのデータを書き換えれば、うまくいくと喜んでいたのですが、
肝心の3G、SIMM通信がダメになりました。
MODEMのデータを入れ替えれば、治るかな考えているのですが、その方法がわかりません。
ちなみに、初期バージョンは、7.0.D.1.117でした。
何卒、よろしくお願い申し上げます。
13. Posted by hiroumauma   2013年09月10日 02:15
>平松さん
新着コメントの通知を見逃しておりました。
返信が送れて申し訳ありません。

ワンクリックrootのスクリプトで通信が影響を受けるのは考えにくいです。おそらく違う要因があると思うのですが、なにか心当たりはございませんか?

テザリング設定のための書き換えなどでAPN設定などが崩れていたりはないでしょうか?
14. Posted by 平松   2013年09月10日 22:02
すいません!
sony mobile update serviceで、9.1.C.0.475に戻しました。
やはり、楽して、ワンクリックよりflashtoolでROM焼きをするのが、ベターかなと思いました。
、9.1.C.0.475をROM焼きでroot化したいのですが、日夜、net検索かいなく、見つかりません。御存じでしたら、お教え願いませんか?
15. Posted by 名無し   2013年09月17日 21:58
tmp芸のところで、Android 4.0の初期に使えたと書いてありますが、それ以前のAndroid 2.xなどでは使えないのでしょうか?
また、使えないとしたらそれはなぜなのでしょうか?
16. Posted by hiroumauma   2013年09月19日 02:07
>名無しさん

このバグは、
"既に存在するディレクトリ"を
権限情報指定付きでmkdirしようとした時、

これまではエラーを出すだけだったのですが、

https://github.com/android/platform_system_core/commit/27164dce5f0788476449057c978fa24e62245cb8

↑この変更で
ディレクトリが存在するのにmkdirされた場合取り敢えず chmod だけ呼び出すように変更されています。

更新主は、良かれと思ってのことでしょうが、結果的にchmod -> chown が出来る状態になってしまったわけです。

それ以前のバージョン、及び問題発覚後のバージョンではエラーになりますので
ICS初期時代の端末のみでのハックになっています。

17. Posted by SH   2013年09月20日 02:33
はじめまして。
いつも大変興味深く拝見させて頂いております。
質問させて頂きたいのですが
ソースは公開されているのですが
https://sh-dev.sharp.co.jp/android/modules/oss/
SHT21、SH-08のroot化は可能なのでしょうか?
宜しくお願い致します。
18. Posted by hiroumauma   2013年09月22日 16:19
>SHさん
ちらりとしてか調べていませんが、
両モデルともroot化に成功している例は見つかりませんでした。

同じAndroidといっても、各メーカー各所に手を入れてきていますので同じexploitが必ずしもどの端末でも動作するわけではありません。

XDA等でAndroi4.1or4.2でも動作するexploitが複数公開されていますので、それらが動作すればラッキーといったところだと思います。
19. Posted by mitsuru   2013年09月28日 23:07
restore芸についてですが、adb restore 時に、一旦/data/data/com.android.settings/a/file99 は消されないのでしょうか?
上書きでも、シンボリックリンクのファイルに通常のデータを上書きなんてできるのでしょうか?

Linux(Unix)についてあまり詳しくないのですが、どのような動作をして tmp芸やrestore芸のような状態になるのか、もう少し詳しく説明していただけると助かります。
20. Posted by mitsuru   2013年09月28日 23:11
すみません、コメント19の質問ですが、コメント16に記載がありました。
見落としておりました。申し訳ありませんでした。
21. Posted by lose weight   2013年10月19日 13:11
Linuxをはじめよう!:Androidのroot化の仕組み/restoreを用いたrooted part2

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
月別アーカイブ