ファームウェア解析への『うさみみハリケーン』活用について
概要と参考資料
この解説では、当ソフトウェア『うさみみハリケーン』同梱の汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」を用いた、各種ファームウェアのバイナリファイルから、ファームウェアの設定ファイルや実行ファイル等を抽出する方法を、実際の抽出例で説明しています。この抽出アプローチは、情報セキュリティにおける公益を目的として、ファームウェアの脆弱性やバックドアおよび隠し機能などを解析するためのものです。対象となるファームウェアは、WebカメラやWi-Fiルーターなど、IoT機器に該当する組み込み機器のものを想定しています。下記の抽出例では、ネット上で配布されているファームウェアを使用しました。ファームウェア解析を含む、IoT機器の解析に当たっては、解説「IoTセキュリティ対策 診断・解析入門」が参考になります。また、SPI(Serial Peripheral Interface)やJTAGを用いて、フラッシュメモリ(フラッシュROM)からファームウェアをダンプするアプローチは、「IoTSecJP ~SPI ハッキング入門~」などの、優れた解説がネット上に散見されるため、参考にされることをお勧めします。
近年、電子機器のファームウェアにおける、難読化等による解析耐性の強化や改ざん検知といった、セキュリティ対策の必要性が高まりつつあります。このようなセキュリティ対策の実装により、下記で解説するような、ファームウェアの設定ファイルや実行ファイル等を抽出するアプローチに支障が生じるケースも予想されます。
下記で使用する「ファイル・データ抽出」機能の実装に当たっては、Linux用の、指定ファイルに含まれる各種ファイル・データ検出を行うツール「Binwalk」や、同様に各種ファイル等の抽出を行うツール「Foremost」の解説を参考にしました。また、日本で1990年代から複数公開されてきた、PCゲーム用の画像・音声ファイル抽出ツールの挙動や解説も参考にしています。なお、後述する圧縮解凍ソフト「7-Zip」のDLL版を使用することも検討しましたが、エクスプローラのようなユーザーインターフェイスの実装は工数が嵩むため、7-Zipの優れたファイルマネージャを併用した方が良いと判断しました。
プログラミングという観点での、ファームウェア解析・再構築の考察には、「Firmware Modification Kit」のソースコード等が参考になるとみられます。
Webカメラ(ネットワークカメラ・IoTカメラ)のファームウェア本体抽出例
●アプローチ例下記アプローチ例の説明を読む前に、「青い空を見上げればいつもそこに白い猫」に実装した「ファイル・データ抽出」機能など、当ヘルプ内にある各機能の解説を読まれることをお勧めします。
まず、「青い空を見上げればいつもそこに白い猫」でファームウェアのバイナリファイルをオープンします。「青い空を見上げればいつもそこに白い猫」は、ファイルアナライザ「TrID」と「Detect It Easy」のファイル判別エンジンおよび、拡張子判別ソフト「WinExChange」のDLL版である「WinEx32」に対応しています。しかし、これらはファームウェアの解析を想定した判別エンジンではないため、ファームウェアのバイナリファイルは適切に判別できません。

「文字コード別文字列抽出」機能で、文字コードを「ASCII(NULLなし)」に設定して文字列抽出を行い、出力された文字列群を考察します。この機能は日本語文字列の抽出にも対応していますが、ファームウェアの解析で日本語文字列の抽出が必要になるケースは少ないと見られます。

「バイナリデータ視覚化表示」機能でエントロピーマップなどを表示し、対象ファイルの構造を考察します。この機能は、「青い空を見上げればいつもそこに白い猫」が実装するバイナリエディタと連動させることができます。

「ファイル・データ抽出」機能で、内包されるファイルやデータの検索を実行し、検出されたLZMA圧縮データやcpioアーカイブなどを抽出します、ファームウェアの場合はLZMA圧縮データが使われることも多いため、検索の前に「検索除外対象を指定」オプションで、「zlib/LZMA/xz/gzip/ARJ」のチェックを外しておきます。zlib形式やLZMA形式のデータはその仕様上、検索時に多数の誤検出を生じかねないため、初期設定では検索除外対象に指定しています。

「リスト選択項目を保存」ボタンで、検索結果を基に抽出・保存を行います。抽出・保存にあたっては、必ず抽出サイズの設定「サイズ不明分の仮定サイズ」が必要十分になるように注意して下さい。元ファイルサイズ以上のサイズを指定しておけば問題ありません。ここではオフセット0000'00050040に見つかったLZMA圧縮データをファイルとして保存します。ファイル名はオフセットと推定拡張子により「0000'00050040.lzma」となります。ファイル保存先は元ファイルと同じフォルダです。
抽出・保存したバイナリファイルを、ファームウェアで用いられる特殊な圧縮形式に対応した圧縮解凍ソフト「7-Zip」で解凍(展開)します。あらかじめ7-Zipの設定(メニュー「ツール」→「オプション」)で、拡張子「lzma」と「cpio」および「squashfs」に7-Zipを関連づけておくと、アプローチの工数を低減できます。同様に、7-Zipの設定で、外部ツールのうち表示用ツールに使い慣れたテキストエディタを指定しておくこともお勧めします。なお、この解凍(展開)処理は、7-Zipと同じくエクスプローラのようなユーザーインターフェイスを持つ圧縮解凍ソフト「Explzh」でも可能です。

抽出したlzmaファイルの解凍(展開)でエラーが表示されることもありますが、たいてい解凍自体は完了しています。

7-Zipで解凍(展開)したファイルを、「ファイル・データ抽出」機能で読み込んで、さらに内包されるファイルやデータの検索を行います。ここではcpioアーカイブのヘッダが見つかりますが、ダイアログ下部のダンプ表示内容からみて、抽出対象ではないと判断しました。

オフセット0000'003DA000にLZMA圧縮データが見つかったので、ファイルとして保存します。保存前には「サイズ不明分の仮定サイズ」が元ファイルのサイズからみて十分であることを確認します。

保存した「0000'003DA000.lzma」を7-Zipで解凍(展開)します。ここで、7-Zipのファイルマネージャ上で表示されている解凍対象をダブルクリックして、さらに解凍できるか試します。

解凍対象をダブルクリックした結果、フォルダ構造が表示されました。この解凍対象の実体はcpioアーカイブであり、そのcpioアーカイブの内容が表示された訳です。

これでファームウェアの設定ファイルや実行ファイル等を直接操作可能になりました。これにより得られた設定ファイルや実行ファイルを、テキストエディタで開いたり、逆アセンブラおよび逆コンパイラなどで解析します。
このフォルダ構造の中から、特定文字列や特定バイト列などを含むファイルを探すならば、すべて解凍(展開)した上で、「YARAルールでスキャン」機能を使った、正規表現に対応した検索すなわちgrepでの対処が有用です。YARAおよびYARAルールの詳細は、解説「YARAについて」を参照願います。

このファームウェアに含まれる実行ファイルの一つを「ファイル・データ抽出」機能で検索してみた結果、このファイルはELF形式と判別され、さらに「32ビット・リトルエンディアン・MIPS用」という追加情報も得られました。

ちなみに、「青い空を見上げればいつもそこに白い猫」には、バイナリファイルの一部分をピンポイントで解析するための、逆アセンブラも実装しています。上記の実行ファイルを「MIPSの32ビット・リトルエンディアン」モードで逆アセンブルしてみました。

ルーターのファームウェア本体抽出例
基本的なアプローチ手順は上記と同じです。上述の「ファイル・データ抽出」機能で検出されたLZMA圧縮データをファイルとして保存しますが、これは誤検出で、7-Zipでの解凍(展開)に失敗しました。そのためさらに検索結果を調べると、圧縮ファイルシステムのSquashFSが使用されていることが分かりました。

ここでファイル「0000'000EE9F6.squashfs」として保存し7-Zipで開いても良いのですが、SquashFSが使われているならば、7-Zipでファームウェアのバイナリファイルをそのまま読み込んで、フォルダ構造をエクスプローラのように表示できる可能性があります。さらに7-Zipで設定した表示用ツールで、含まれているテキストファイルの内容を表示することもできます。このケースでは、元ファイル「router_firmware_01.bin」をそのまま7-Zipで開いて、フォルダ構造を表示することができました。
