web-dev-qa-db-ja.com

Diffie Hellmanが「安全な」素数を使用していることを確認する方法

私は最近ペンテストされた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 のマニュアルを比較してください)。

dhparamdhparam -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を実行します)。

4
Z.T.