web-dev-qa-db-ja.com

完全なディスク暗号化にTPMを使用する正しい方法

現在、TPMとLUKSを使用して同等のBitLockerを設定しています。基本が正しく、TPMを使用してブートプロセスを測定し、FDEキーを封印することができます。

機密部分(ファームウェア、ブートローダー、カーネル)が更新されるたびに、次のコマンドを使用して暗号化キーを新しいシステム状態に封印します。

tpm_sealdata -p 0 -p 1 ... -p 11 -p 13 -i <keyfile> -o <sealed keyfile>

システムが起動すると、次のキーを使用してキーが開封され、暗号化されたボリュームをマウントするためにLUKSに渡されます。

tpm_unsealdata -i <sealed keyfile> -o <temporary keyfile stored in RAM>

これは機能し、望ましい動作をします-ブートプロセスが改ざんされている場合(たとえば、ルートコマンドをバイパスするためにカーネルコマンドラインにinit=/bin/shを追加するとします)、TPMはキーの開封を拒否し、システムは安全です。

ただし、いくつか質問があります。

まず、TPMは、封印/開封操作が実行されるたびにSRKパスワードを要求します。私はそれを避けて、透明で何もプロンプトを出さないBitLockerのように動作させたいと思います。デフォルトのSRKパスワードの使用を検討しましたが、 どうやら安全ではない ですが、PCRがその状態と一致しない場合、そのパスワードを知っている攻撃者がキーを開封できるかどうかを答えることはできません。キーが封印されたとき。

別の質問は、キーをシールするためにどの方法を使用する必要があるかです-私の方法はtpm_sealdata/tpm_unsealdataを含みますが、別のプロジェクト tpm-luks は代わりにtpm-nvread/tpm-nvwriteを使用します。違いと、一方の方法がもう一方の方法より安全かどうかを知りたいのですが。

21
André Borie

まず、NOシステムは100%安全ですが、TPMを使用しない方がTPMを使用しないよりも優れています。 TPMチップは、一種の暗号化ストレージであり、Trusted Platform Environmentをサポートするコンピューターのマザーボード上に常駐し、それを処理するためのBIOSが用意されています。

PCRは、_TPM_Extend_操作によって処理される特定の関数を持つレジスターです。それらを「設定」することはできず、拡張するだけです(new_hash = [old_hash || new_measurement])。

TPMには、測定用の静的な信頼のルート(SRTM)と動的な測定用の信頼のルート(DRTM)があり、両方の組み合わせにより安全な環境が作成されます。 この男は非常によく説明しています これがどのように行われるか。固定アイテムと動的アイテムの間の信頼の連鎖です。

PCRに戻ると、これらはプラットフォームに依存しないレジスタであり、最も一般的なものは次のとおりです。

_PCR 0 to 3 for the BIOS, ROMS...
PCR 4 - MBR information and stage1
PCR 8 - bootloader information stage2 part1
PCR 9 - bootloader information stage2 part2
PCR 12 - all commandline arguments from menu.lst and those entered in the Shell
PCR 13 - all files checked via the checkfile-routine
PCR 14 - all files which are actually loaded (e.g., Linux kernel, initramfs, modules...)
PCR 15 to 23 are not used 
_

Intelベースのノートブックは通常、最初の16のレジスタを使用しますが、他のソフトウェア/用途に拡張することもできます。

TPMに情報(シーリング)を書き込んでいるときに、何らかの形で「管理キー」であり、このストレージに他のキーを追加するために使用されるストレージルートキー(SRK)を追加できます。 manpages のとおり、_-z_を使用するとTSS_WELL_KNOWN_SECRET (20 zero bytes)が設定されます。

_-z, --well-known
    Use TSS_WELL_KNOWN_SECRET (20 zero bytes) as the SRK password. 
    You will not be prompted for the SRK password with this option. 
_

そのため、このSRKをデフォルトのシークレット(_TSS_WELL_KNOWN_SECRET_)に設定しても、現在のPCRがデータのシールに使用されたものと一致する場合にのみTPMのシールを解除できるため、誰かを攻撃するには不十分です。また、一部のPCR処理はブート時に発生し(BIOS)、それらを操作して「偽の」PCRを作成することは非常に困難です。 BIOSは、残りのプロセスが行われる前にPCRがゼロと見なされる唯一の場所です。

唯一の実行可能な攻撃は、システムを「信頼された」状態にするためにマシンを再起動せずに、BIOSとPCR間のMITM通信を目的としてPCRをゼロにする攻撃です。この攻撃は TPMリセット攻撃 として知られています。

攻撃

したがって、上記のすべてを考慮すると、BIOSが最初のいくつかの測定を行う限り、信頼できるブートプロセスを偽造することは非常に困難です。ここでの重要な前提は、TPMが存在するプラットフォーム全体を再起動しないとPCRを簡単にリセットできないことです。攻撃者がBIOSによってPCRに送信された測定値を監視でき(たとえば、ロジックアナライザーを使用して、このペーパーを参照)、マシンを再起動せずにPCRをゼロにできる場合、攻撃者は任意のプラットフォームを利用できます。構成し、それを「信頼された」状態にします。したがって、難しいのは、マシン全体を停止せずにTPMをリセットすることです。メモリーの挿入など、測定後に実行中のシステムを変更することについても検討しましたが、メモリーとハードドライブが置かれているバスの速度が原因で、これは難しい作業です。遅いバスへの攻撃ははるかに簡単です。

TPMは通常、低ピン数(LPC)バスに常駐します。 LPCバスは、グランド駆動のリセットラインをサポートします。つまり、バス上のこの特定のラインがグランドに駆動されると、このバス上のすべてのデバイスがリセットされるはずです。このバスに接続されている他のデバイスには、BIOS、およびレガシーのキーボードとマウスのコントローラーが含まれます。以下のビデオは、このラインを運転することが実際に可能であり、かなり簡単であることを示しています。ビデオでは、リモートsshセッションを介して問題のコンピューターにアクセスしていることに注意してください。これは、リセットピンを駆動するとキーボードとマウスのコントローラーがリセットされますが、ネットワークカードはリセットされないためです。この攻撃(およびその他の攻撃)の詳細については、私の上級名誉論文である「信頼できるプラットフォームモジュールのセキュリティ評価」、ダートマス大学コンピューターサイエンステクニカルレポートTR2007-597を参照してください。

これは、Trusted Computingを含むすべてのものの単純化されたバージョンであることに注意してください。信頼できる環境のセットアップ中にBIOS、ハードウェア、およびソフトウェア間で発生するすべての操作の詳細については、 TPMv2のアーキテクチャドキュメント を参照してください。

tl; dr:デフォルトのストレージルートキー(20個のゼロバイト)を使用しても、安全でないシステムを作成するには不十分です。

関連するもの:

11
user28177