DROWN は、時代遅れで脆弱な暗号化を使用して RSA を復号化することの略です。
これは、脆弱性ノート VU#583776 からのものです:SSLv2 で RSA ベースの SSL 証明書を使用して暗号化されたネットワーク トラフィックは、DROWN 攻撃によって復号化される可能性があります。
これは CVE-2016-0800 とも呼ばれます。
この問題を解決するには、RSA ベースの SSL 証明書を使用しているサーバーで SSLv2 のサポートを無効にするだけです。 SSLv2 は 2011 年から廃止されました。もう SSLv2 を使用する理由はありません。
DROWN 脆弱性をテストする 2 つの方法
DROWN の脆弱性をテストするには、次の 2 つの方法があります:
<オール>Python DROWN テスト スクリプトをインストール
テストするサーバーでこれを行う必要はありません。次の python スクリプトを任意のサーバー (開発サーバーなど) にインストールし、この python スクリプトがインストールされているこのサーバーから他のすべてのサーバーをテストできます。
このためには、Python 2.6 以降が必要です。
# python --version Python 2.6.6
また、システムに git をインストールする必要があります:
# git --version git version 1.7.1
drown ディレクトリを作成します。
cd ~ mkdir drown cd drown
git clone を使用して TLSFuzzer を取得します
# git clone https://github.com/tomato42/tlsfuzzer Initialized empty Git repository in /root/drown/tlsfuzzer/.git/ remote: Counting objects: 480, done. remote: Compressing objects: 100% (10/10), done. remote: Total 480 (delta 5), reused 0 (delta 0), pack-reused 470 Receiving objects: 100% (480/480), 1.30 MiB | 327 KiB/s, done. Resolving deltas: 100% (302/302), done.
ssl2 ブランチをチェックアウト
# cd tlsfuzzer # git checkout ssl2 Branch ssl2 set up to track remote branch ssl2 from origin. Switched to a new branch 'ssl2'
この段階で、~/drown/tlsfuzzer ディレクトリの下に次のファイルが表示されます
# ls build-requirements.txt docs LICENSE Makefile README.md requirements.txt scripts setup.py tests tlsfuzzer
次に、SSL および TLS 暗号化プロトコルを実装するオープン ソースの Python ライブラリである tlslite-ng を入手します。
# git clone https://github.com/tomato42/tlslite-ng .tlslite-ng Initialized empty Git repository in /root/drown/tlsfuzzer/.tlslite-ng/.git/ remote: Counting objects: 4821, done. remote: Total 4821 (delta 0), reused 0 (delta 0), pack-reused 4821 Receiving objects: 100% (4821/4821), 1.55 MiB | 137 KiB/s, done. Resolving deltas: 100% (3570/3570), done.
次に、先ほどダウンロードした tlslite への適切なリンクを作成します。
# ln -s .tlslite-ng/tlslite tlslite
sslv2 ブランチをチェックアウトしてください。
# cd .tlslite-ng/ # git checkout sslv2 Branch sslv2 set up to track remote branch sslv2 from origin. Switched to a new branch 'sslv2' # cd ~/drown/tlsfuzzer
ECDSA 暗号化 Python スクリプトを取得します。
# git clone https://github.com/warner/python-ecdsa .python-ecdsa Initialized empty Git repository in /root/drown/tlsfuzzer/.python-ecdsa/.git/ remote: Counting objects: 485, done. remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485 Receiving objects: 100% (485/485), 180.60 KiB, done. Resolving deltas: 100% (289/289), done.
Python ECSDA スクリプトへの適切なリンクを作成します。
# ln -s .python-ecdsa/ecdsa ecdsa
Python スクリプトを使用して DROWN の脆弱性をテスト – 脆弱ではない例
最後に、以下に示すように DROWN python スクリプトを実行します。テストするサーバーに適した IP アドレスを変更します。ここで ip-address の代わりにドメイン名を使用することもできます。
# PYTHONPATH=. python scripts/test-sslv2-force-export-cipher.py -h 192.168.101.2 -p 443 Connect with TLSv1.0 EXP-RC4-MD5 ...OK Connect with SSLv2 EXP-RC4-MD5 ...OK Connect with SSLv3 EXP-RC4-MD5 ...OK Connect with TLSv1.0 EXP-RC2-CBC-MD5 ...OK Connect with SSLv3 EXP-RC2-CBC-MD5 ...OK Connect with SSLv2 EXP-RC2-CBC-MD5 ...OK Test end successful: 6 failed: 0
注:上記の 6 つの OK が表示されます。 「失敗:0」も表示されます。
Python スクリプトを使用して DROWN の脆弱性をテストする – 脆弱性の例
以下は、DROWN 攻撃に対して脆弱なサーバーで実行されます。これは、脆弱な場合に表示されるものです。
# PYTHONPATH=. python scripts/test-sslv2-force-export-cipher.py -h 192.168.101.3 -p 443 Connect with TLSv1.0 EXP-RC4-MD5 ...OK Connect with SSLv2 EXP-RC4-MD5 ... Error encountered while processing node <tlsfuzzer.expect.ExpectSSL2Alert object at 0x2259810> (child: <tlsfuzzer.expect.ExpectClose object at 0x2259890>) with last message being: <tlslite.messages.Message object at 0x2259c50> Error while processing Traceback (most recent call last): File "scripts/test-sslv2-force-export-cipher.py", line 109, in main runner.run() File "/root/drown/tlsfuzzer/tlsfuzzer/runner.py", line 151, in run RecordHeader2))) AssertionError: Unexpected message from peer: Handshake(58) Connect with SSLv3 EXP-RC4-MD5 ...OK Connect with TLSv1.0 EXP-RC2-CBC-MD5 ...OK Connect with SSLv3 EXP-RC2-CBC-MD5 ...OK Connect with SSLv2 EXP-RC2-CBC-MD5 ...OK Test end successful: 5 failed: 1
DROWN 攻撃の問題を修正
上記の DROWN の脆弱なシナリオでは、テスト ケースの 1 つが失敗しました。この問題を修正するには、次の行を Apache の httpd.conf に追加し、Apache を再起動します。
# vi httpd.conf SSLProtocol All -SSLv2 -SSLv3
NginX を実行している場合は、以下に示すように、構成ファイルに SSLv2 がリストされていないことを確認してください。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Apache では、SSLv2 を無効にするには、「-SSLv2」と明示的に指定する必要があります。ただし、NginX では、SSLv2 をリストしないと無効になります。
上記の修正後、python DROWN テスト スクリプトはその特定のサーバーの問題を報告しなくなりました。
Apache と NginX とは別に、メール サーバーに Postfix を実行している場合は、メール サーバーでも SSLv2 を無効にする必要があります。
また、OpenSSL を最新バージョンにアップグレードします。新しいバージョンでは、OpenSSL チームはビルド時にデフォルトで SSLv2 を無効にしました。 OpenSSL チームには次の提案があります。1.0.2 バージョンを 1.0.2g にアップグレードします。 1.0.1 バージョンを 1.0.1s にアップグレードします。
追加の参照:
- 脆弱性メモ VU#583776
- CVE-2016-0800
- 溺死攻撃
- OpenSSL セキュリティ アドバイザリ [2016 年 3 月 1 日]
- DROWN の OpenSSL ユーザー ガイド