弱い、または危険な TLS 暗号スイート

弱い、または危険な TLS 暗号スイート

説明

弱い暗号スイートを明示的に許可すると、TLS の機密性や完全性が低下する可能性があります。RC4、3DES、以下の非推奨 CBC スイートにはそれぞれ異なる問題があり、AES-CBC というだけで全実装が同じ攻撃に弱いわけではありません。弱い組み合わせがネゴシエーションされると、攻撃者がデータの復元やセッションへの攻撃に利用するおそれがあります。

想定される影響

  • ネゴシエーションされた暗号の弱点による機密データや認証トークンの漏えい
  • アルゴリズムや実装の弱点を利用した通信の改ざん
  • TLS を使用していても保護が弱まり、セキュリティ要件を満たさない可能性

対処方法

  • tls.Config.CipherSuites は TLS 1.0–1.2 用です。TLS 1.3 の TLS_AES_128_GCM_SHA256 や TLS_AES_256_GCM_SHA384 はこのフィールドで設定できません。TLS 1.2 を明示的に構成する場合は tls.CipherSuites() と公式文書で推奨 AEAD スイートを確認してください。
  • 非推奨の RC4、3DES、CBC スイートを除き、明示的な一覧が必要でなければ、維持管理されている Go の既定値を使ってください。
  • MinVersion は tls.VersionTLS12 以上、互換性があれば tls.VersionTLS13 にして、古いプロトコルを除外してください。
  • Go のリリースノートとセキュリティ情報で、対応・推奨スイートの変更を確認してください。

例

変更前

go
package main

import (
    "crypto/tls"
    "net/http"
)

// 変更前: 弱い暗号スイートを明示的に選択
func insecureClient() *http.Client {
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{
            // これらの RC4、3DES、CBC スイートは脆弱または非推奨
            CipherSuites: []uint16{
                tls.TLS_RSA_WITH_RC4_128_SHA,
                tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
                tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
            },
            MinVersion: tls.VersionTLS10,
        },
    }

    return &http.Client{Transport: tr}
}

変更後

go
package main

import (
    "crypto/tls"
    "net/http"
)

// 変更後: 現代的な暗号スイートと TLS バージョンを使用
func secureClient() *http.Client {
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{
            // 可能なら TLS 1.3 を使用。既定の暗号スイートは Go が管理
            MinVersion: tls.VersionTLS12,
            // 必要なら適切な TLS 1.2 暗号スイートを明示的に選択
            CipherSuites: []uint16{
                tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
                tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
                tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
            },
        },
    }

    return &http.Client{Transport: tr}
}

説明:

  • 変更前: tls.TLS_RSA_WITH_RC4_128_SHA、tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA、tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 を明示しています。RC4 には統計的な弱点があり、ブロック長が短い 3DES は SWEET32 の影響を受けます。CBC のリスクはパディング処理と実装によって異なります。最小値を TLS 1.0 にすると、古い組み合わせも許可します。
  • 変更後: MinVersion: tls.VersionTLS12 で TLS 1.0/1.1 を除外します。別のスイート一覧では、TLS 1.2 用の GCM や CHACHA20-POLY1305 による AEAD を選び、変更前の非推奨スイートを除きます。TLS 1.3 のスイートは Go が別途管理します。弱い組み合わせのリスクを減らしますが、証明書検証は引き続き必要です。

参考資料