HDDファームウェアハッキングの深掘り:ディスクコントローラーのリバースエンジニアリング

ハードディスクドライブ(HDD)やソリッドステートドライブ(SSD)の内部動作は、しばしばブラックボックスとして扱われます。回転するプラッタやNANDフラッシュセルといった高レベルのメカニズムは理解されていますが、これらのデバイスがホストシステムとどのように相互作用するかを制御するマイクロコントローラー(MCU)のロジックは、大部分が不透明なままです。

興味深い技術的な深掘りとして、研究者の Ryan Miceli は、Xbox 360 のレースコンディション(競合状態)エクスプロイトを容易にするために HDD ファームウェアを修正する試みを詳細に記述しました。その目的は、特定のセクターが読み取られる際に数百ミリ秒の正確な遅延を導入し、エクスプロイトがトリガーされるウィンドウを広げることでした。研究者は最終的にファームウェアの修正なしでレースコンディションをトリガーする代替手段を見つけましたが、そのプロセスは、組み込みストレージデバイスを攻撃するための包括的な手法を明らかにしています。

ファームウェア取得の課題

ファームウェアを取得することは、最初にして、しばしば最も困難なハードルです。メーカーは通常これらのバイナリを公開しないため、研究者は主に3つの方法に頼ることになります。

  1. プロフェッショナルツール: PC-3000 のようなツールは、ベンダー独自のコマンドを使用して、ドライブから直接ファームウェアをダンプします。
  2. OEM アップデートユーティリティ: メーカーのウェブサイト(例:Lenovo)でファームウェアアップデートユーティリティを検索することで、バイナリを入手できる場合があります。これらのユーティリティは、フラッシュする前にファームウェアを復号化または難読化解除するためのロジックを含んでいることが多いため、宝の山となります。
  3. 手動ダンプ: ハードウェアインターフェースを使用して、ロジックボード上の MCU または SPI flash チップからデータを抽出します。

難読化解除と分析

ファームウェアが生の実行ファイルとして保存されていることは稀です。Western Digital (WD) ドライブの場合、ファームウェアはローダー・スタブに続いて圧縮セクションで構成されています。Miceli は、圧縮アルゴリズムを LZHUF の修正版として特定しました。そこでは定数 N が 2048 から 4096 に変更され、ランレングス計算が変更されていました。

Samsung SSD の場合、難読化はさらに単純でした。アップデートユーティリティを分析することで逆算できるビット操作アルゴリズムでした。難読化が解除された後、バイナリはカスタムローダー・スクリプトを使用して IDA Pro にロードされ、セクションを正しいベースアドレスにマッピングしました。これは多くの場合、ARM Cortex-M3 コアのメモリマップに一致します。

JTAG によるライブデバッグ

複雑なステートマシンや独自の ISA を扱う場合、ファームウェアの静的分析には限界があります。これを克服するために、研究者は JTAG (Joint Test Action Group) インターフェースを利用しました。多くの WD ドライブは、PCB 上に未実装の 38 ピン MICTOR コネクタを露出させており、これにより MCU のハードウェアレベルでのデバッグが可能になります。

OpenOCD と FT232 を介して接続することで、以下のことが可能になります:

  • コード内のハードウェアブレークポイントを設定する。
  • レジスタとメモリをリアルタイムで検査する。
  • ホスト PC から ATA コマンドを送信しながら、実行をステップ実行する。

コマンドハンドラーのトレース

読み取りリクエストを処理するコードを見つけるために、研究者は Vendor Specific Commands (VSCs) を用いた手法を使用しました。特定のログページ(WD の場合は 0xBE)を持つ SMART READ LOG ATA コマンドを発行することで、RAM の読み書きを許可する「バックドア」をトリガーすることができました。

特定のメモリアドレスにメモリブレークポイントを設定し、そのアドレスを VSC で読み取ることで、研究者は実行フローを関数ハンドラーテーブルまで遡ってトレースすることができました。これは最終的に、DMA READ EXT コマンドハンドラーの発見へとつながりました。このハンドラーは、プライマリ・ファームウェア・イメージではなく、ディスク・プラッタのサービスエリアに保存されている overlay modules に存在していました。

パッチ適用と実行

読み取りハンドラーが特定された後、目標は遅延を注入することでした。対象のコードがオーバーレイ・モジュール内にあったため、研究者はドライブをブリック(故障)させるのを避けるため、VSC を使用して RAM 内で「ホットパッチ」を適用することを選択しました。

フック・インプリメンテーション

パッチには、RAM の未使用セクションに code cave を作成することが含まれていました。読み取りハンドラー内の元の命令を、この cave にジャンプする命令に置き換え、そこでは CPU を約 200ms 間、スピンループを実行して停止させ、その後元の実行フローにジャンプして戻るという単純なスピンループを実行します。

# Simplified logic of the delay hook
Hook_SataDmaRead:
    ldr r3,=(MS_DELAY*F_CPU/1000) # Setup delay counter
    sub r3,r3,#1                # Spin until counter is 0
    bne Hook_SataDmaRead_loop
    bx lr                      # Return to original code

テストの結果、読み取られる時間は、キャッシュされた場合のほぼ 0ms から、約 450ms に増加し、ドライブのタイミングを操作することに成功しました。ファームウェアレベルでタイミングを操作できることが証明されました。

幅広い Implications とコミュニティの洞察察

HDD ファームウェアを操作する能力は、重大なセキュリティ上の意味合いを持ちます。コミュニティのディスカッションによれば、これは単なる理論的な演習ではありません。NSA は以前、持続的な攻撃やスパイ活動のために HDD ファームウェアを利用しているとの関連が指摘されています。

コミュニティからの主なテイクアウェイ:

  • 些細な難読化: 複数の研究者が、ベンダーによる難読化はしばしば恥ずかしいほど単純であると指摘しています。ある貢献者は、Linux のファームウェア・アップデートユーティリティが、アップロード前に復号化されたファームウェアをディスクにプレーンテキストで書き込むため、seccomp フィルタを使用してバイナリを捕捉できると述べました。
  • アンチ・フォレンジック: この研究は、Travis Goodspeed や Sprite といった人物による以前の研究を反映しています。彼らは、HDD ファームウェアを使用してアンチ・フォレンジックを行い、ハードウェアレベルでシステムファイルを(例:/etc/shadow)変更することを探求してきました。
  • 「研究の寄り道」: このプロジェクトは、「意図しない」研究の価値をハイクションライトしています。レースコンディションを修正するための試みは、ディスク・コントローラーのリバースエンジニアリングを全規模で行うことにつながり、特定の技術的ハードルを解決することがいかに広範範いるアーキテクチャ上の発見につながるかを示しています。

研究をさらに深めたい方は、研究者は GitHub の HDDTools リポジトリで IDA とファームウェア・スクリプトをツールとしてオープンソース化しています。

Sources