Logjam
Logjam とは、TLSで利用されるディフィー・ヘルマン鍵交換(Diffie-Hellman,DH)の脆弱性です。輸出可能な弱い暗号を利用させる中間者攻撃を行い、通信の内容を取得する攻撃です。
読み方
- Logjam
- ろぐじゃむ
概要
TLSを利用した暗号化通信の確立前にLogjamの脆弱性を利用されると、中間者攻撃により、TLS接続を512ビットの輸出グレード暗号に落とし、攻撃者が通信の内容を傍受・改ざんできます。
Diffie-Hellman の鍵共有プロトコルを攻撃するには、離散対数問題の数学的に困難な問題を解く必要があります。TLSの実装の中には、離散対数問題で利用される素数が再利用されるものがあります。問題を得には、数体ふるい方を使用し、再利用されている素数から事前に計算を行うことで、攻撃時の時間を短縮できます。この事前計算により、小さい素数を使用している、現実的な時間ないで攻撃できます。
Non export-gradeの暗号スイートで512ビット程度の素数を使用しない環境で、 FREAK(Factoring attack on RSA-EXPORT Keys)の対策で Export Cipher が無効化されていれば、影響を受けません。
影響を受けるプロトコル
多数のプロトコルがこの攻撃の影響を受けます。
- HTTPS
- Secure Shell
- IPsec
- SMTPS
脆弱性のあるサーバ
DHE_EXPORT の暗号スイートをサポートしているサーバに脆弱性が存在します。
DHE_EXPORTとは
DHE_EXPORT は、1990年代のアメリカの輸出規制に準拠して暗号強度を弱めるために、 SSL 3.0とTLS 1.0でサポートされました。輸出規制解除後も互換性維持のために、多くのプログラムでサポートが継続されました。
診断方法
https://weakdh.org/sysadmin.html にでサーバ名を入力すると確認できます。
OpenSSL 1.0.2 コマンドラインツールで DH の設定がされているサーバを診断できます。
openssl s_client -connect www.example.jp:443 -cipher "EDH"
接続情報の "Server Temp Key" を探します。
openssl s_client -connect www.example.jp:443 -cipher "EDH"|grep "Server Temp Key"
DHをサポートしていない場合は、接続が失敗します。
$ openssl s_client -connect login.yahoo.co.jp:443 -cipher "EDH" CONNECTED(00000003) 34381592232:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:769: --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 7 bytes and written 145 bytes --- New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated
Perfect Forward SecrecyのためにECDHをサポートしているかチェックする場合には、以下の通りです。
$ openssl s_client -connect login.yahoo.co.jp:443 -cipher "ECDHE" CONNECTED(00000003) depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - G2 verify error:num=20:unable to get local issuer certificate --- Certificate chain 0 s:/C=JP/ST=Tokyo/L=Minato-Ku/O=Yahoo Japan Corporation/CN=login.yahoo.co.jp i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - G2 1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - G2 i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA --- Server certificate -----BEGIN CERTIFICATE----- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -----END CERTIFICATE----- subject=/C=JP/ST=Tokyo/L=Minato-Ku/O=Yahoo Japan Corporation/CN=login.yahoo.co.jp issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - G2 --- No client certificate CA names sent Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 3103 bytes and written 329 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: foo Session-ID-ctx: Master-Key: bar Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 7200 (seconds) TLS session ticket: 0000 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0020 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0030 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0040 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0050 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0060 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0070 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0080 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0090 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ Start Time: 1432218724 Timeout : 300 (sec) Verify return code: 20 (unable to get local issuer certificate) ---
対策方法
- Export Cipher Suites を無効化します。
- Elliptic-Curve Diffie-Hellman(ECDHE, 楕円曲線ディフィ・ヘルマン)を使用します。DHEはやめ、ECDHEを使用しましょう。
- 強いユニークなDiffie Hellman Groupを作成します。多くのサーバで少数の固定グループが使われています。固定的な素数は、使用してはいけません。DHの鍵交換で使用する阻止いのサイズを2048ビットにします。
サーバがクライアントになる場合
OpenSSLがサポートしているEXPORTグレードの暗号の確認方法は以下の通りです。
openssl ciphers -s EXP -v
実行例です。
% openssl ciphers -s EXP -v EXP-ADH-DES-CBC-SHA SSLv3 Kx=DH(512) Au=None Enc=DES(40) Mac=SHA1 export EXP-ADH-RC4-MD5 SSLv3 Kx=DH(512) Au=None Enc=RC4(40) Mac=MD5 export EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512) Au=RSA Enc=DES(40) Mac=SHA1 export EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512) Au=DSS Enc=DES(40) Mac=SHA1 export EXP-DES-CBC-SHA SSLv3 Kx=RSA(512) Au=RSA Enc=DES(40) Mac=SHA1 export EXP-RC2-CBC-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export EXP-RC4-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export EXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
関連項目
ツイート