web-dev-qa-db-ja.com

証明書/秘密鍵をRAMから抽出した場合、どのようにして知ることができますか?それともあなたは?

もちろん、 ハートブリードの脆弱性 に関連して、この攻撃の最悪のシナリオについて、SSL秘密鍵の抽出というニュースを読んでいます。もちろん、これにより、攻撃者は、侵害されたサーバーとの間で送受信されるすべてのトラフィックを復号化します。

これにより、最悪のシナリオを想定して、Heartbleedの脆弱なサーバーが秘密キーを含むメモリをエコーバックしたと考えました...攻撃者はそれを他のメモリコンテンツ、初期化されていないメモリ、または何から区別できるでしょうか?キーデータ自体にヘッダー/フッター、またはわかりやすいパターンはありますか?一部のRSAキー形式(PEM/base64)にファイル(-----BEGIN FOO BAR KEY-----および-----END FOO BAR KEY-----)、メモリに読み込まれたこれらの文字列を想像するのに苦労していますが。それへのポインターを使用して認識可能な何かを持っていることによってそれはおそらく与えられますか?

それはあなたが力ずくでできるようなものではないようです(メモリコンテンツのすべてのXビットの組み合わせを64 KBのメモリに対して試行すると、天文学的に大量の置換が生成されるようです)。

それで、どうやってそれを行うのですか?メモリ内の暗号化キーはどのように暗号化キーとして認識されますか?そして、関連する質問では、対称暗号鍵の答えは異なりますか、同じですか? (たとえば、フルディスク暗号化を使用するシステムに対して コールドブートアタック で抽出する場合があります。)

6
HopelessN00b

はい。ほとんどの秘密鍵の形式は簡単に識別できます。

Opensslで生成されたRSA秘密鍵といえば、それらは特定の形式になっています。たとえば、鍵のサイズに応じて常に同じ3バイトで始まります。

30 82 01 (for 768 bit key or MIIB in base64)
30 82 02 (for 1024 bit key or MIIC in base64),
30 82 04 (for 2048 bit key or MIIE in base64),  
30 82 09 (for 4096 bit key or MIIJ in base64).

秘密鍵を格納できる形式には、他にもいくつかの種類があります。

次のコマンドを使用して、opensslで自分でテストできます:openssl genrsa 1024(1024は、base64表現でキーを表示するための1024ビットキーを意味します。)

形式の詳細については、このStackOverflowの回答を参照してください。 RSA公開鍵の形式に関するいくつかの文書はどこにありますか? =

12
dr jimbob

ジンボブ博士の答えの補遺として:
これらのパターンを探し、その方法でキーを抽出しようとするユーティリティがあります。

免責事項:私はこれらのユーティリティのいずれも試していません。この投稿は、ユーザー「void-star」がHNに投稿したリンクのより良いバージョンです。 (下記参照。)

参考文献

2
StackzOfZtuff

StackzOfZtuffおよびdr jimbobの回答の(その他の)補遺として

アディシャミール他。格納されたキーでかくれんぼをすることは、ヘッダーを探すこととは非常に異なるアプローチを取ります

シャミールのアプローチは、完全なメモリ文字列内のデータのブロックを比較し(つまり、メモリ/ディスクの内容全体を文字列としてダンプする)、それらが既知の公開鍵に数学的に関連しているかどうかを確認します。

以前に既知の公開鍵がない鍵を見つけるために、データのエントロピーをチェックするためのチェックが行われました。

キーデータは非キーデータよりもエントロピーが多いことがわかっているため、キーを見つける1つの方法は、データを小さなセクションに分割し、各セクションのエントロピーを測定し、特に高いエントロピーがある場所を表示することです

キーは意図的にランダムであるため、このデータはランダムではないデータの背景に対して際立っています。この攻撃には、暗号化キーを見つけることができるという利点があります。

私たちの手法は、RSAスキームに加えて、他のさまざまな公開鍵スキームにも適用できるようです。

ジンボブ博士が指摘したように、トビアスクラインはヘッダーを探すというアプローチを取った

次に、このASN.1構文の16進表記を示します。
30 82 ?? ?? -シーケンス(30 82)、シーケンスの長さ(?? ??)
30 82 ?? ?? -シーケンス(30 82)、シーケンスの長さ(?? ??)

すべての証明書はこの構文で表す必要があるため、検索するパターンがあります。

完全なディスク暗号化を使用すると、すべてがランダムになるため、ディスク上のランダムデータを検索できなくなります。また、ヘッダーが暗号化されるため、ヘッダーを検索できなくなります。

ただし、マシンを起動すると、これらのいずれかの方法でメモリから直接キーを読み取ることができます。これは、VMの場合はさらに簡単です(私の回答を参照 ここ ))

0
Michael B