コンテンツにスキップ

Insecure TLS Renegotiation (CVE-2009-3555)

安全でないTLS再ネゴシエーション (CVE-2009-3555)

説明

この脆弱性は、サーバーがRFC 5746で定義されている安全な再ネゴシエーションをサポートしていないことを示しており、TLSハンドシェイクの再ネゴシエーション中に平文インジェクション攻撃を受ける脆弱な状態にあります。

TLS再ネゴシエーションにより、アクティブなセッション中に接続パラメータを変更することが可能になります。オリジナルのTLS仕様では、再ネゴシエーションのハンドシェイクを既存の接続に暗号的にバインドすることができなかったため、攻撃者が暗号化されたセッションにデータをインジェクションできるというセキュリティ上の欠陥が生じました。

機能の仕組み:

  1. 攻撃者はターゲットサーバーへのTLS接続を確立し、悪意のあるリクエストをインジェクションします。
  2. 正当なクライアントが同じサーバーに接続を試みます。
  3. 攻撃者は既存のセッションの「再ネゴシエーション」として、クライアントのハンドシェイクを割り込ませます。
  4. サーバーは認証されたクライアントのコンテキストで、攻撃者の初期データを処理します。

要件:

  • サーバーがRFC 5746なしでTLS再ネゴシエーションをサポートしている。
  • Man-in-the-middleのネットワークポジション。
  • 認証前と認証後のデータを区別しないアプリケーションプロトコル。

Example Scenario: パブリックWiFi上の攻撃者が銀行の接続を傍受し、TLSセッションを確立して、不正な送金リクエストを送信します。被害者が認証を行うと、サーバーは悪意のある送金を、認証されたユーザーからの正当なリクエストとして処理します。

これは、HTTPS、SMTP over TLS、およびその他のTLSで保護されたプロトコルに影響を及ぼし、不正な取引、データの盗難、アカウントの侵害につながる可能性があります。

推奨事項

安全でないTLS再ネゴシエーションの脆弱性を緩和するには、以下の戦略を実装してください。

Primary Mitigation - Enable RFC 5746 Support:

TLSの実装をアップグレードして、RFC 5746 (TLS Renegotiation Indication Extension) をサポートするようにします。OpenSSL、GnuTLS、およびその他のTLSライブラリの最新バージョンには、デフォルトでこれが含まれています。

# Nginx設定 (OpenSSL 1.0.1以降はRFC 5746を自動サポート)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# Apache設定 (OpenSSL 1.0.1以降のmod_sslはRFC 5746をサポートします)
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLHonorCipherOrder on

Alternative Mitigations:

  1. Disable Renegotiation Entirely - アプリケーションで再ネゴシエーションが必要ない場合は、完全に無効にしてください。
# Nginx - 最近のバージョンではデフォルトで再ネゴシエーションが無効
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# mod_ssl を使用した Apache
SSLInsecureRenegotiation off
  1. Upgrade to TLS 1.3 - TLS 1.3では、本質的に安全になるよう再ネゴシエーションのメカニズムが再設計されました。
# サーバー構成をテストする
openssl s_client -connect example.com:443 -tls1_3

Testing and Verification:

# RFC 5746サポートのテスト
openssl s_client -connect example.com:443 -reconnect

# 安全な再ネゴシエーションの指示を確認する
nmap --script ssl-enum-ciphers -p 443 example.com

Java Applications:

Javaアプリケーションの場合、RFC 5746をサポートするJVMを使用していることを確認してください。

# 安全な再ネゴシエーションを要求するJavaシステムプロパティ
-Djdk.tls.allowLegacyResumption=false
-Djdk.tls.allowLegacyMasterSecret=false

Monitoring for Attacks:

TLSのログで不審な再ネゴシエーションのパターンがないか監視してください。

# 異常な再ネゴシエーション活動に対するログ分析の例
grep -i "renegotiation\|handshake" /var/log/nginx/error.log

RFC 5746のサポートを実装するか、再ネゴシエーションを完全に無効にすることで、安全なTLS通信を維持しながら攻撃ベクトルを排除できます。

リンク

標準

  • SOC2_CONTROLS:
    • CC_6_7
    • CC_7_1
  • CCPA:
    • CCPA_1798_150
  • GDPR:
    • ART_32
  • PCI_STANDARDS:
    • REQ_4_1
    • REQ_6_2
    • REQ_11_3
  • HIPAA_CONTROLS:
    • SECURITY252
    • SECURITY212
    • SECURITY213