CCS Injection Attack on OpenSSL
OpenSSLに対するCCSインジェクション攻撃
概要
この脆弱性は、サーバーがCCSインジェクション攻撃を受けやすいことを示しています。この攻撃は、OpenSSLのChangeCipherSpecメッセージの不適切な処理を悪用し、TLSハンドシェイク中に脆弱な暗号化キーの使用を強制します。
CCS (ChangeCipherSpec) インジェクションは、マスターシークレットが正しく確立される前に、OpenSSLが順序外のCCSメッセージを許可してしまう場合に発生します。これにより、システムは実際にネゴシエートされたシークレットの代わりに、空のマスターシークレットを使用して暗号化キーを生成するため、予測可能で脆弱なキーが生成されます。
仕組み:
- 攻撃者は、ServerHelloの後、マスターシークレットが生成される前にTLSハンドシェイクを傍受します。
- 悪意のあるCCSメッセージが、クライアントとサーバーの両方の接続にインジェクトされます。
- 両方のエンドポイントは、空のマスターシークレット(すべてゼロ)を使用してセッションキーを生成します。
- 攻撃者は、予測可能で脆弱なキーを使用して、後続のすべてのトラフィックを復号化できます。
要件:
- クライアントとサーバーの両方が脆弱なOpenSSLバージョンを使用していること
- 中間者(man-in-the-middle)攻撃が可能なネットワークアクセス
- OpenSSL 1.0.1+ のサーバーは特に悪用されやすい
シナリオ例: Webアプリケーションがクライアントとサーバーの両方でOpenSSL 1.0.1gを使用しています。同じネットワーク上の攻撃者がTLSハンドシェイク中にCCSメッセージをインジェクトし、空のマスターシークレットから派生した暗号化キーを使用するように両側に強制します。その後、攻撃者はログイン資格情報やセッションCookieを含むすべてのHTTPSトラフィックを復号化できます。
この脆弱性は発見されるまで15年以上にわたりOpenSSLに存在し、脆弱なOpenSSLバージョンを使用する事実上すべてのSSL/TLS接続に影響を与え、セッションの完全な侵害を可能にしました。
推奨事項
CCSインジェクション攻撃を軽減するには:
主な対策 - OpenSSLの更新:
パッチが適用されたOpenSSLバージョンに直ちに更新してください。 - OpenSSL 1.0.1h 以降 - OpenSSL 1.0.0m 以降 - OpenSSL 0.9.8za 以降
# 現在のバージョンを確認する
openssl version
# パッケージの更新
apt-get update && apt-get upgrade openssl # Debian/Ubuntu
yum update openssl # RHEL/CentOS
サービスの再起動:
更新後、OpenSSLを使用しているすべてのサービスを再起動します。
systemctl restart apache2 # or nginx, postfix, etc.
systemctl restart postfix
systemctl restart dovecot
脆弱性のテスト:
# CCSインジェクション脆弱性のテストサーバー
openssl s_client -connect example.com:443 -msg 2>&1 | grep -i "early ccs"
# SSL Labsテストの使用
curl "https://api.ssllabs.com/api/v3/analyze?host=example.com"
追加の軽減策:
- ネットワークトラフィックで異常なCCSメッセージパターンを監視する
- 可能な限りcertificate pinningを実装して、MITM試行を検出する
- 重要なアプリケーションにはOpenSSL以外のTLS実装(NSS、GnuTLS)を使用する
- キーの侵害による被害を制限するためにパーフェクトフォワードシークレシー(perfect forward secrecy)を有効にする
CCSインジェクションでは秘密鍵や証明書は公開されないため、パッチ適用後の証明書の交換は不要です。
リンク
基準
- SOC2_CONTROLS:
- CC_6_7
- CC_7_1
- CCPA:
- CCPA_1798_150
- GDPR:
- ART_32
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213
- SECURITY255
- SECURITY258
- PCI_STANDARDS:
- REQ_4_1
- REQ_6_2
- REQ_11_3