CloudflareでLucky13の脆弱性に対応する方法
まず、チェック方法(事前にdockerのインストールが必要)
docker run --rm -ti drwetter/testssl.sh --lucky13 https://yourdomain
で確認できる。
https://testssl.sh/ というCLIツールを使ってLucky13の脆弱性を確認している。
実際内部で何をしているのかは分かっていないが、多分CBC系の暗号をリクエストしてサーバーから許可されているのかを確認しているんでしょう。
CBC系の暗号を許可している場合は以下のように表示されるはず。
Cloudflare側では、
こちらのAPIでhostname毎のCipher suite設定ができる。- zone_identifierはCloudflare管理画面のOverviewページで確認できる(Zone ID)
- APIリクエストにはトークンが必要で、権限があればアカウント設定から作成できるはず。
- 一応Global API Keyではなく、権限を減らしたAPI Tokenを作成した。
- 必要なPermissionは、Zone -> SSL and Certificates -> Edit権限。
これらをベースに、以下のようなリクエストを実行する。
curl --request PUT \
--url https://api.cloudflare.com/client/v4/zones/zone_identifier/hostnames/settings/ciphers/hostname \
--header 'Content-Type: application/json' \
--header 'X-Auth-Email: ' \
--data '{
"value": ["ECDHE-ECDSA-AES128-GCM-SHA256", "ECDHE-ECDSA-CHACHA20-POLY1305", "ECDHE-RSA-AES128-GCM-SHA256", "ECDHE-RSA-CHACHA20-POLY1305", "ECDHE-ECDSA-AES256-GCM-SHA384", "ECDHE-RSA-AES256-GCM-SHA384"]
}'
valueに指定しているのが許可するCipher suite。CBCを使用する暗号を除外すれば、テストは通るはず。
こちらのModern に分類されるものを指定している。
上記のAPIでCipher suiteを更新してから、
docker run --rm -ti drwetter/testssl.sh --lucky13 https://yourdomain
を再実行すると、こちらのようになるはず。
これでLucky13脆弱性に対応することができた。
なお、Cloudflare自身はこちらの記事 で問題ないと説明しているみたい。確かにユーザーが最新のブラウザを使用していれば、優先的に使用される暗号はCBCではないはずなので、問題ない。
ただ、testssl.shでのチェックは通らない。これはtestssl.shでは優先度の確認ではなく、そもそもCBC系の暗号を許可しているかどうかのチェックをしているからだと思われる。
とても古いブラウザバージョンでCBC系の暗号のみしかサポートしていないといったことがあれば、そのブラウザではLucky13の脆弱性による被害が発生する可能性がある。
- どのブラウザ・どのバージョンでどのCipherを使用するのかをチェックする方法は不明
- サーバーでCipher suiteを減らすことで、古いブラウザではアクセスできなくなる問題がありそう
- 実際にどんなエラーになるのかは不明
Lucky13については、こちらに細かい記載がありました。
こちらのコマンドで、各クライアントからサーバーに接続する際のCipher suiteを確認できました。
docker run --rm -ti drwetter/testssl.sh --client-simulation https://yourdomain
Cloudflareの設定前後で比較すると、古いブラウザで異なるCipher suiteを使用しているようでした。
一方で設定変更によって接続不可になっているクライアントは無かったので、ユーザー側に影響は少ないと考えられそうです。