安価なロジックアナライザーでLenovoノートPCのBitLockerを迂回する
(errno.fr)- パスワードなしのBitLockerが**ディスクリートTPM(discrete TPM)**に依存している場合、起動中にVMKがTPMからCPUへ渡される瞬間、SPIバス上で平文のキーをキャプチャできる
- Lenovo L13での実験は100ドル未満のDSLogic Plusで行われたが、33MHzのSPIバスを安定して読み取るにはサンプリング上の制約が大きかった
- キャプチャしたデータはSPI → TIS → TPM 2.0の順に解釈する必要があり、
TPM2_Unsealの応答バッファから5761で始まる32バイトのキーを見つけ出す - 抽出したキーで
dislocker-fuseを使ってBitLockerパーティションをマウントし、sethc.exeをcmd.exeに置き換えてShiftを5回押すことでSYSTEMシェルまで取得する - ディスクリートTPMだけでは十分な保護は難しく、実質的な防御はfTPMの使用またはBitLockerのPIN・パスフレーズ設定にかかっている
パスワードなしBitLockerとディスクリートTPMの弱点
- BitLockerパーティションは**FVEK(Full Volume Encryption Key)**で暗号化される
- FVEKはさらに**VMK(Volume Master Key)**で暗号化され、暗号化されたデータとともにディスクに保存される
- この構造により、ディスク全体を再暗号化せずにキーのローテーションが可能になる
- VMKはTPMに保存される
- そのためディスクは、そのコンピューターで起動されたときにのみ復号できる
- Active Directoryには復旧メカニズムがある
- 脆弱なポイントは、CPUがディスク復号のためにTPMへVMKの転送を要求する瞬間である
- VMKがTPMとCPUの間のSPIバスを平文で通過する
- この値をキャプチャすれば、BitLockerディスクの復号に使用できる
TPM通信のキャプチャに使った機材
- 実験機材はDSLogic Plusロジックアナライザーである
- 2021年に税金と送料込みで100ドル未満で購入した
- 信号を安定して取得するには、サンプリング周波数がバス周波数の3〜4倍程度必要になる
- 対象のSPIバスは33MHzなので、少なくとも100MHzのサンプリングが必要である
- DSLogic Plusの仕様では最大16チャネルで400MHzをうたっているが、実際の使用条件には制約がある
- DSLogic Plusはキャプチャ方式とチャネル数によって限界がはっきりしている
- 同時にキャプチャするチャネル数が増えると、サンプリング周波数が下がる
- ストリームモードは約1分間の大容量データをキャプチャできるが、3チャネルでは100MHzに制限される
- バッファモードは400MHzサンプリングが可能でも数ミリ秒しか動作せず、この作業には実用的ではない
- より専門的な選択肢は約10倍高価なSaleaeであり、ほかの機材はsigrok対応ハードウェア一覧で確認できる
ボード接続とキャプチャのタイミング
- SPIは共有バスなので、小さなTPMピンに直接接続する必要はない
- 同じSPIバスに接続されたより大きな部品があれば、そちらにフックできる
- 実験では近くのSPI flashを特定して使用した
- 部品のマーキングがあったため、データシートを探して用途を確認しやすかった
- DSLogicではサンプリング周波数の低下により、SPIラインのうち3本だけをキャプチャした
- 重要なラインはCLK、MOSI、MISOである
- しきい値電圧は信号電圧の半分程度に設定する必要がある
- 測定された信号電圧は3.3Vで、適切なしきい値は約1.6Vだった
- 探しているVMKはPOST段階の後半で使用される
- Lenovo L13ではスプラッシュ画面の直後、全体で約25秒の起動中の約14秒地点だった
- その前にもSPIの動作はあるが、主に初期起動段階の読み取りと検証であり、TPM通信ではなかった
- 起動直後にキャプチャを開始するか、不要なデータを減らしたい場合は約7秒後に開始できる
SPI、TIS、TPM 2.0の解釈
- キャプチャした信号はSPI、TIS、TPM 2.0の3層に分けて解釈する必要がある
- SPIは単純なプロトコルなので、一般的なロジックアナライザーでも解釈できる
- クロックが0から1へ立ち上がる瞬間のデータラインの状態がビット値になる
- 例ではMOSIは8クロックの間0なので
0x00、MISOは最初のビットだけがオンなので0x80と解釈される
- 最も難しかった部分は**TIS(TPM Interface Specification)**だった
- 動作するデコーダーを見つけられず、手動で処理した
- libsigrok decodersは正確なデータ解釈には失敗したが、TPMのやり取りが発生しているおおよその区間を見つけるのに役立った
- 失敗の原因は、キャプチャにChip Selectが含まれていないこと、クロックが不正確なこと、一部のバイトが欠落していること、または別の理由である可能性がある
- マスターからスレーブへ送るリクエストには反復的なパターンが見られる
- スレーブが準備完了を知らせる
80を送る - マスターが
D4 00 24ヘッダーとTPMバイトを送る - スレーブが
01 FFで読み取ったことを確認する
- スレーブが準備完了を知らせる
- スレーブからマスターへの応答は、レジスター設定と読み取りに依存する
- 例のフレームは
D4 00 24アドレスから1バイトを読み取った結果である - スレーブが
80でトランザクションを開始し、その後、関心対象の値である0x80が現れる
- 例のフレームは
TPM2_Unseal応答からキーを探す
- キーの返却を要求するTPMコマンドはTPM2_Unsealである
- このコマンドはTPM 2.0 specification part 3で定義されている
- リクエストフレームよりもMISOライン上の応答に注目してTPMトランザクションを分離する
- 生のSPIデータを
80 00 00 00 01 ..マスクでフィルタリングし、最後のワイルドカードバイトだけを保持する - TPMトランザクションの開始は
80 01または80 02ヘッダーで識別される - キーを含む応答はより長い認証応答であり、
80 02で始まる
- 生のSPIデータを
- Unsealコマンドと応答の間には約10msの遅延があった
80 02ヘッダーはパスワードセッションを示し、多くのリクエストが使う平文の80 01ヘッダーとは異なる- リクエスト認証と応答HMAC処理のために遅延が生じたと見られる
- TPMコマンドと応答は、バイトを1つずつ再構成して得る
- デコードにはtpmstream-webツールを使用した
- 応答バッファ内のキーは
5761で始まり、長さは32バイトである
ディスクのマウントとバックドア
- 抽出したキーをファイルに保存した後、
dislocker-fuseに渡してBitLockerパーティションをマウントする - 例のコマンドでは、キーファイルを作成し、
/dev/sdd3を./mnt/に接続した後、dislocker-fileをさらに./mnt2/へマウントする - 最も単純なバックドアは、Windowsの固定キー機能のプログラムを
cmd.exeで上書きする方法であるWindows/System32/cmd.exeをWindows/System32/sethc.exeへコピーする- ディスクをノートPCに戻して起動し、Shiftキーを5回押すとSYSTEMシェルを取得できる
機材の限界と防御策
- DSLogicはこの作業には勧めにくい
- 多くのキャプチャが失敗し、破棄せざるを得なかった
- バス速度の3倍のサンプリングは一貫したクロックを得るにはぎりぎりで、一部のバイトが欠落した
- 機材の限界により、プロトコルを深く理解し、キャプチャを手動で解釈するのに多くの時間がかかった
- 雇用主が機材を購入する状況なら、専門的なロジックアナライザーを買うほうがよいと思う
- ディスクリートTPMの使用は、期待に反してシステムのセキュリティを高めるものではなく、セキュリティの幻想を生み出す可能性がある
- 防御策は2つある
- fTPMを使用する
- ディスクリートTPMを使わなければならない場合は、BitLockerにPINまたはパスフレーズを設定する
- Microsoftも、より高いレベルのデータ保護が必要な組織領域には、BitLockerのPINまたはパスフレーズ設定を推奨している
1件のコメント
Hacker News の意見
すべての TPM は、このような中間者攻撃を防ぐために暗号化されたセッションをサポートしています。
TPM2_StartAuthSessionを使い、各セッションのコマンドで暗号化を指定すればよいのですが、BitLocker はこれを使っていないため、深刻な失敗です。Microsoft が修正すべきです比較すると、systemd は TPM と併用して LUKS のディスク暗号化を使う際に暗号化セッションを使用しています: https://github.com/systemd/systemd/commit/acbb504eaf1be51572...
TPM に詳しくないので聞きたいのですが、認証済みセッションはどう動作するのでしょうか。攻撃者が本物の中間者攻撃で偽装できない形で、OS は TPM に自分の身元をどう証明するのですか。OS 側に保存された秘密や鍵は、まだ暗号化鍵がないので、ディスク上に平文で存在しなければならないように思えます
たとえ OS が何らかの形で TPM の身元を検証し、ディスク上のいくつかのファイルを変更する方法では迂回できないようにしたとしても、攻撃者がエミュレーター上で同じルーチンを実行するのを何が防ぐのか分かりません。Intel ME や SGX のような CPU 側のセキュア実行環境と統合しない限り、このアプローチで本当のセキュリティを得るのは難しそうで、そうなるとそもそも TPM は不要に思えます
2021年に出た別の記事もあります
https://arstechnica.com/gadgets/2021/08/how-to-go-from-stole...
一部のノート PC メーカーは、ノート PC を開けると TPM を消去する設定を提供しています。RAM を追加できるか確認しようとしてノート PC を開けたのなら、BitLocker 回復キーにアクセスできるか、バックアップがあることを願うしかありません
プラスチックを切り取るような方法でアクセスすることもできそうです。『Matrix』の寄生虫を取り出す場面のようなやり方で
目新しいことではありません。既定設定では PIN を要求しませんが、Microsoft の文書は複数の攻撃を説明し、それらを完全に防ぐBitLocker PIN の設定を推奨しています。TPM が総当たりを防ぐため、PIN はかなり弱いものでも構いません
例: https://learn.microsoft.com/en-us/windows/security/operating...
Behavior:Win32/AccessibilityEscalationBitLocker やこの種の暗号化では、復号鍵をシステムが自動的に提供する仕組みがいつも理解できませんでした。ノート PC 全体を盗まれた場合、BitLocker はどんなセキュリティを提供するのでしょうか。攻撃者から見れば、システムが起動してユーザーアカウントのパスワードを要求するだけです
私の理解では、ハードディスクをノート PC から取り出して別のシステムで動かそうとしたときにデータを保護するもののようです。このおそらく愚かな誤解のため、私はいつも BitLocker に手動入力が必要なパスワードを設定してきましたし、LUKS でも常にそうしてきました。完全に間違った考えなのでしょうか?
通常はドライブを消去して売ろうとする可能性が高く、実際にコールドブート攻撃を試みることはなさそうです。ただし、すべては脅威モデル次第です。個人的に、個人機器でフルディスク暗号化を使う主な理由は、ストレージを廃棄するときに物理的に破壊する必要を減らすためです
ハードディスクが故障しても、自分のデータが消えたか確認するために実際に分解して取り出す必要がありません。私のデバイスは通常、外出時はスリープ状態なので、誰かがコールドブート攻撃をしようと思えば、いずれにせよ可能です
おっしゃる通り、復号鍵がシステムに自動的に提供されるなら、その鍵は RAM にあり、攻撃者がエクスポートして暗号化されたディスクに再利用できる状態にあります。コールドブート攻撃[1]は、あなたの脅威モデルに合うか判断するために、さらに読んでみる価値のある攻撃ベクトルです
[1] https://en.wikipedia.org/wiki/Cold_boot_attack
鍵が共有バスを通るなら、システム内のあらゆるコンポーネントがこのロジックアナライザのように簡単に鍵を傍受できるということなのか? サプライチェーンセキュリティの悪夢みたいに聞こえる
誰でもノートPCを起動して復号済みのハードドライブにアクセスできるなら、先に鍵をスニッフィングすることに何の違いがあるのか? ノートPCを起動できるなら、いずれにせよ最終的な成果物にはアクセスできていたはずだ
誰かにノートPCを盗まれる状況でBitLockerに保護してほしいなら、どのみちパスワードを使う必要があり、休止状態ではないスリープモードはオフにすべきだ
だとすると、TPMの「信頼された」ハードウェアは今、実際に何をしているのか? ブート測定も偽装可能なのか? しかもこれは呆れるほど間抜けだ。なぜ鍵素材がバス上を平文で行き来しているのか? 鍵交換プロトコルのようなものもまったくない
[1] ここではセキュアイレースの話も出ているが、それはさらに弱い例ではある。ただし、フルディスク暗号化にソケットから抜いて物理的に破壊できるEEPROMがあるなら、その部分は同じように有効に解決できる
生の信号を0と1に変換するのに、どんなソフトウェアを使ったのか気になる。以前から似たようなプロジェクトがあって、80年代のカセットテープからデジタルデータを読み取る作業だ。テープの
.wavファイルはかなり良い状態で確保できたが、それを0と1に変える適切なツールやライブラリはまだ見つけられていないもちろん本当に面白いのは、0と1のデコードを始めてからだろう。ビットがどうエンコードされているかは分かっていて、周波数偏移変調[0]だ。分からないのは、これを自分が追加処理できるビットストリームへデコードするのに何を使えばいいかということだ
[0] https://en.wikipedia.org/wiki/Frequency-shift_keying
こうしたフィルタのペアの出力を比較してデジタル出力を作れる。疎なスライディング離散フーリエ変換も使えるが、周波数ビン間の補間がより面倒な一方で、Goertzelフィルタはそれを代わりに処理してくれる
どんな生信号でもバイトに変えてくれる単一のアルゴリズムやソフトウェアは知らない。信号がどの変調方式を使っているのかを把握し、対応するデコーダを探すか自分で書く必要がある。一般にはフィルタリングや各種の数学的アルゴリズムが入るが、基本的なデコード用プログラムはかなり短く単純なことが多い
学んでおくとかなり面白い技術で、同じ手法をあらゆる場所で使えるからだ。たとえばDSPを少し学んだところ、無線通信、音楽とサウンドデザイン、画像、映像処理でできることが大きく広がった
あるいは筆者がDSlogicに言及しているので、そのロジックアナライザのメーカーが作ったそれらのプログラムのフォークがあるかもしれない
生信号は通常、安定したエッジのためにヒステリシスを実装するシュミットトリガに入る。そうするとテープ信号の極性とモーターのばらつきが補正される
「別個の物理TPMを使うと実際にはセキュリティが低下する」という部分が皮肉だ
2015年の自分のノートPCには物理TPMがなく、有効にしようとしたら「互換性のあるTPMなしでBitLockerを許可する(USBフラッシュドライブ上のパスワードまたはスタートアップキーが必要)」と表示されたので、より安全でないと思っていた。いずれにせよBitLockerを使っていなくて幸いだ
Windows Vista時代のように、コマンドプロンプトの名前をアクセシビリティハンドラに変える小学生レベルのトリックが、いまだにそのまま通用するという事実が面白すぎる
ログインなしで管理者権限で実行されるものなら、Windowsが認証するだろうと想像してしまうが、Windowsの75%はセキュリティ演劇で、残りの25%も別種の演劇に見える
2021年に同じ手法が説明されていた:
https://dolosgroup.io/blog/2021/7/9/from-stolen-laptop-to-in...