OpenSSLのHeartbleed脆弱性(CVE-2014-0160)で送信されるHeartbeat Request

Heartbleed

この脆弱性で送信されるHeartbeat Requestについて調べてみました。

脆弱性自体については、例えば以下のサイトなどで詳しく説明されています。

Heartbeat ExtensionのRFC

4章を見ると、payloadが長い場合 Heartbeat Request は捨てられるべきだと書いてあります。

If the payload_length of a received HeartbeatMessage is too large,
the received HeartbeatMessage MUST be discarded silently.

「4 Heartbeat Request and Response Messages」から抜粋

公開されているエクスプロイトによるHeartbeat Request

Heartbeat Request の内容の部分は以下になります。

Heartbleed Exploit

メモ

  • この抜き出した部分では分かりませんが、Server Hello Done が終われば、Heartbeat Request を送ってもいいようです。
  • この抜き出した部分の値の意味は、次の例で分かります。

ネットエージェントさんが提供しているHeartbleed脆弱性検査によるHeartbeat Request

実際に試してみました。そこでの通信内容から、Heartbeat Request の部分をWiresharkで見たのが次の画像です。

Net-Agent Vul Check Result

各値の意味

  • “18”
    • Content Type: Heartbeat (24)
  • “03 02”
    • Version: TLS 1.1 (0x0302)
  • “00 03”
    • Length: 3
  • “01”
    • Type: Request (1)
  • “40 00”
    • Payload Length: 16384
    • SSL/TLSレコードの最大長は 0x4000 です。
    • このリクエストでは payload がないので、本当は0です。
    • 実際のペイロードサイズとは異なった値をここにセットした場合であっても、その値の分だけデータが読み込まれてしまっていたのが問題でした。

メモ

  • 送信しているHeartbeat Request の内容は、上のエクスプロイトと全く同じです。
  • 検査するだけならPayload Length は 0x4000 ではなく、もっと小さい値でもいいような気がするのですがどうなのでしょうか。
  • [Malformed Packet: SSL] と報告されています。

Nmap NSE

https://svn.nmap.org/nmap/nselib/tls.lua

関連箇所を抜粋

tls.lua

https://svn.nmap.org/nmap/scripts/ssl-heartbleed.nse

関連箇所を抜粋

ssl-heartbleed.nse 1

ssl-heartbleed.nse 2

メモ

  • payload として “Nmap ssl-heartbleed” という文字列を指定していますが、レスポンスのチェック処理では payload の長さが3より大きければ問題ありとしているようです。実際はこのHeartbeat Request は捨てられるはずなので、この3という数字にあまり意味はないということでしょうか。

OpenSSLの修正コミット

念のためリンクを載せておきます。

[最終更新日: 2014年4月14日]

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*