ハードウェア

HDDのコントローラーをハッキングするとデータの傍受やHDD基板へのLinuxインストールが行える


HDDはデータが保存されるプラッタや読み書きを行う磁気ヘッドといった部品の他にも、ハードディスクコントローラーやキャッシュ用のチップなど、さまざまな部品で構成されています。中でもハードディスクコントローラーはメーカーが詳細を公開しない部分ですが、そんなHDDのコントローラー部分をSpritesmodsを運営するSprite_tm(本名:Jeroen Domburg)氏がハッキングし、その過程を説明しています。

Sprites mods - Hard disk hacking - Intro
http://spritesmods.com/?art=hddhack

HDDは通常、512バイトのセクタごとにLBAと呼ばれる通し番号が採番され、コンピューターはセクタごとにHDDのデータを読み書きします。HDDの機械的な動作は磁気ヘッドがプラッタに対してデータの読み書きを行う「非常にシンプル」な構造であるとSprite_tm氏は指摘。しかし、HDDには不良セクタやS.M.A.R.T.の管理といった情報を扱う機能もあり、この能力はハッキングの可能性へとつながるとのこと。Sprite_tm氏はハッキングへの興味から、HDDのソフトウェアセキュリティを突破するハッキングのための調査を始めました。

◆プリント基板
今回の調査に用いられたのはWD製HDD「WD20EARX」です。磁気ヘッドやプラッタといったHDDの機械的な部分は既知の領域ですが、Sprite_tm氏の興味はそうした機械的な部分ではなく、SATAコネクタや電源コネクタがついているプリント基板にあるとのこと。HDDに組み込まれているプリント基板はこんな感じです。


プリント基板に実装されているチップはいくつかありますが、そのうちの1つがDRAMです。HDDに搭載されているDRAMは特殊なものではなく、データシート上で確認することができるとのこと。容量は8MBから64MBで、HDDのキャッシュサイズに相当します。


2つ目のチップはスピンドルモーターコントローラーで、データシートで確認することが難しい特殊なチップです。モーター制御の他に、電源制御なども行うチップとのこと。ST製の「SMOOTH」チップが最も採用実績があるとSprite_tm氏は語っています。


3つ目のチップは64KBから256KBのフラッシュメモリです。このフラッシュメモリはハードディスクコントローラーが起動するプログラムが保存されているそうですが、HDDの機種によってはプログラム用にフラッシュメモリを実装するのではなく、ハードディスクコントローラーに直接書き込まれている場合もあるとのこと。


チップではありませんが、圧電式のショックセンサーもプリント基板に実装されています。落下などによりHDDが機械的な衝撃を受けた際に、ヘッドを退避させるのに使えますが、実際には保証が無効であることを示すためにHDD落下時にフラグを立てているだけである可能性が高いとSprite_tm氏は指摘。


4つ目のチップがハードディスクコントローラーであり、「すべての楽しいことが起こる場所」とSprite_tm氏は表現。ハードディスクコントローラーはMarvellやSTなどのLSIメーカーの他にも、SamsungやWestern Digital(WD)などのHDDメーカーが内製する場合もあるとのこと。最も重要な部品でありながら、チップのデータシートを探しても情報があまり得られない部品でもあるとSprite_tm氏は語っています。


◆JTAGポートによるコントローラー操作
Sprite_tm氏はHDDGuru forums上のスレッドに投稿された「JTAGポートを利用すればハードディスクコントローラーを自由に操作できる」という情報を参考にして、ハードディスクコントローラーを調査することに。赤いボードはFT2232HというUSBシリアル変換モジュールで、このボードをHDDのJTAGポートに接続しています。デバッグソフトにはOpenOCDを利用したとのこと。


デバッグすると、MarvellのARM互換コアである「Feroceon」が2コア、「Cortex-M3」が1コアと、ハードディスクコントローラーには3つのARMコアが搭載されていることが判明。1つ目のFeroceonコアは物理的な読み書きを制御しており、2つ目のFeroceonコアはSATAインターフェースを操作しているとのこと。Cortex-M3は動作を停止してもHDDの動作に影響がなかったそうです。


Sprite_tm氏の最終的な目標はHDDのセキュリティを突破すること。Sprite_tm氏はHDDに搭載されたDMAがDRAMのキャッシュを頼りにプラッタ上のデータにアクセスしているのではないかと推測。キャッシュの制御は2つ目のFeroceonコアで行っているので、Sprite_tm氏は2つ目のFeroceonコアのメモリマップを調べることにしました。

2つ目のFeroceonコアのメモリマップは断片的で、RAMやIO、IRQ空間、内部のブートROM空間が点在しています。Sprite_tm氏はFeroceonコアのメモリマップの中に、キャッシュを内蔵したDRAMチップではないかと思われる64MBの大きなセグメントを発見。


DRAMをマウントして「Hello World!」と書き込んだところ、Feroceonコアからも「Hello World!」にあたるデータを確認することができました。


◆キャッシュダンプとコード挿入
キャッシュの動作を知るためには、キャッシュメモリ全体をダンプして調査する必要がありますが、これは一筋縄ではいかないとSprite_tm氏。従来のARM命令とThumb命令が混在しており、エラーメッセージを発行するコードも組み込まれていなかったとのこと。しかし、WDはファームウェアを難読化していなかったこと、JTAGポートによるチップの操作が可能であることから、Sprite_tm氏はなんとかキャッシュ機能の核心にたどり着きました。以下がSprite_tm氏が「キャッシュディスクリプタテーブル」と呼ぶRAMテーブルです。テーブル内の各要素は、キャッシュされるデータの先頭LBAや、データの長さ、キャッシュの状態などをそれぞれ保持しています。DMAはこれらのキャッシュの情報をもとにプラッタ上のデータにアクセスするというわけです。


HDDとコンピューター間のデータのやり取りを傍受するには、ハードディスクコントローラー上で独自のコードを適切なタイミングで実行する必要があるとSprite_tm氏。HDDのデータはSATAポートを経由して送受信されますが、SATA制御は2つ目のFeroceonコアが行っているため、FeroceonコアのSATAハードウェア初期化処理をコード実行のタイミングとして利用できるのではないかとSprite_tm氏は思案。試行錯誤の末に初期化のタイミングを発見し、適切な場所に自作のコードを埋め込むことに成功したとのこと。

これがSprite_tm氏が改変する前のアセンブラコード。


以下がSprite_tm氏によって改変されたコードです。changeThingsInCacheというルーチンを実行し、その後は元のコードがあるアドレスにジャンプして元のコードと同じ処理を行うとのこと。これでHDDの読み書き処理をバイパスすることができます。


例えば、SATAデバイスの初期化をフックとしてキャッシュ内のセクタの値を書き換えるといった操作が可能になっています。


◆コード改変の永続化
これでHDDのハッキングは完了していますが、Sprite_tm氏はプログラムの永続性にもこだわります。コードはRAM上に存在するため、改変してもHDDを再起動すると元に戻ってしまいます。この問題を解決するため、Sprite_tm氏はフラッシュメモリにプログラムを配置することに。メモリの着脱がしやすいようにVeroボード上にフラッシュメモリが移植されています。


フラッシュに書き込むデータフォーマットは明らかになっていましたが、コード自体は未知のアルゴリズムで圧縮されていたため、直接フックとなるコードを挿入することはできませんでした。そこでSprite_tm氏はフラッシュメモリのブロックを追加して、追加ブロックが他のブロックよりも先に実行されるようにフラッシュメモリのバイナリを自作ツール「fwtool」で再アセンブルしたとのこと。フラッシュメモリに改変したバイナリを書き込んだところ、プログラムの永続化に成功したそうです。

◆ハッキング達成
しかし、Sprite_tm氏はまだ「自分の想像していたハッカーシナリオ」を実行できていないとのこと。フラッシュメモリを基板から取り外してしまったのがシナリオから外れた原因のようで、フラッシュメモリが基板にはんだ付けされている状態でバイナリを書き込む方法を見つける必要があるとSprite_tm氏。

Sprite_tm氏の思い描くシナリオを可能にしたのが、WDが提供しているDOS用ファームウェアアップグレードツールと、LinuxのSCSIドライバーを利用したWD製HDD用のツール群であるidle3-toolsだったとのこと。このコードをfwtoolに組み込むと、HDDのフラッシュメモリをSATA経由で読み書きできるようになったそうです。

Sprite_tm氏はここまでの操作を行うことで、もし悪意のあるハッカーが今回使用されたドライブを持つサーバーのroot権限を得たとしたら、fwtoolでHDDのフラッシュメモリを改変し、サーバーのデータそのものの傍受や改変が可能になるとのこと。例えば、攻撃者はLinuxにおいてパスワード情報が格納されている「/etc/shadow」を操作してパスワードを変更することが可能になります。また、Sprite_tm氏はこの手法を悪用目的だけでなく、完全なクローンディスクを作成するといった、データを守る目的でも使用できると語っています。


実際に「/etc/shadow」を改変してrootのパスワードを変更するデモムービーが以下。



また、ハードディスクコントローラーはARMコアを3つ搭載しており、シリアルポート用のUARTと、少なくとも2つのSPIがあるので、コントローラーボードとしても面白いとSprite_tm氏。コントローラーボードにLinuxカーネルとinitrdを書き込んでLinuxのブートを試みているムービーも公開しています。カーネルとinitrdは1セクタ分のサイズでパッケージされており、「HD, lnx!」という書き込みをトリガーとしてLinuxカーネルが読み込まれる仕組みとのこと。ハードディスクコントローラーにはMMUがないため、特殊な形式でフォーマットされたユーザー空間のビットが必要ですが、これをカーネルに組み込むことができずLinuxの起動には失敗してしまったとのこと。しかし、Sprite_tm氏はコントローラーボードにLinuxをインストールしたことを少し誇らしく思っているそうです。



Sprite_tm氏はハードディスクコントローラーは未知の領域が多いものの、リバースエンジニアリングやカスタムコードを書くことは可能であることや、壊れたHDDでも基板そのものはまだ利用できることを指摘。「セキュリティプロジェクトのソースコードを公開するのは、いつも厄介な問題です」とSprite_tm氏は語り、ハッキングに用いたソースコードをすべて公開することには慎重な姿勢を見せており、不完全なコードのみ公開しています。

(tgzファイル)hddhack.tgz
http://spritesmods.com/hddhack/hddhack.tgz

この記事のタイトルとURLをコピーする

・関連記事
キーホルダーサイズの超小型&超薄型ゲームボーイを開発したハッカー登場 - GIGAZINE

サイトのアクセス数を物理的にカウントする「機械式アクセスカウンター」の作り方 - GIGAZINE

回路をいじって10年前のノートPCの「ACアダプター識別機能」を自力で回避してしまった猛者が現る - GIGAZINE

「Linux搭載PC」を名刺にしてしまった猛者が登場 - GIGAZINE

in ソフトウェア,   ハードウェア, Posted by log1n_yi

You can read the machine translated English article here.