web-dev-qa-db-ja.com

OpenSSLの脆弱性CVE-2015-0205

OpenSSLの次の脆弱性を理解することはできません。

DH client certificates accepted without verification [Server] (CVE-2015-0205)
=============================================================================

Severity: Low

An OpenSSL server will accept a DH certificate for client authentication
without the certificate verify message. This effectively allows a client
to authenticate without the use of a private key. This only affects servers
which trust a client certificate authority which issues certificates
containing DH keys: these are extremely rare and hardly ever encountered.

This issue affects OpenSSL versions: 1.0.1 and 1.0.0.

OpenSSL 1.0.1 users should upgrade to 1.0.1k.
OpenSSL 1.0.0 users should upgrade to 1.0.0p.

This issue was reported to OpenSSL on 22nd October 2014 by Karthikeyan
Bhargavan of the PROSECCO team at INRIA. The fix was developed by Stephen
Henson of the OpenSSL core team.

上記が意味をなさない理由は、クライアントがDH証明書を使用するときに、クライアントが証明書検証メッセージを送信することを期待されていないためです RFC 5246、セクション7.4.8

  This message is used to provide explicit verification of a client
  certificate.  This message is only sent following a client
  certificate that has signing capability (i.e., all certificates
  except those containing fixed Diffie-Hellman parameters).

そして、これが RFC 5246、セクションF.1.1. が言うことです:

  When Diffie-Hellman key exchange is used, the server can either
  supply a certificate containing fixed Diffie-Hellman parameters or
  use the server key exchange message to send a set of temporary
  Diffie-Hellman parameters signed with a DSA or RSA certificate.
  Temporary parameters are hashed with the hello.random values before
  signing to ensure that attackers do not replay old parameters.  In
  either case, the client can verify the certificate or signature to
  ensure that the parameters belong to the server.

  If the client has a certificate containing fixed Diffie-Hellman
  parameters, its certificate contains the information required to
  complete the key exchange.  Note that in this case the client and
  server will generate the same Diffie-Hellman result (i.e.,
  pre_master_secret) every time they communicate.  To prevent the
  pre_master_secret from staying in memory any longer than necessary,
  it should be converted into the master_secret as soon as possible.
  Client Diffie-Hellman parameters must be compatible with those
  supplied by the server for the key exchange to work.

さらに、クライアントの秘密鍵を知らずにクライアントを偽装する方法(つまり、pre_master_secretを計算する方法)を確認できません。

OpenSSLのバグにより、攻撃者が認証をバイパスできる可能性があることを確認できます。たとえば、OpenSSLがクライアントキー交換メッセージのDHパラメータを受け入れる場合、つまりOpenSSLがこの部分を適切に実施しなかった場合 RFC 5246、セクション7.4 .7

  When the client is using an ephemeral Diffie-Hellman exponent,
  then this message contains the client's Diffie-Hellman public
  value.  If the client is sending a certificate containing a static
  DH exponent (i.e., it is doing fixed_dh client authentication),
  then this message MUST be sent but MUST be empty.

しかし fix はこの解釈をサポートしていません。実際、証明書の確認メッセージが必要なようです!

誰かがこれを理解できますか?

5
Erwan Legrand

結局、上記の私の質問からの次の仮説は真実であることが判明しました:

OpenSSLのバグにより、攻撃者が認証をバイパスできる可能性があることを確認できます。たとえば、OpenSSLがクライアントキー交換メッセージのDHパラメータを受け入れる場合、つまり、OpenSSLがRFC 5246のこの部分を適切に実施しなかった場合、セクション7.4.7

このコードは、OpenSSLのssl3_get_client_key_exchange()関数から取得されます。

https://github.com/openssl/openssl/blob/474e469bbd056aebcf7e7d3207ef820f2faed4ce/ssl/s3_srvr.c#L2325

if (n == 0L) {
  /* Get pubkey from cert */
  EVP_PKEY *clkey = X509_get_pubkey(s->session->peer);
  if (clkey) {
    if (EVP_PKEY_cmp_parameters(clkey, skey) == 1)
      dh_clnt = EVP_PKEY_get1_DH(clkey);
  }
  if (dh_clnt == NULL) {
    al = SSL_AD_HANDSHAKE_FAILURE;
    SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
    SSL_R_MISSING_TMP_DH_KEY);
    goto f_err;
  }
  EVP_PKEY_free(clkey);
  pub = dh_clnt->pub_key;
} else
  pub = BN_bin2bn(p, i, NULL);
if (pub == NULL) {
  SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, SSL_R_BN_LIB);
  goto err;
}

上記のコードは、クライアント(またはMITM)がクライアント証明書交換メッセージでDH証明書とDHパラメータを同時に提供することを妨げません。メッセージが空でない場合、公開鍵はメッセージから読み取られます。

} else
  pub = BN_bin2bn(p, i, NULL);

したがって、攻撃者は証明書を提供し、証明書内のものとは別の公開鍵を使用してDH鍵交換を実行する可能性があります。

何らかの理由で、OpenSSL開発者は、クライアントがDH証明書を提供するときに空のクライアントキー交換メッセージを要求しないことを選択します。 (ただし、これはRFCで必要です)。

OpenSSLチームからの修正がDH証明書によるクライアント認証を中断しない理由は、ssl3_get_client_key_exchange()が証明書からキーを読み取った場合、ssl3_get_cert_verify()関数が呼び出されないためです。ロジックはやや複雑ですが...まあ、それはうまくいきます!

3
Erwan Legrand

まったく同感です。署名が認証のどの部分にも関与していないため、エフェメラルDHの場合、証明書検証メッセージのスコープはありません。

1
user45475