web-dev-qa-db-ja.com

OpenSSL TLSハートビート(Heartbleed)エクスプロイトはどの程度正確に機能しますか?

OpenSSL Heartbleed attack について詳しく聞いています。これは、TLSのハートビートステップの欠陥を悪用しています。聞いたことがない場合は、次のことが可能です。

  • OpenSSL秘密鍵を盗む
  • OpenSSLセカンダリキーを盗む
  • 影響を受けるサーバーから最大64kbのメモリを取得する
  • その結果、サーバーとクライアント間のすべてのトラフィックを復号化します

この問題を修正するOpenSSLへのコミットは here です

私は少し不明確です-私が読んだすべてには、それについて何をすべきかに関する情報が含まれていますが、それがどのように機能するかは含まれていません。では、この攻撃はどのように機能するのでしょうか?

224
user43639

これはTLSの欠陥ではありません。これは、OpenSSLの単純なメモリ保護バグです。

これまでに出会った最も良い説明は、ブログの投稿 OpenSSL Heartbleedバグの診断 によるSean Cassidyと 今週の攻撃:OpenSSL Heartbleed によるMatthew Greenです。

つまり、Heartbeatは1つのエンドポイントが「データを送信しているので、それをエコーバックして」送信できるようにします。長さの数値とデータ自体の両方を送信します。長さは最大64 KiBです。残念ながら、長さの数値を使用してclaim「64 KiBのデータを送信しています」(たとえば)の場合、reallyたとえば1バイトを送信すると、OpenSSLは1バイトを送信し、RAMから64 KiB(マイナス1)の他のデータを送信します。

おっと!

これにより、他のエンドポイントはOpenSSLを使用してプロセスからメモリのランダムな部分を取得できます。攻撃者はメモリを選択できませんが、十分な回数試行すると、リクエストのデータ構造がプライベートなどの興味深いものの横に表示される可能性がありますキー、またはユーザーのCookieまたはパスワード。

すべての生のTLS接続データなどを記録しない限り、このアクティビティはどこにも記録されません。

良くない。

https://xkcd.com/1354/

上記のxkcdコミック は問題を説明する素晴らしい仕事をします。


編集:以下のコメントで、ハートビートメッセージは暗号化されていると書きました。これは常に正しいとは限りません。 TLSハンドシェイクの早い段階で、暗号化をオンにする前にハートビートを送信できます(ただし、そうする必要はありません)。この場合、要求と応答の両方が暗号化されません。通常の使用では、ハートビートは常に暗号化されて後で送信される必要がありますが、ほとんどのエクスプロイトツールは、おそらくハンドシェイクを完了して暗号化を待つ必要はありません。 (ありがとう、RedBaron。)

247
Matt Nordhoff