aamall

2012年04月13日

Androidのroot化の仕組み/Root kitの製作方法 part1

part2へ > restoreを用いたrooted

先日 Xpreia acro HD を購入しました。

1.5Ghzデュアルコアプロセッサに加え、防水や
所謂ガラパゴス携帯の各機能を搭載しており、
初代Xperiaから乗り換えた身としては、
素晴らしいレスポンスに関心しています。

さて、そんなacro HDですが、ただ1つ残念な
ことに未だに"root化"する方法が確立されていません。
>root化可能になりました(->こちら)

2011年までに発売されたXperiaシリーズでは
便利なroot化キットが用意されており、簡単に
root化することができます。


今回はメールで質問をいただいたので

・なぜacro HDではrootを取得することができないのか
・rootkitはいかにしてrootを取得しているか
・root化すると何ができるようになるか、危険はないのか


などなどを数回に分けて解説してみようと思います。
なお本記事には実際の exploitコードや rootkit用スクリプトの
作成方法も交えて解説します。内容は少し複雑めなので
ご注意ください。







〇そもそもroot化とはどういう状態か?

現在発売されているほとんどのAndroidスマートフォンの型番で
検索をかけると、ほぼ間違いなく root化 が検索候補として
上がります。 このAndroidの root化 とはどういう状態なの
でしょうか?

例えば、普段使っている普通のコンピュータを考えてみましょう。
自分のパソコンのデータは隅から隅まで自由に扱うことができます。

自分の保存した動画や、写真はもちろん、システムの重要ファイルに
至るまで、自由にアクセスすることができますし、自由に追加の
アプリケーションをインストールすることもできますね。

一方
今度は、学校や職場にあるコンピュータ、もしくは家電量販店に
置いてあるようなパソコンを考えてみると、必ずしもそうでは
ありません。学校のパソコンに追加のアプリをインストールしようと
しても多くの場合許可されませんし、コントロールパネルなど
システムの詳細な設定を開くこともできません。

上記のような環境のコンピュータでは、
 重要な設定やファイルへのアクセスへの制限
がかかっているからですね。


ところで
Androidスマートフォンに搭載されている、Androidというシステムは
おおざっぱに言ってしまえば、元々パソコン用OSとして開発されている
 Linux
というカーネル(中核)の上に、Dalvikというプログラムの実行環境(※)
が乗っているような形態をしています。

※実行環境
ここでは説明をぼかしているが、正確にはDalvik仮想マシン。
簡単に言えばモバイル用途に特化した Java仮想マシンのようなもの。
ただし、動作しているバイトコードはJavaとは全くことなり、Javaの
互換試験にもパスしていないので Java とは言えない。
このDalvikのおかげで、どんなハードウェアの上でも同じアプリの
コードが同じように動作することができる。



AndroidシステムのコアであるLinuxは元々パソコン用のOSなので
本来であれば、PCと同じように完全に自由に内部の設定を変更したり
重要なファイルへアクセスすることが可能です。

ですが、残念なことに現在市場で販売されているAndroid端末は
上記の”学校のパソコン”のように、重要なデータにはアクセスできず
メーカーが許している限りの範囲内でのアプリしか動作させることは
できません。

root化 というのは、Linux をはじめとしたUNIX系OS で最高の
権限を持つroot権限を自分のAndroid端末で行使できるような
状態にすることを指します。

root化することで、よりパソコンに近い自由度の操作が可能になり
例えば、
CPUのクロックを操作したり、
複雑なチューニングを行ったり、
メーカーの邪魔なプリインストールアプリを削除したり、、、
といったことが可能になるわけです。



〇Rootkit とは?


root化 = root権限を行使できるよう状態にすること とは書きましたが、
当然Androidシステムには root権限を行使できないようなロックが
かかっているので
「root権限を使いたい」
と思ったからといって、すぐ自由に使えるようになるわけではありません。

なんらかの方法でこのプロテクトを解除することが必要です。

しかし、素人であるエンドユーザーには自力でセキュリティを突破して
許可されていない権限でプログラムを走らせるような真似が
できるわけがありません。

そこで登場するのが、 rootkit と呼ばれるツールで、このツールを
使うことで、素人でも簡単に root化 を達成できるようになっています。




〇Androidでroot化するまでの大まかな手順


Androidのroot化プロセスは、いわゆるパソコン上でのハッキング
のようにハッカーがその場でroot権限を奪取して侵入を果たす
だけではなく、一旦root化作業を行ってからは、次回以降簡単に
アプリからroot権限を求めることができるようにシステムを
改竄する必要があります。

大まかな手順は以下の通りです。

・exploitの用いた、一時的なroot権限の奪取

・/systen の rw(読み書き許可)モードでのリマウント

・rootの恒久化(いわゆる su と Superuser.apkのインストール)


簡単に書いてしまえばたった3ステップですが、現在は
各ステップにメーカーが防止策を用意しているので
一筋縄にはいきません。



〇 exoloitを用いたroot権限の奪取


ハッキングの最初の手順は、exploitを用いた一時的なroot権限の
奪取です。 ここでの exploit とは、Android (Linuxカーネル) の
セキュリティホールをつくことで、本来ならば許可されていないはずの
root権限を奪い取り、一時的に最高権限を手に入れるための
プログラムのことを指します。

この段階ではまだ、exploitがroot権限を奪取しても、
いったん電源を切ってしまえばまたシステムは元に戻ってしまいます。


・ZergRushの例

実際に使用されたexploitとして最も強力だったのが
 ZergRush という exploitでした。
2011年に発売されたほとんどの端末を攻撃することが
可能なexploitです。

このexploitは、FrameworkListener::dispatchCommand()
に不正な引数を与えることでバッファーオーバーフローを
引き起こし、一時的にroot権限を奪うことができます。

root権限を奪うことに成功すると、exploitに記述された
命令はすべて root権限で動作します。

levitator-success

※画像元はこちら

これはLevitator という ZargRushとはまた別のexploit で
PowerVR SGX をグラフィックチップに採用した Android 2.3.6
までのシステムで動作します。ご覧のとおり、exploit実行前は
id=2000(shell) と"shell" というユーザーの権限で動作していたのに
対し、exploit実行後に再度 id を確認すると id=0 と root権限で
コマンドを発行できるようになったのがわかります。


levitator.c
 ソースコードはこちらです。

バッファーオーバーフローにてなぜroot権限が奪取可能かについては
 以前の記事 なども参考にしてください。




〇 /sytem のrwリマウントとroot恒久化


exploitでroot権限を奪えたとしても、上記のとおり、
exploitのコードが終了した時点で、システムは通常にもどります。
当然 exploitが root権限を取得したからといって、一般のアプリから
root権限を要求できるようになったわけでもありません。

よって、一般アプリからでも簡単にroot権限を要求できるように
するためにAndroidのシステムを改竄する必要があります。
改竄といっても カーネルの実行ファイルを書き換えるような
複雑なものではなく、
 su や Superuser.apk  といった
一般ユーザーから root権限を要求できるようにするためのアプリを
/system/ 以下の決まった場所に保存して、尚且つ、それを一般
ユーザーが実行してもいいという "実行権限"を付与してあげれば
よいのです。


su が設置できれば、普段のLinuxコマンドを使うように su コマンドで
rootになることが可能ですし Superuser.apk があれば 一般のアプリ
からでも呼び出せるようになるわけです。

ただ、問題なのが、suや Superuser.apk を設置したい
 /system ディレクトリ以下は
 ro(read only=読み込みのみ許可)モード
になっているため、これを rw(read/write=読み書きの許可)モード
に変更して再度開く必要があります。

このモードの切り替えができるのが root権限だけなのです。
またツールのコピー後に、実行権限を与えるのにもrootの権限が
必要です。
これが、第一段階で一時的にrootの権限を奪わなければならない
理由です。


exploitで一時的にroot権限取得

/systemを読み書き可能にする

/systemにsuなどのツールをコピーする
 また実行権限を付与する

一般アプリからroot権限が要求可能になる


という流れになります。
一時的にroot権限が取れていれば su や Superuser.apk の
設置自体は cp や chown chmod といった基本コマンドを使うだけ
なので難しくはありません。



以上が大まかな root化のしくみです。

ただし、現在では上記のようなシンプルな方法では、簡単に
rootが奪えないような仕組みが色々と出来上がっています。


例えば

 ・ su という名前のファイルがあった時点でエラーが出る
 ・カーネルレベルで /system が ro モード以外なら、エラーが出る


といったようなメーカー独自の対策が施されている場合があります。

このような場合は、 exploitで一時的にrootを取得したあと、
幾つか特別な操作が必要になります。
例えば、 su という名前があったらエラーが出る といったような
比較的単純な対策の場合は
 /system/lib/
以下の so ファイルを解析することで、解除が可能な場合があります。
このディレクトリ内の so モジュールは起動時に自動的にカーネルに
組み込まれるのでセキュリティの追加機能もここに保存されています。


例えば 有名な例として IS04 で使われていたのは
 /ststem/lib/libsecurecheck.so
です。

このlibsecurecheck.soをバイナリエディタで開いて、
 su や sudo が存在しているとエラーが出るように
なっているものを
 su -> XX   sudo -> HACK
などと適当な文字に置き換えてしまい、対策を回避したり
/system が ro 以外あればエラーがでるところを
/proc など、差し障りのないディレクトリにすり替えることで
回避することが可能でした。

Android「suやsudoはあるか調べよ!」
という命令を
Android「XXやHACKはあるか調べよ!」 
とすれば、なるほど、すり抜けられるわけです。
※逆にほんとうに XX や HACKといったファイルがあれば
 エラーになります。

加えて現在では、LSMを用いたカーネルレベルのアクセス制御
などが行われている場合もあります。
この場合だと kmem といった カーネルのメモリ空間を
直接書き換えるようなツールを使ったり、
F-05Dのroot化で効果を発揮した lsm_disabler といった
専用のモジュールを用意しなくてはいけません。


ということでAndroidのroot化のために必要な手順はあらかた説明
しました。

part2 > restoreを用いたrooted

記事がうまくかければもう一歩進んで exploit の見つけ方も
扱うかもしれませんが、これについては易しく書くことができるか
分からないので未定です。。。








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

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



hiroumauma at 00:16│Comments(14)TrackBack(0) Hacking | Android

トラックバックURL

この記事へのコメント

             
1. Posted by 通りすがり   2012年04月13日 23:57
初心者ですがとても面白い記事でした。続きにも期待しています。
2. Posted by 犬助   2012年04月15日 01:16
Androidのroot化を調べていてこのページを見つけました!!

色々なサイトでもここまで深い内容のページは初めてです!とても参考になりました!次回も楽しみにしていますねっ!!

質問:
hiroumaumaさんはどうやってこのような知識を身に着けたのですか???とっても気になります!教えてください!!
3. Posted by とても面白い記事でした。   2012年04月15日 18:18
5 参考になりました。
次回も期待しております。
4. Posted by ipodマン   2012年04月22日 23:46
ファルコンのOSってもう配布してないですか?
5. Posted by hiro   2012年04月23日 04:55
4の方  ubuntuなんかでアイコンや壁紙を入れ替えたりすればそれらしくできると思うよ。 ただ配布は著作権なんかの問題で、Upした人が罰せられる可能性があるので今後も出ないとおもう。自作してみな。
6. Posted by td   2012年05月25日 23:16
自分も同じ機種を使用しています。
非常によいスマホなのですが、画面下部の黄ばみが気になります…
続きが気になるので、暇なとき更新してください!
7. Posted by 名無しさん   2012年06月24日 12:53
どうやらroot化できるようになったみたいです
8. Posted by Tanaka   2012年10月07日 10:27
5 一部の設定ファイルを書き換えたいだけで、root化が必要なアプリは動かなくてもいいのなら、Step2までできればStep3はできなくても可能と考えていいのでしょうか?
やりたい事は、MVNOのテザリング制限解除と、A-GPSサーバーの書き換えです。

root化方法が確立されていない機種でも、どのStepまでなら解析が進んでいるか分かるようなサイトはありますか?
9. Posted by hiroumauma   2012年10月07日 11:01
>Tanakaさん
exploitで一時的にrootを取得し、/systemがrwでマウントできていれば、記事にも描いたsuやbusyboxなど対策されている場合を除けば、ファイルの改竄だけは可能でしょう。suなどを配置する代わりに他のデータを出し入れするだけですから。。。

↑のようにsuやbusyboxを置かず一時的にroot権限でコマンドを実行できるような状態のことを shell root状態 といいます。

ただ、/system を rw にした時点で再起動してしまう機種もあるのでそんなに単純な話ではないことも一応書いておきます。また最近では exploitよりも build.prop を使う方法
(>http://blog.livedoor.jp/hiroumauma/archives/1555869.html)
のほうが主流になっていますし、一概には言えないですね。

ちなみに root化の進捗情報サイトですが申し訳ありませんがそういったサイトは僕は知らないですね。。。似たようなwikiならありましたが掲載機種も古くておそらく参考にならないかと。。。
10. Posted by Tanaka   2012年10月07日 21:16
忙しいのに素早い返信ありがとうございます。
11. Posted by hira32   2013年03月09日 08:34
5 わかりやすいです。
大変参考になりました。
12. Posted by hira32   2013年03月09日 08:35
5 わかりやすいです。
大変参考になりました。
13. Posted by GPS   2013年04月13日 16:18
現在adb restoreを使ったroot化の方法がよく使われていますがその動作原理を教えてください。
14. Posted by hiroumauma   2013年04月14日 20:19
>GPSさん

最新記事にて解説しました。
宜しければご覧ください。

コメントする

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