PSPのHomebrew Enabler(HEN)はどのようにして動いてるのか





wololo.netで、freddy氏がPSPのHomebrew Enabler(HEN)とは何かの解説記事を掲載していました。

まず、この記事の投稿者はwololo氏ではなくfreddy_156(freddy)氏になっています。wololo.netで利用しているWordpressはアカウントを追加することで記事投稿ができるようになっています(このブログも可能です)が、個人運営ブログなので自分以外のスタッフに記事を書いてもらう予定はありません。今まではwololo氏もそうだったのですが運用を変えたのでしょうか。

今回のテーマは「HENとは何か」です。このブログを読んでくださる方はHomebrewとは何かということはご存知だと思います。HENについてもHomebrew実行を可能にするという意味のHomebrew Enabler(HEN)ということもご存知でしょう。その仕組みについて今回詳しく説明されていましたので要約してみました。私自身カーネルの動きを理解できていませんので言い回しが間違っている可能性もあります。そのため翻訳ではなく要約になっています。

– パート0 – モジュール? –


まずモジュールとは何か。基本的には実行可能ファイルのことで、PSPは多数のモジュールの集合体になっており個々のモジュールは各々個別のタスクの処理を行う。モジュールはユーザー、VSH、カーネルの3つのレベルで実行が可能である。

ユーザーレベルはHomebrewを実行する場合に当たり、特別なものは何もないノーマルタスクが全てこれに当たる。VSHレベルはあまり使われていない言葉だがユーザーレベルに加えてファームウェアのアップデートのように特別な処理が可能になるようなパーミッションが追加されたものだ。VSHレベルではモジュールをロードしてFlashを書き換えできるよう設定される。カーネルレベルは最も高等なレベルで、制限は一切ないためカーネルモードで実行されるモジュールを全て実行することができる。

HBLはユーザーレベルでのみ実行できるHomebrewのロードを可能にする。一方HENではパーミッションが要求される実行可能ファイルであっても全て実行することができる。公式モジュールは全て署名されているが、ユーザーモードのHomebrewにも署名が可能なことはご存知だろう。カーネルモジュールの場合署名のシステムチェックが行われ、それが無効と判断された場合システムはそれを実行することを拒否する。HENが行っているのは正にその部分で、システムを改変し、署名されていない実行可能ファイルであっても有効なものとして見せかけて実行できるようにしてしまうものだ。

– パート1 – Exploit –


カーネルexploitとは、PSPカーネルに存在する脆弱性で、カーネルレベルのパーミッションでコードを実行できるようにするものだ。これにより全てのことがシステム上でできるようになる。つまり任意のコード(Homebrewと同じ)を実行できることになる。Homebrew Enabler(HEN)の開発スタートはまずexploitを見つけることだと言える。

HENで最初に行われるのはカーネルexploitによりカーネルパーミッションを得ることだ。一旦カーネルパーミッションを得てしまえば重要なファイルが格納される保護されたRAM領域のカーネルメモリーへの書き込みが可能になる。

カーネルメモリーに何故書き込みを行い、何を書き込むのか?それはシステムにとって重要なファイルを実行するようなタスクを司るLoadExecへのパッチをメモリーに書き込むことだ。それは既存のアプリケーションにも適用される。アプリケーションの実行や終了は以下のようなプロセスで行われる。

    LoadExecはアプリケーションから実行/終了を命令される
    LoadExecは”reboot.bin”と呼ばれる実行可能なバイナリーデータをメモリーに読み込みそのアドレスへジャンプする。その際リブート制御は残したままのため、アプリケーション実行を命令された場合は最初にそれをメモリーに読み込む
    reboot.binは読み込みに必要なモジュールリストを含んだpspbtcnfと呼ばれるファイルを分析する
    リストにあるモジュールを全てロードしたらシステムにreboot制御を返す

– パート2 – ペイロード –


メモリーにHENを保持するためにはこの単純なプロセスをハックしなければならない。メモリーにあるLoadExecにパッチをすることでプロセスは以下のようになる。

    LoadExecはアプリケーションから実行/終了を命令される
    LoadExecは”reboot.bin”と呼ばれる実行可能なバイナリーデータに加え、ハックにより加えられた”rebootex”という2つのバイナリーデータをメモリーに読み込み、rebootexのアドレスへジャンプする。
    RebootexはHENのコアである”systemctrl”というモジュールをpspbtcnfに加え、自分で作成した非署名モジュールを読み込むようrebootにパッチを行いrebootへジャンプする
    reboot.binがpspbtcnfを分析し、systemctrlを含む全てのモジュールをロードしたらシステムに制御を返す

rebootexとはハックにより生成されたペイロードで、systemctrlをpspbtcnfに加えることとsystemctrlをロードするためにシステムへパッチするという2つの単純なタスクを実行するのに必要なバイナリーデータに他ならない。

– パート3 – Systemctrl –


SystemctrlはHomebrew Enabler(HEN)のコアである。そのモジュールはHENで読み込まれることで常にカーネルモードで実行され、プラグインなどを読み込むことが可能になるだけでなくシステムにもパッチができるようになる。

systemctrlはloadexecにパッチをすることで毎回rebootexをロードすることも可能になる。そうしないとアプリケーションを起動するたびにHENは毎回失われてしまう。システムの他の部分にも非署名コード(Homebrewやプラグイン)を実行できるようにするためにパッチをするなど複数のパッチが必要になる。パッチを当てないと読み込めないのは先ほど述べた通りだ。

結論


今回はHemebrew Enablerが一般的にどのように動作するのかという説明である。すべてのHENが同じという意味ではない。開発する人によっては別の方法をとるかもしれないが、基本的なコンセプトは同じである。一般ユーザー向けになるべく簡単に説明したつもりだが、もしこれを読んでいるあなたが開発者なら「はしょり過ぎ」と思うかもしれない。だが、そう思うのであればもう一般ユーザーではないので理解できているはずだ。

Tags: , ,

Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です