OpenSSL DTLSのメモリリーク、CVE-2026-84782を読み解く

DTLSの再送メカニズムに不具合があり、失われたメッセージを回復するための通常処理が、深刻なメモリリークにつながっていました。OpenSSLの開発チームは脆弱性CVE-2026-84782を正式に公表しました。CVSS 3.1のスコアは8.2で、深刻度は高く評価されています。

DTLSはUDP上のデータ交換を保護するプロトコルです。応答が失われた場合に備え、ハンドシェイクメッセージを再送する機能が欠かせません。今回の欠陥は、大きなメッセージの送信が途中で中断した状態で、先行するメッセージを再送するタイマーが同時に作動した場合に発生します。OpenSSLはバッファの先頭から読み込むべきところを、直前の書き込み処理が止まった位置から誤って読み続けていました。

境界外読み取りの仕組み

このオフセットの誤りにより、再送処理がプロセスメモリ上の無関係なバイト列を不正に取り込み、暗号化されていないハンドシェイクデータとしてリモートのピアに送信する恐れがあります。読み取りがマッピングされていないメモリ領域に及んだ場合は、アプリケーションが異常終了します。その結果、この欠陥はサービス拒否(DoS)状態を引き起こす可能性もあります。技術的には境界外読み取りに分類され、CWE-125に指定されています。

影響を受けるのは、OpenSSLのバージョン4.0~4.0.3、3.6~3.6.5、3.5~3.5.9、3.4~3.4.8です。さらに、旧来の3.0、1.1.1、1.0.2の各ブランチにも脆弱性が残っています。これら旧ブランチの修正版は3.0.23、1.1.1zj、1.0.2zsですが、各ブランチの一般向けサポートはすでに終了しているか、延長サポートの対象に限られます。

ロジックの修正と緩和策

公開されたパッチは、ロジックの2つの根本的な問題を修正します。まず、再送を行う前に、OpenSSLが読み取り位置を必ずメッセージの先頭に戻します。次に、書き込みが未完了の場合は、後続の呼び出しでハンドシェイクが再開されるまで再試行自体を見送ります。これにより、ライブラリは単一の内部コンテキストを、本来両立しない2つの処理に同時に使うことがなくなります。

この状況が再現されるには、DTLS、ノンブロッキングI/O、そしてハンドシェイクの書き込み処理がすでに中断しているという特定のタイミングがそろう必要があります。そのため、この欠陥がすべての有効な接続で必ずメモリリークを引き起こすわけではありません。Red Hatは同じCVEにCVSS 3.1のスコア7.4を付け、攻撃の複雑さを非常に高いと評価しました。一方、公式のCVEリポジトリでは、より厳しい8.2と評価しています。

昨年夏には、OpenSSLで別のメモリ関連の異常「HollowByte」が研究者によって発見されています。これは、途中で切れたリクエストを送るだけで、TLSハンドシェイク中にサーバーが極端に大量のメモリを確保させられるという問題でした。今回のCVEはまったく別の仕組みによるもので、DTLSにのみ該当します。なお、脆弱なコードはFIPSモジュールの範囲外にあるため、認証済みのFIPSコンポーネントは直接の影響を受けません。

翻訳元: https://meterpreter.org/openssl-dtls-memory-leak-cve-2026-84782/

本記事は meterpreter.org の記事を翻訳・要約したものです。