wololo氏が、自身のブログでPSPのexploitを発見する方法についての興味深い記事を掲載していました。wololo氏はexploitにはならないことは分かっていながらもmp3ファイルでクラッシュするバグを発見したことを公表していましたが(ゲーム最新情報 2009年9月11日のニュース参照)、それをどのように発見したのかを説明しています。【情報源:Wagic, Magic the Gathering, and PSP homebrews】
翻訳のみでお伝えします。
PSPのexploit – ファジング手法でクラッシュを探す今まで何度かお話ししていますが、クラッシュを見つけることがPSPのexploitを発見する第一歩です。(他の機器でも同様なのですが、PSPの場合そのためのツールが充実しているので非常に簡単です)。
そういったクラッシュは通常は偶然の産物(セーブするのを忘れてしまったりという最悪の事態だったりしますが)なのですが、”強制的に”生み出す方法もあります。その一つがファジングです。最近その手法でMP3ファイルでクラッシュすることを発見しましたが(exploitにはならなかったですけどね)、ソフトウェアのテスト手法としては古典的ではありますがクラッシュを発見するためのこの”革命的な”方法は非常にすばらしいと思います。
ウィキペディアでは以下のように書いてあります:
ファジングとは、ソフトウェアの不具合(とくに脆弱性を意図することが多い)を発見するためのテスト手法の一つである。ファズ(英:fuzz)(予測不可能な入力データ)を与えることで意図的に例外を発生させ、その例外の挙動を確認するという方法を用いる。ファズテストと呼ばれることもある。
とても分かりやすいですね。これはプログラムにランダムなデータを投入しクラッシュするかどうかを確かめる方法です。私の場合”プログラムはPSPのmp3プレーヤーでランダムデータというのがmp3の破損ファイルでした。
YouTube:MP3 Crash PSP OFW 6.00.
テストだけならこれで十分なのですが、問題はこの方法でクラッシュを見つけるのは運以外の何ものでもないということです。ただ、PSPのmp3プレーヤーはプレイリストを使えば何千ものファイルを素早くテストをすることが可能なのです。
以下は私がmp3ファイルで実行したことです: 最初は極端に短いmp3ファイルを作りました。音楽の中身を弄くるソフトウエアはオープンソースのものが多いのでそれを用いました。それで1ビットづつファイルの中身を変えて何千ものファイルを作りました。もちろん1つ1つ手入力でなんてやっていません。スクリプトを使いました。私はRubyを使いましたがスクリプト言語であれば何でも構いません。(perl、php、python…その他Linuxのシェルで作ってもいいですし、CやC++でもいいです)。私のスクリプトはこんな感じでした。
スクリプトの内容はこのようになっています: “a.mp3″ というファイル(作成した普通のmp3ファイルです)を開き、iを0から200まで変えながらiに当たる場所をjの値に変更していきます。jは0から255までの値です。つまりファイルの中の全バイトを1バイトずつ変えてみようとしたわけです。これだけで何千ものファイルが出来上がります。iの値ごとにディレクトリを作成すると1フォルダごとに255個のファイルが出来上がります。ちなみに使った1GBのメモリースティックがすぐいっぱいになってしまうので変更したのはファイルの最初から200バイトだけです。もちろんもっとたくさん作ることは可能です。(ただしmp3プレーヤーがmp3のディレクトリで255個以上のサブフォルダを使えるかどうかは確認の必要があります)。この200バイトを変更した分までテストし終えたら次は201から400まで…というように順に実行しました。
これが完了してしまえば、そのファイル(各々のフォルダに入ったままですが、PSPのmp3プレーヤーはフォルダごとに999個のファイルが限界です)をコピーしてあとはすべて再生してみるだけです。
再生には時間がかかります。とはいっても再生中ずっとPSPを見ている必要はありません。たまに見た時にPSPの電源が落ちていたらそれはクラッシュが起きていたということになります。その場合次にファイルを半分に減らし、どのファイルが犯人かが分かるまで再び再生を続けます。
以上がこの手法の全てです。今回はmp3ファイルで実施しましたがもちろん動画ファイルや画像ファイル(スライドショーが使えますね)でも構いません。ただプレイリストの扱いがどうなのかよく分かりませんのでお試しになった方は結果を是非教えてください。この手法のポイントは莫大な数のファイルを短時間でテストすることが出来ることです。数千ものファイル(今回のmp3の場合は50万個ものファイル) をテストとはいってもソフトウェアが実行しうる組み合わせとしてはほんの一部分なのです。(1バイトではなく2バイト変えたら、ベースとなるmp3ファイルを変えたら、mp3ではなくwmaだったら、など考えだしたらきりがありません)。みなさんがこの手法で各自違った組み合わせを試してみることが大切ですが、例えば10個のファイル程度で結果が出るなどという甘い期待は抱かないほうがいいでしょう。
exploitを見つける方法は当然他にもありますが、今回のファジングに関しては利用するメリットがあります: それはプログラムの知識がないと出来ないようなものではなく比較的簡単に取り組める、ということです(もっとも多少スクリプトの知識は必要になりますが、mp3ファイルのどこがどうなるとクラッシュするといった知識は不要です)。時間もそんなにかかりません(大量にファイルをテストしてもシステム的にはちゃんと処理してくれます)。
このファジングの手法でPSPのmp3ライブラリにバグを発見したことで実は私も驚いています。当然ソニーも同じような方法でファームウェアをテストをしているだろうと思っていたからです。
今回の記事がソフトウェア側のセキュリティを設ける側の方々と、それを破ってDRMの悪夢から世界を解放しようとする方々に次のきっかけを与えることが出来れば、と思います。ハッキング万歳!
exploitを発見することが手柄のような風潮があり、その手法を公開するようなケースはまれだと思っていましたがさすがwololo氏はちょっと違いますね。
彼自身も普段からクラッシュバグを探していると思いますが公開されている数も少ない上に本当のexploitにまで至っていません。そのことは如何にexploitにつながるPSPシステムの脆弱性の発見が困難かを物語っているのではないでしょうか。とはいえ、多くのユーザーがバグ発見に取り組めばexploitが見つかる確率は確実に上がります。wololo氏の狙いもそこにあります。
FreePlay氏が、PSP goのeLoader(Homebrewローダー)を準備中(ゲーム最新情報 2009年11月8日のニュース参照)だそうですので、これを機にPSP goのハッキングが盛り上がるといいですね。