TLS における Diffie-Hellman 鍵交換の脆弱性(再掲載)
なんか node.js が今さら Logjam 攻撃に対応したとか言ってるので
- Node v0.10.42 (LTS) | Node.js
- Node v0.12.10 (LTS) | Node.js
- Node v4.3.0 (LTS) | Node.js
- Node v5.6.0 (Stable) | Node.js
以前 Qiita に書いた記事をこちらでも再掲載する。 ちなみに元記事は2015年5月に公開している。
ちなみに OpenSSL 1.0.2f では Logjam 攻撃への追加対応のほか,安全でない素数を生成する問題や SSLv2 をブロックできない問題に対応している。 むしろこちらの方が重要か。
- [openssl-announce] OpenSSL Security Advisory
- Vulnerability Note VU#257823 - OpenSSL re-uses unsafe prime numbers in Diffie-Hellman protocol
- JVNVU#95668716: OpenSSL の DH プロトコルにおける脆弱性
安全でない素数を生成する問題については CVSSv3 基本値 CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
で 7.4 と見積もられている。
基本評価基準 | 評価値 |
---|---|
攻撃元区分(AV) | ネットワーク(N) |
攻撃条件の複雑さ(AC) | 高(H) |
必要な特権レベル(PR) | 不要(N) |
ユーザ関与レベル(UI) | 不要(N) |
スコープ(S) | 変更なし (U) |
情報漏えいの可能性(機密性への影響, C) | 高(H) |
情報改ざんの可能性(完全性への影響, I) | 高(H) |
業務停止の可能性(可用性への影響, A) | なし(N) |
脆弱性の内容
通称 “Logjam” 攻撃。
かつて騒がれた FREAK 脆弱性と同じく, TLS 経路上に「中間者」がいる場合, Diffie-Hellman(DH)鍵交換で使われる鍵を輸出用の脆弱なものにダウングレードさせられる。 FEAK のときとは異なり,特定の実装の脆弱性ではなく TLS プロトコルの欠陥。
ちなみに DH 鍵交換アルゴリズムは公開鍵暗号の一種で,お互いに(もちろん第3者にも)秘密情報(秘密鍵)を知られることなく安全にセッション鍵を生成することができる。 ベースとなるロジックは「離散対数問題」と呼ばれるもので ElGamal や DSA と同系統のロジック。なので,鍵長の管理も ElGamal や DSA と同等のものが要求される。
暗号強度と各暗号方式の鍵長の関係は以下のとおり(単位はすべてビット)
Security
StrengthSymmetric
key
algorithmsFFC
(DSA, DH,
MQV)IFC
(RSA)ECC
(ECDSA,
EdDSA, DH,
MQV) $\le 80$ 2TDEA $L=1024$
$N=160$ $k=1024$ $f = 160\text{ - }223$ $112$ 3TDEA $L=2048$
$N=224$ $k=2048$ $f = 224\text{ - }255$ $128$ AES-128 $L=3072$
$N=256$ $k=3072$ $f = 256\text{ - }383$ $192$ AES-192 $L=7680$
$N=384$ $k=7680$ $f = 384\text{ - }511$ $256$ AES-256 $L=15360$
$N=512$ $k=15360$ $f=512+$ SP 800-57 Part 1 Revision 5
5.6.1.1)
2030年以降も安全に使える暗号強度は $128\,\mathrm{bits}$ 以上だと言われている。 Logjam 攻撃では $L=512\,\mathrm{bits}$ にダウングレードさせられるが全くお話にならない強度だということが分かるだろう。
暗号について詳しくは拙文「わかる! OpenPGP 暗号」の「暗号に関する雑多な話」あたりをどうぞ。 また FREAK については Gist にまとめているので,そちらも参考にどうぞ。
影響度(CVSS)
CVSSv2 基本値 5.0 (AV:N/AC:L/Au:N/C:P/I:N/A:N)
基本評価基準 | 評価値 |
---|---|
攻撃元区分(AV) | ネットワーク(N) |
攻撃条件の複雑さ(AC) | 低(L) |
攻撃前の認証要否(Au) | 不要(N) |
情報漏えいの可能性(機密性への影響, C) | 部分的(P) |
情報改ざんの可能性(完全性への影響, I) | なし(N) |
業務停止の可能性(可用性への影響, A) | なし(N) |
CVSSv2 基本値 4.3 (AV:N/AC:M/Au:N/C:N/I:P/A:N)
基本評価基準 | 評価値 |
---|---|
攻撃元区分(AV) | ネットワーク(N) |
攻撃条件の複雑さ(AC) | 中(M) |
攻撃前の認証要否(Au) | 不要(N) |
情報漏えいの可能性(機密性への影響, C) | なし(N) |
情報改ざんの可能性(完全性への影響, I) | 部分的(P) |
業務停止の可能性(可用性への影響, A) | なし(N) |
CVSS についてはデモページを参照のこと。
影響を受ける実装
- Microsoft : 影響あり。 MS15-055 で修正済み
- OpenSSL 規定で輸出グレード暗号は無効化されているので,実質的には大丈夫? : Logjam, FREAK and Upcoming Changes in OpenSSL - OpenSSL Blog
また、「OpenSSL」v1.0.2b/v1.0.1nに関しては、TLS通信で暗号強度の弱い輸出グレードの暗号へ意図せずダウングレードされてしまう“Logjam”脆弱性(CVE-2015-4000)も修正されている。
-
Apple Safari : 影響あり。修正版なし
-
Android : 影響あり。修正版なし
-
Google Chrome : 影響あり。修正版なし。 Chrome 43 でも解消されてないらしい
-
Mozilla Firefox : 影響あり。修正版なし
- 脆弱性 Logjam Attack対策 for Firefox - ふらっと 気の向くままに : Firefox が更新されるまで DH(E) を無効化する
-
OpenVPN : 影響はほとんどない?
- TLSの脆弱性「Logjam」のOpenVPNへの影響 « yamata::memo
- OpenVPNでは、サーバーセットアップ時に openssl dhparam コマンドを使ってOpenVPN専用のDHパラメータを生成しているため、DHパラメータを別個に生成しない使用方法よりは安全といえる。
- openssl dhparam コマンドの実行時に鍵長を 2048ビット以上にしていれば安全。1024ビットの場合は攻撃される可能性は否定できないが、それでも簡単ではない。
- TLS-Authが有効になっていればこの種のTLSのダウングレード攻撃は回避できる。
- TLSの脆弱性「Logjam」のOpenVPNへの影響 « yamata::memo
-
OpenSSH : 影響あり。 On OpenSSH and Logjam – Technology & Policy – Jethro Beekman
-
Logjam: PFS Deployment Guide : サーバ側での回避例
影響の有無を確認する方法
ブラウザで “The Logjam Attack” のサイトを訪れると自動的に判定してくれる。
Warning! Your web browser is vulnerable to Logjam and can be tricked into using weak encryption. You should update your browser.
と表示されると影響を受ける可能性がある。
サーバ側は “Guide to Deploying Diffie-Hellman for TLS” のページにある “Server Test” で確認できる。
参考ページ
- Logjam TLS Attack
- Logjam: How Diffie-Hellman Fails in Practice
- セキュリティホール memo の記事
- Logjam Attackについてまとめてみた - piyolog
- The Logjam (and Another) Vulnerability against Diffie-Hellman Key Exchange - Schneier on Security
- OpenSSH環境に対するLogjam脆弱性の対応 | NaviPlus Engineers’ Blog : “On OpenSSH and Logjam” の日本語解説
- Logjam, Part 1: Why the Internet is Broken Again (an Explainer) | Electronic Frontier Foundation
- Logjam, Part 2: Did the NSA Know the Internet Was Broken? | Electronic Frontier Foundation