こんにちは。技術部 手島と申します。
前回に引き続き、組込機器診断の例を紹介します。
前回の記事はこちら:
組込機器の診断を紹介 1/2
http://io.cyberdefense.jp/entries/2016/05/09
今回はこの組込機器へ搭載されたフラッシュメモリの内容を解析し、ファームウェアを改ざんできないか挑戦します。
前回の復習
前回は、基板上の探索から以下の内容ができることを確認しました。
・デバッグログが出力される
・シリアルコンソールがある
・フラッシュメモリの内容が暗号化されていない
そこで、まずはファームウェアを取得できないか確認します。
デバッグ機能を利用してファームウェアを取得
前回の診断ではログインコンソールが見えていましたが、これを突破できた状態とみなしてください。シリアルコンソールが利用でき、好きなコマンドを入力できるようになりました。何か使えそうなコマンドはないか探していると、運が良いことにmdコマンドを見つけました。(md: Memory Displayの略)

これは、プロセッサのアドレス空間の任意の位置の値を表示するコマンドのようです。アドレスマップはプロセッサのデータシートに記載されているため、データシートを見てみましょう。

0x1F000000 から 0x1FFFFFFF までの領域がSPI接続したフラッシュメモリに割り当てられているようです。ということは、前回失敗したフラッシュメモリの読み取りができるかもしれません!
とりあえずフラッシュメモリの容量分をダンプしてみました。一般的に、データが何も無いと 0xFF が返るはずなので、フラッシュメモリには何かが記録されているようです。

ここでフラッシュメモリ上のデータを眺めていると、人間が読める文字列を発見しました。前回の診断でデバッグログから得られた情報によると、この領域はブートローダ用の領域です。(※領域に関わる情報は公開していません)

ファームウェアの解析
mdコマンドを用いてフラッシュメモリの内容を全て吸い出すことができました。バイナリエディタ・Stirlingのビットイメージで眺めてみると、フラッシュメモリ内の領域がはっきりと分かります。アドレスも合致しているため、前回の診断でデバッグログから得られた情報は正しいと判断してよいでしょう。




まずは手っ取り早く binwalkで解析してみたところ、ファイルシステム等の情報が得られました。これも、前述のデバッグログから得られたフラッシュメモリの領域やパーティション情報と合っています。(製品の特定を防ぐためにモザイクを多々かけています。ご容赦下さい。)

次に、イメージを切り出してファイルシステムを展開すると、内部で動作させると思しき実行ファイルを入手することができました。これでコマンドインジェクションやバッファオーバーフロー等が無いか調査することができます。通信機能を有する機器にとっては脅威となるおそれがあります。

ファームウェアを改ざん
この機器は、購入者がWebブラウザで動作を設定できます。そこで、ファームウェア改ざんができないか、試しに設定画面のHTMLファイルを書き換えてみます。
元の設定画面です。管理ユーザは root になっていますが、これを unbaba に書き換えてしまいましょう。


更に、ファームウェアへマルウェアを組み込めないか試します。今回はマルウェアではなく、単なるテキストファイルを書き込みました。任意のファイルを組み込めるならば、すなわち実行ファイルを作成してマルウェアを組み込むことができます。

ファームウェアを作成します。ファームウェアの構造は、デバッグログの内容とフラッシュメモリの内容を解析することで把握することができました。

改造ファームウェアの書込と起動
改造ファームウェアを書き込みます。

ファイルシステムの開始アドレスを間違えたり、エンディアンが間違っていたりして何度か Kernel Panicが発生しましたが・・・数回の失敗を経て、ついにこの機器が起動しました!製品の特定を防ぐため小さくて申し訳ないのですが、パスワードの設定画面を開いたところです。先ほど改ざんしたように、ユーザ名が unbaba となっています。

先ほど仕込んだテキストファイルもバッチリ存在しています。ファームウェアの改ざんに成功しました!

この機器の脆弱性
この機器は家庭で使用することを前提に作られていますが、もしも高い信頼性が求められる箇所へ利用する場合、脆弱性となりうる点を指摘します。
※家庭で使用する場合はそこまで大きな問題になりません!
■ファームウェアが入手可能
ファームウェアを入手することで、潜在するバッファオーバーフロー等の脆弱性を調べることが可能です。組込機器には通信機能が備わっていることが多いため、ネットワーク越しの攻撃は大きな脅威となります。ファームウェアは重要な情報源であり、攻撃者にとって有利となるため暗号化するべきです。
■ファームウェアの署名検証不備
この機器はファームウェアが署名検証されていないため、容易に改ざんが可能です。ファームウェアの暗号化に加え、公開鍵暗号方式を用いて署名検証をするべきです。
■暗号化の不備
フラッシュメモリに記憶されたファームウェアおよび設定情報が平文で保存されているため、容易に解析が可能です。フラッシュメモリ上のファームウェアは暗号化し、鍵は外部からアクセスできない領域に保存するべきです。
参考として、プロセッサによっては主記憶装置(SDRAM等)と記憶媒体(フラッシュメモリ等)を内蔵した製品があります。デバッガ等の接続を一切拒否するモードもあり、工場出荷時に設定することで外部から内部のデータを読み取ることはできなくなります。
■攻撃に有用なデバッグログが出力される
前の記事で発見したシリアルポートから、ファイルシステム、パーティション等の情報が出力されました。これはファームウェアを解析する上で大いに役立ちました。
この機器が道路の信号や発電所などの高い信頼性が求められる箇所で用いられた場合、攻撃者がファームウェアを改ざんして機器をすり替えてしまうと、あらゆる攻撃ができるために大きな脅威となりえます。また、直ちに悪用するのではなく、時限爆弾のようにある日一斉に暴走させるような用途も考えられます。伊勢志摩サミットのように、要人が来訪するのを待って利用することも十分に考えられます。
終わりに
2回にわたる記事をご覧いただき、ありがとうございました。
「人間がもたらす脅威には人間しか対処できない」
この考えに基づき、弊社メンバーは日々研究を重ねています。
■今後、ブログで取り上げる予定の内容やキーワード
・組込機器診断に使用しているツールの紹介
・練習風景(0.5mmピッチICでのピンの足上げ)
・市販機器にJTAGデバッガを接続してみる