私は最近ペンテストされたWebアプリケーションの開発者です。ペンテストで報告された脆弱性の1つは、サーバーがキー交換で安全でないDiffie-Hellmanプライムを使用することです。私はこれを安全ではないと解釈します。 安全な素数 ではありません。追加のコンテキストとして、ペンテスターは this security advisory を参照しました。
この調査結果を確認したいと思います。具体的には、プライムを安全か安全でないかに分類するための「ノウハウ」を探しています。これは必ずしも知的観点からである必要はなく、サードパーティのリソースで十分です。私は SSL labs を使用してみました。これは、一般的な素数を使用しているかどうかをチェックしますが、安全でない素数かどうかはチェックしません。
私のサイトのDiffie Hellmanプライムが安全か安全でないかをどのように評価できますか?
openssl dhparam
には、使用できる-check
引数があります。しかし、opensslの現在のバージョンは正しくなく、厳格すぎます。証拠として、 RFC 7919 のDHEグループは、 D1.3 with TLS 1. に使用できる唯一のグループです このチェックに合格しない 安全に使用できますが。
「安全でない」グループパラメータは、openssl dhparam -dsaparam
によって生成されたものです。 TLSサーバーにSSL_OP_SINGLE_DH_USE
が設定されている限り、実際に安全に使用できます(リンクしたセキュリティ勧告によると)。 OpenSSL 1.1.1では、このオプションは常にオンで何もしません( 1.1. と 1.1.1 のマニュアルを比較してください)。
dhparam
、 dhparam -dsaparam
および dhparam -check
を実行すると呼び出されるコードを読み取ることができます。なぜコードがコードの機能を実行するのかを説明しないでください。
Security Stack Exchangeでは、Githubでマニュアルページを読んだりコードを閲覧したりできますが、必ずしも数学を理解しているとは限りません。誰かに数学について説明してもらいたい場合は、Cryptography Stack Exchangeで質問してください。しかし here はあなたを満足させるのに十分かもしれない答えです。
何をすべきか:Webサーバーが使用するDHグループをopenssl dhparam 2048
によって生成されたグループに置き換えるか、RFC 7919の値を使用します。
「ペンテスターはどうやって知りましたか?」という質問に答えるために、ペンテスターはおそらく次のようなものを実行しました:
#!/bin/bash
set -e
rm -f dh.pcapng
Sudo tcpdump -w dh.pcapng &
sleep 2
echo "Q" | openssl s_client -cipher 'EDH' -servername $1 -connect $1:443
sleep 2
Sudo killall tcpdump
sleep 2
printf "asn1=SEQUENCE:seq_sect\n[seq_sect]\nfield1=INTEGER:0x" >dh.cnf
tshark -r dh.pcapng -2 -R ssl.handshake.p -T fields -e ssl.handshake.p | sed -e 's/://g' >>dh.cnf
printf "\nfield2=INTEGER:0x" >>dh.cnf
tshark -r dh.pcapng -2 -R ssl.handshake.g -T fields -e ssl.handshake.g | sed -e 's/://g' >>dh.cnf
openssl asn1parse -genconf dh.cnf -noout -out dh.der
openssl dhparam -check -noout -inform DER -in dh.der
引数としてドメイン名を使用します(dh.sh
というファイルに入力し、ドメインでbash dh.sh www.example.com
を実行します)。