1 ポイント 投稿者 GN⁺ 2023-08-25 | 1件のコメント | WhatsAppで共有
  • パスワードなしの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.execmd.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である
  • リクエストフレームよりもMISOライン上の応答に注目してTPMトランザクションを分離する
    • 生のSPIデータを80 00 00 00 01 ..マスクでフィルタリングし、最後のワイルドカードバイトだけを保持する
    • TPMトランザクションの開始は80 01または80 02ヘッダーで識別される
    • キーを含む応答はより長い認証応答であり、80 02で始まる
  • 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.exeWindows/System32/sethc.exeへコピーする
    • ディスクをノートPCに戻して起動し、Shiftキーを5回押すとSYSTEMシェルを取得できる

機材の限界と防御策

  • DSLogicはこの作業には勧めにくい
    • 多くのキャプチャが失敗し、破棄せざるを得なかった
    • バス速度の3倍のサンプリングは一貫したクロックを得るにはぎりぎりで、一部のバイトが欠落した
  • 機材の限界により、プロトコルを深く理解し、キャプチャを手動で解釈するのに多くの時間がかかった
    • 雇用主が機材を購入する状況なら、専門的なロジックアナライザーを買うほうがよいと思う
  • ディスクリートTPMの使用は、期待に反してシステムのセキュリティを高めるものではなく、セキュリティの幻想を生み出す可能性がある
  • 防御策は2つある
    • fTPMを使用する
    • ディスクリートTPMを使わなければならない場合は、BitLockerにPINまたはパスフレーズを設定する
  • Microsoftも、より高いレベルのデータ保護が必要な組織領域には、BitLockerのPINまたはパスフレーズ設定を推奨している

1件のコメント

 
GN⁺ 2023-08-25
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 は不要に思えます
    • その欠落が意図的なものなのか、そうだとすれば理由は何なのか気になります
    • 認証済みセッションは、完全に統合されたデバイスでなければ実質的にはほとんど役に立ちません。SRK の身元を保証する方法がないため、中間者攻撃は依然として可能です
  • 2021年に出た別の記事もあります
    https://arstechnica.com/gadgets/2021/08/how-to-go-from-stole...
    一部のノート PC メーカーは、ノート PC を開けると TPM を消去する設定を提供しています。RAM を追加できるか確認しようとしてノート PC を開けたのなら、BitLocker 回復キーにアクセスできるか、バックアップがあることを願うしかありません

    • 回復キーのコピーをどこかに保管しておくのは良い習慣です
    • おそらく単純なタンパースイッチのボタンに依存している可能性が高く、背面のプラスチックを切り取れば簡単に回避できるでしょう。筐体全体に配線を張り巡らせるような精巧な装置を入れているとは思えません
    • 消費者向けデバイスで、シャーシ侵入検知がデフォルトで有効になっているのを見たことがありません。企業アカウントでの大量注文品だったのかもしれません。そのような製品は、IT 部門が望む設定で出荷されることがあります
    • ノート PC のネジを外して内部にアクセスする場合の話ですか?
      プラスチックを切り取るような方法でアクセスすることもできそうです。『Matrix』の寄生虫を取り出す場面のようなやり方で
    • 最近はアップグレード可能な RAMを備えたノート PC を見つけるのが難しい、というのは冗談の種です。一部の ThinkPad ラインもそうですし、ゲーミングノート PC ではしばしば可能です
  • 目新しいことではありません。既定設定では PIN を要求しませんが、Microsoft の文書は複数の攻撃を説明し、それらを完全に防ぐBitLocker PIN の設定を推奨しています。TPM が総当たりを防ぐため、PIN はかなり弱いものでも構いません
    例: https://learn.microsoft.com/en-us/windows/security/operating...

    • 興味深いことに、私の知る限り Windows Defender は現在、既定でアクセシビリティを利用した権限昇格攻撃を防ぎます。Behavior:Win32/AccessibilityEscalation
    • TPM は失敗試行が X 回発生したら鍵素材を消去するものだと思っていましたが、そうではないのですか?
  • BitLocker やこの種の暗号化では、復号鍵をシステムが自動的に提供する仕組みがいつも理解できませんでした。ノート PC 全体を盗まれた場合、BitLocker はどんなセキュリティを提供するのでしょうか。攻撃者から見れば、システムが起動してユーザーアカウントのパスワードを要求するだけです
    私の理解では、ハードディスクをノート PC から取り出して別のシステムで動かそうとしたときにデータを保護するもののようです。このおそらく愚かな誤解のため、私はいつも BitLocker に手動入力が必要なパスワードを設定してきましたし、LUKS でも常にそうしてきました。完全に間違った考えなのでしょうか?

    • 攻撃者はログインを迂回するか、システムメモリから鍵を抽出するか、物理 TPM がある場合はこの記事のような攻撃を行う必要があります。これは、高価なコンピューターを盗んで手早く金にしようとする一般的な窃盗犯よりは、はるかに高度な攻撃である可能性が高いです
      通常はドライブを消去して売ろうとする可能性が高く、実際にコールドブート攻撃を試みることはなさそうです。ただし、すべては脅威モデル次第です。個人的に、個人機器でフルディスク暗号化を使う主な理由は、ストレージを廃棄するときに物理的に破壊する必要を減らすためです
      ハードディスクが故障しても、自分のデータが消えたか確認するために実際に分解して取り出す必要がありません。私のデバイスは通常、外出時はスリープ状態なので、誰かがコールドブート攻撃をしようと思えば、いずれにせよ可能です
    • 完全に間違っているわけではありませんが、鍵をエクスポート可能になる危険を見落としているかもしれません
      おっしゃる通り、復号鍵がシステムに自動的に提供されるなら、その鍵は RAM にあり、攻撃者がエクスポートして暗号化されたディスクに再利用できる状態にあります。コールドブート攻撃[1]は、あなたの脅威モデルに合うか判断するために、さらに読んでみる価値のある攻撃ベクトルです
      [1] https://en.wikipedia.org/wiki/Cold_boot_attack
    • Windows は、正しいアカウントパスワードを入力するまで、誰にもファイルへアクセスさせないようにすべきです。したがって、このコンピューターではディスクは復号されますが、その後は Windows がアクセスをブロックします
    • 推測ですが、ディスク暗号化にパスワードを設定していなければ、そのシナリオでは保護はないと思います
  • 鍵が共有バスを通るなら、システム内のあらゆるコンポーネントがこのロジックアナライザのように簡単に鍵を傍受できるということなのか? サプライチェーンセキュリティの悪夢みたいに聞こえる

    • こうした暗号化の目的は、取り外したハードドライブをデータ上のリスクなしに売却したり再利用したりできるようにすることだ
      誰でもノートPCを起動して復号済みのハードドライブにアクセスできるなら、先に鍵をスニッフィングすることに何の違いがあるのか? ノートPCを起動できるなら、いずれにせよ最終的な成果物にはアクセスできていたはずだ
    • いくつかのコンポーネント間では共有されているが、全部ではまったくない。最近は普通、SPIバスにはブートフラッシュとTPM、そしてバスマスターであるCPU自身くらいしか接続されていない
  • 誰かにノートPCを盗まれる状況でBitLockerに保護してほしいなら、どのみちパスワードを使う必要があり、休止状態ではないスリープモードはオフにすべきだ

    • 1つ目は、この記事までは完全には明確ではなかった。ノートPCの盗難はフルディスク暗号化が意味を持つ脅威の中では事実上もっとも弱い[1]部類で、Windowsは通常のアカウントパスワード以外には何も要求しないことを大きく売りにしてきた
      だとすると、TPMの「信頼された」ハードウェアは今、実際に何をしているのか? ブート測定も偽装可能なのか? しかもこれは呆れるほど間抜けだ。なぜ鍵素材がバス上を平文で行き来しているのか? 鍵交換プロトコルのようなものもまったくない
      [1] ここではセキュアイレースの話も出ているが、それはさらに弱い例ではある。ただし、フルディスク暗号化にソケットから抜いて物理的に破壊できるEEPROMがあるなら、その部分は同じように有効に解決できる
  • 生の信号を0と1に変換するのに、どんなソフトウェアを使ったのか気になる。以前から似たようなプロジェクトがあって、80年代のカセットテープからデジタルデータを読み取る作業だ。テープの.wavファイルはかなり良い状態で確保できたが、それを0と1に変える適切なツールやライブラリはまだ見つけられていない
    もちろん本当に面白いのは、0と1のデコードを始めてからだろう。ビットがどうエンコードされているかは分かっていて、周波数偏移変調[0]だ。分からないのは、これを自分が追加処理できるビットストリームへデコードするのに何を使えばいいかということだ
    [0] https://en.wikipedia.org/wiki/Frequency-shift_keying

    • 古いFSKテープのデコードには、スライディングGoertzelフィルタを調べてみるとよい。実装しやすいフィルタで、スライディングウィンドウ内の特定の周波数ビンの振幅を抽出し、DTMFデコードの文献でよく言及される
      こうしたフィルタのペアの出力を比較してデジタル出力を作れる。疎なスライディング離散フーリエ変換も使えるが、周波数ビン間の補間がより面倒な一方で、Goertzelフィルタはそれを代わりに処理してくれる
    • これはデジタル信号処理という大きな分野で、本質的にはモデムやサウンドカードのアナログ-デジタル変換器がやっていることだ
      どんな生信号でもバイトに変えてくれる単一のアルゴリズムやソフトウェアは知らない。信号がどの変調方式を使っているのかを把握し、対応するデコーダを探すか自分で書く必要がある。一般にはフィルタリングや各種の数学的アルゴリズムが入るが、基本的なデコード用プログラムはかなり短く単純なことが多い
      学んでおくとかなり面白い技術で、同じ手法をあらゆる場所で使えるからだ。たとえばDSPを少し学んだところ、無線通信、音楽とサウンドデザイン、画像、映像処理でできることが大きく広がった
    • 文章だけを見ると簡単そうだ。クロックがLowからHighに変わるときのデータラインの現在のレベルがビット値で、開始点を見つけるには1が1つと0が7つ並ぶところを探せばよい
    • Pulseview https://github.com/sigrokproject/pulseview と、Sigrokプロジェクトのほかの部分 https://github.com/sigrokproject を見るとよさそうだ
      あるいは筆者がDSlogicに言及しているので、そのロジックアナライザのメーカーが作ったそれらのプログラムのフォークがあるかもしれない
    • その時代のローディングルーチンは、DCゼロクロスの回数を数えて、X回交差すれば0、Y回交差すれば1に変えるだけで、周波数や振幅は気にしない
      生信号は通常、安定したエッジのためにヒステリシスを実装するシュミットトリガに入る。そうするとテープ信号の極性とモーターのばらつきが補正される
  • 「別個の物理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...