秘密鍵の漏えいと前方秘匿性
A 社の Web サーバは TLS 1.2 で運用しており,暗号スイートとして TLS_RSA_WITH_AES_128_GCM_SHA256 と TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 の両方を受け付けていた。攻撃者は 1 年前からこのサーバとの通信を盗聴して記録しており,今回,サーバ証明書に対応する RSA 秘密鍵を入手した。記録された過去の通信に関する記述として,適切なものはどれか。ここで,サーバは ECDHE の一時鍵をハンドシェイクごとに生成し,使用後に破棄していたものとする。
- アECDHE を用いたセッションも,ServerKeyExchange の署名に RSA 秘密鍵が使われているので,入手した秘密鍵から共有秘密を計算して解読できる。
- イRSA 鍵交換を用いたセッションも,セッション鍵はハンドシェイクごとに乱数から生成されるので,セッションごとに総当たりしない限り解読できない。
- ウサーバ証明書を直ちに失効させれば,記録された過去の通信は,どちらの暗号スイートを用いたものも解読から保護できる。
- エRSA 鍵交換を用いたセッションは解読されるおそれがあるが,ECDHE を用いたセッションは,入手した秘密鍵だけでは解読できない。
正解と解説を見る
正解 エ
この問題の基礎知識
- TLS 1.2 の暗号スイート名は,鍵交換,認証,暗号化及びハッシュ関数の方式を表し,TLS_ECDHE_RSA_WITH_… は鍵交換が ECDHE,サーバ認証が RSA 署名,TLS_RSA_WITH_… は鍵交換と認証がともに RSA である。
- RSA 鍵交換では,クライアントが生成したプリマスタシークレットをサーバの RSA 公開鍵で暗号化して送り,両者はそこからセッション鍵を導出する。
- 前方秘匿性は,長期の秘密鍵が漏えいしても過去のセッションの鍵を求められない性質であり,使い捨ての鍵で共有秘密を導出する DHE や ECDHE によって得られる。
- 証明書の失効は,以後その証明書を信頼させないための措置であり,すでに記録された暗号文の安全性には影響しない。
ECDHE_RSA の RSA 秘密鍵は,サーバが送る ECDHE の公開値への署名(サーバの認証)に使われるだけで,共有秘密の導出には関与しない。一時秘密鍵が破棄されていれば,長期鍵を入手しても共有秘密は計算できない。
RSA 鍵交換では,クライアントが乱数で生成したプリマスタシークレットをサーバの RSA 公開鍵で暗号化して送る。記録した ClientKeyExchange を入手した秘密鍵で復号すれば値がそのまま得られ,セッション鍵を導出できる。
失効は,以後その証明書を信頼させないための措置であり,記録済みの暗号文の復号には影響しない。秘密鍵の漏えい後に過去の通信を守れるかは,通信した時点の鍵交換方式で決まる。
RSA 鍵交換ではセッション鍵の元となる値が長期鍵である RSA 鍵で暗号化されて送られるので,秘密鍵が漏えいすると過去の通信も解読される。ECDHE は使い捨ての鍵で共有秘密を導出するので前方秘匿性があり,長期鍵の漏えいが過去の通信に及ばない。
照合の根拠(7 件)
- エ(正解)・イ(誤り): RSA 鍵交換ではプリマスタシークレットがサーバ証明書の公開鍵で暗号化されて送られるので,秘密鍵があれば記録した ClientKeyExchange から復号できる
If RSA is being used for key agreement and authentication, the client generates a 48-byte premaster secret, encrypts it using the public key from the server's certificate, and sends the result in an encrypted premaster secret message.
RFC 5246 · Section 7.4.7.1(新しいタブで開きます) - イ(誤り): マスタシークレットはプリマスタシークレットと平文で送られる双方の乱数から計算されるので,プリマスタシークレットが得られればセッション鍵も導出できる
master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)
RFC 5246 · Section 8.1(新しいタブで開きます) - エ(正解): TLS_RSA_WITH_* の暗号スイートは前方秘匿性をもたない
Rationale: These cipher suites, which have assigned values starting with the string "TLS_RSA_WITH_*", have several drawbacks, especially the fact that they do not support forward secrecy.
RFC 9325 · Section 4.1(新しいタブで開きます) - エ(正解)・ア(誤り): 前方秘匿性があれば,通信後に長期鍵を入手してもセッション鍵は求められない
Forward secrecy ensures in such cases that it is not feasible for an attacker to determine the session keys even if the attacker has obtained the long-term keys some time after the conversation.
RFC 9325 · Section 7.3(新しいタブで開きます) - エ(正解): 前方秘匿性は(EC)DH でセッション鍵を導出することで実現される
Forward secrecy is generally achieved by using the Diffie-Hellman scheme to derive session keys.
RFC 9325 · Section 7.3(新しいタブで開きます) - ア(誤り): ECDHE_RSA の RSA 秘密鍵は ServerKeyExchange の署名に使われるだけである
This key exchange algorithm is the same as ECDHE_ECDSA except that the server's certificate MUST contain an RSA public key authorized for signing and the signature in the ServerKeyExchange message must be computed with the corresponding RSA private key.
RFC 8422 · Section 2.2(新しいタブで開きます) - ウ(誤り): 失効は失効した証明書を以後信頼させないための仕組みであり,記録済みの暗号文の復号を防ぐものではない
Certificate revocation is an important tool when recovering from attacks on the TLS implementation as well as cases of misissued certificates. TLS implementations MUST implement a strategy to distrust revoked certificates.
RFC 9325 · Section 7.5(新しいタブで開きます)
RFC 9325 Section 7.4 は一時鍵(指数)を使い回すと前方秘匿性が失われるとしているが,問題文ではハンドシェイクごとに生成・破棄しているのでエが成り立つ。