BEAST漏洞及其解决方法
2023年7月31日
BEAST攻击针对TLS 1.0及更早版本的协议漏洞。解决方法包括升级到更新版本(TLS 1.1或更高)以及在某些环境中避免使用CBC模式加密算法(如RC4)。了解如何通过实用建议保护您的系统免受BEAST攻击。
BEAST脆弱性とは何か
BEAST (Browser Exploit Against SSL/TLS)は、2011年に公にされた一部のバージョンのSSL/TLSプロトコルに存在する脆弱性です。特にTLS 1.0以前のバージョンと一部のSSL 3.0の実装に影響を与えています。
BEASTは、暗号化されたデータを解読するための攻撃手法であるブロック暗号の攻撃とも関連しています。具体的には、Cipher Block Chaining (CBC) モードと呼ばれるブロック暗号の一部で使用される暗号化方式に対する攻撃手法です。
攻撃者がネットワーク上で中間者となり、クライアントとサーバー間の通信を盗聴したり改ざんしたりすることで、暗号化されたHTTPクッキーなどの重要なデータを取得することが可能になります。
BEASTに対する対策としては、脆弱性のあるプロトコルバージョン(TLS 1.0やそれ以前)の使用を避け、より新しいバージョン(TLS 1.1以上)の使用を推奨します。また、RC4といったCBCモードを使用しない暗号化アルゴリズムの使用も一部の環境で推奨されています。
BEAST脆弱性の危険性
BEAST脆弱性が発見された当時、その影響は非常に深刻なものと見なされました。クライアントとサーバー間の通信を中間者攻撃で盗聴または改ざんする能力は、ユーザーの個人情報や機密データを大きく危険に晒す可能性がありました。
特に、ユーザーの認証情報(例えば、HTTPクッキーによるセッションID)を盗むことで、攻撃者はユーザーになりすましてWebサービスを利用できる可能性があったため、セキュリティ上非常に重要な問題でした。
ただし、現在では多くのウェブブラウザーがこの問題に対応し、デフォルトでより新しいTLSバージョンを使用するようになりました。また、サーバーサイドでも対策が施されており、この脆弱性を突くための攻撃が成功する確率は非常に低くなりました。
したがって、**もしもあなたのウェブサイトがBEAST脆弱性を持っている場合、それはあなたのサイトが古いSSL/TLSプロトコルバージョンを使用しているか、またはサーバーの設定が適切でないことを意味します。**これにより理論的には中間者攻撃による情報漏洩のリスクがありますが、現実的にはその可能性は非常に低いでしょう。
それにもかかわらず、最善のセキュリティを確保するためには、BEAST脆弱性の修正が推奨されます。具体的には、サーバーの設定を見直し、必要であれば更新して、最新かつ安全なTLSバージョンが使用されていることを確認することが必要です。
BEAST脆弱性の対処法
現在、TLS 1.3は最新で最も安全なプロトコルとされています。TLS 1.3では、過去のバージョンで問題となっていた脆弱性(例えば、上記のBEAST脆弱性)が解消されています。また、新たに開発されたセキュリティ機能が導入されており、安全性が大幅に向上しています。
逆に、TLS 1.0や1.1などの古いプロトコルは、多くの脆弱性を抱えています。これらの脆弱性は攻撃者によって悪用される可能性があるため、古いプロトコルの使用は避けるべきです。
なお、ブラウザは通常、最新で最も安全なプロトコルを自動的に使用しますが、ブラウザが対応している最新のプロトコルでも、サーバー側が古いプロトコルしかサポートしていない場合、通信はその古いプロトコルで行われます。このような状況を防ぐためにも、サーバー側の設定で新しいプロトコルをサポートするようにすることが重要です。
Beast脆弱性に対する解決策
BEAST脆弱性に対する具体的な解決策は、使用しているWebサーバーソフトでTLS1.1以下のプロトコルの使用をやめることです。SSL2.0、SSL3.0、TLS1.0、TLS1.1を使用プロトコルの設定から除外する事が必要になります。
以下のようにTLS1.2未満を除外することが、直接的な解決策となります。
ssl_protocols TLSv1.2 TLSv1.3;
Apacheの場合は以下のようになります
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
BEAST脆弱性を防ぐにはサーバーソフトの設定段階からモダンな設定を行うことが本質的かつ効果的です。Mozilla社が提供しているSSL Configuration Generatorを使用すれば、モダンな設定のテンプレートが生成できますから、再現性の観点から推奨されます。
モダンな設定の場合、以下のようになります。
Nginx
# generated 2023-10-23, Mozilla Guideline v5.7, nginx 1.17.7, OpenSSL 1.1.1k, modern configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=modern&openssl=1.1.1k&guideline=5.7
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /path/to/signed_cert_plus_intermediates;
ssl_certificate_key /path/to/private_key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# modern configuration
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
# replace with the IP address of your resolver
resolver 127.0.0.1;
}
Apache
# generated 2023-10-23, Mozilla Guideline v5.7, Apache 2.4.41, OpenSSL 1.1.1k, modern configuration
# https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=modern&openssl=1.1.1k&guideline=5.7
# this configuration requires mod_ssl, mod_socache_shmcb, mod_rewrite, and mod_headers
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /path/to/signed_cert_and_intermediate_certs
SSLCertificateKeyFile /path/to/private_key
# enable HTTP/2, if available
Protocols h2 http/1.1
# HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>
# modern configuration
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"