piyolog

piyokangoの備忘録です。セキュリティの出来事を中心にまとめています。このサイトはGoogle Analyticsを利用しています。

OpenSSLの脆弱性(CVE-2014-0160)関連の情報をまとめてみた

HeartBleed(CVE-2014-0160)関係のリンク集、自分のメモ用なので不正確です。

HeartBleedの影響対象となるOpenSSLバージョン

以下のバージョンが影響を受けます。但し、システムによっては原因となっているheartbeat機能が無効化されている場合もあるため、バージョンが一致しただけで当該脆弱性の影響を受けるかは確定しません。

(1) OpenSSL 1.0.1系
バージョン名 リリース時期 CVE-2014-0160
OpenSSL 1.0.1 2012/03/14 脆弱性あり
OpenSSL 1.0.1a 2012/04/19 脆弱性あり
OpenSSL 1.0.1b 2012/04/26 脆弱性あり
OpenSSL 1.0.1c 2012/05/10 脆弱性あり
OpenSSL 1.0.1d 2013/02/05 脆弱性あり
OpenSSL 1.0.1e 2013/02/11 脆弱性あり
OpenSSL 1.0.1f 2014/01/06 脆弱性あり
OpenSSL 1.0.1g 2014/04/07 修正済
(2) OpenSSL 1.0.2系
バージョン名 リリース時期 CVE-2014-0160
OpenSSL 1.0.2 beta 1 2014/02/24 脆弱性あり
OpenSSL 1.0.2 beta 2 リリースされていない 修正予定

OpenSSLのリリースやリポジトリを見直してみると「OpenSSL 1.0.2 beta」というリリースはないようです。JPCERT/CC他が公開している情報には影響対象に含まれていますが、当該バージョンが存在するのかは不明です。

(3) 影響を受けないバージョン
  • OpenSSL 0.9.8系
  • OpenSSL 1.0.0系
(4) 1.0.0h→1.0.1でheartbeatが追加

Changes between 1.0.0h and 1.0.1 [14 Mar 2012]
:
*) Add support for TLS/DTLS heartbeats.
[Robin Seggelmann ]
:

http://git.openssl.org/gitweb/?p=openssl.git;a=blob_plain;f=CHANGES;hb=refs/heads/OpenSSL_1_0_1-stable
(5) CVE-2014-0160の修正箇所

HeartBleed(CVE-2014-0160)って何?って人向けの情報

(2) 英語の情報
(4) CVE-2014-0160の原因となったHeartbeat Extension
(7) NSAはHeartBleedを事前に把握していた?

Bloombergが4/12付でNSAが今回のHeartBleedを公になる前から把握していたと報じています。

NSAは当初コメントを拒否していたようですが、その後Statementを発表し、セキュリティ企業からの報告を受けるまで把握していなかったとして、Bloombergの記事を否定しました。

NSATwitterでも投稿しています。

CVE-2014-0160での影響が確認された事例

CVE-2014-0160の影響が確認された事例です。いずれも一例であり、脆弱性を持つすべてのサーバーで以下が発生することが確認されたわけではありません。

(1) FreeBSD9.1が稼働するサーバーで秘密鍵が見えた事例

(2) Yahoo.comで他人のメールアドレスやパスワードが見えた事例

FOXITの検証を見ると秘密鍵も漏れていた模様

(4) nginx 1.5.13で秘密鍵が取得できた事例

Cloudflareが「www.cloudflarechallenge.com」から証明書秘密鍵を取ることが出来るかといったHeartBleedの脆弱性評価コンテストを開催し実際にデータを取ることが出来たと報告が行われました。

  • 「/etc/shadowも抜けた」はデマでした*1

(5) カナダ 歳入庁でデータ侵害の被害が出た事例
(6) イギリス 育児サイト Mumsnetでデータ侵害の被害が出た事例

CVE-2014-0160のScan結果を公開、まとめているところ

CVE-2014-0160を確認した数 確認元 確認日時 ソース
61万5268サイト
(2858万1134サイトで検証)
Robert Graham 不明
Twitter投稿は2014/04/09 8:17 UTC
約50万サイト Netcraft 2014年4月調査
489サイト
Alexa Top10000より
James Vasile 2014/04/09 11:30 UTC?頃
5サイト
Alexa Top100より
musalbas 2014/04/08 11:30 UTC
48サイト
Alexa Top1000より
musalbas 2014/04/08 12:00 UTC
630サイト
Alexa Top10000より
musalbas 2014/04/08 16:00 UTC UTC
3万1312サイト
Alexa Top1millionより
zmap 2014/04/10 14:00 EDT
約5万サイト
Alexa Top1millionより
TrendMicro 2014/04/10 10:18 PDT
150サイト
国内3500図書館サイトより
カーリル 2014/04/09 16:00 JST
1045ノード
約5000のTorExitNode
MUlliNER.ORG 2014/04/11〜13

musalbasさん調査の3つはログイン用ドメインが別に用意されている等、サブドメインまではチェックしてないリストです。

HeartBleed(CVE-2014-0160)で攻撃してもばれないのか

  • アクセスログ、システムログ上からは攻撃トラフィックか判断することが出来ない。
  • 目当ての情報を引き出そうと大量にアクセスを試行すればアノマリートラフィックとして攻撃と疑われる可能性はある。
  • IDS/IPSでHeartBleed対応が行われ始めたので、導入サイトへ対して行えば分かる。

(1) nginxはパッチ後にログが出力されるようになる

nginx, after being patched, logs the following from the PoC exploit:

2014/04/08 12:37:18 [info] 4151#0: *724561 peer closed connection in SSL handshake while SSL handshaking, client: 70.91.145.11, server: 0.0.0.0:8443

https://isc.sans.edu/diary/%2A+Patch+Now%3A+OpenSSL+%22Heartbleed%22+Vulnerability/17921

nginx 1.4.7でエラーログ(/var/log/nginx/error.log)に出力されることをUbuntu13.10で確認しました。但しログレベルをinfoにしなければ出力されません。

(2) iptablesを使った検知方法

デロイトトーマツの岩井さんがiptablesを使った検知(遮断)方法を紹介しています。以下その方法を引用します。

iptables log rules
 iptables -t filter -A INPUT -p tcp --dport 443 -m u32 --u32 "52=0x18030000:0x1803FFFF" -j LOG --log-prefix "BLOCKED: HEARTBEAT"
 
iptables block rules
 iptables -t filter -A INPUT -p tcp --dport 443 -m u32 --u32 "52=0x18030000:0x1803FFFF" -j DROP

http://blog.f-secure.jp/archives/50725604.html

この方法は根本的な対策ではないと岩井さんがコメントしている通り、yasulibさんもこのルールの回避方法を検証しています。

いくつか回避する方法があると思います。例えばTCPヘッダのOptionsヘッダにNOPを入れることでオフセットをずらすなど。
 
他にもSSLには一つのパケットの中に複数のContentを入れることができます。
 
よく見るのはServer Helo, Certificate, Server Key Exchange, Server Hello Doneが1つのパケットにまとまっていることなどです。
 
この仕様を使っても、フィルタを回避できます。

(3) IDS/IPSのHeartBleed対応状況
ベンダ 対応状況 製品名 検知シグネチャ
IBM 2014/04/09対応済 Network Protection XGS
Proventia Network IDS
Proventia Network IPS
Proventia Network MFS
Proventia Server (Linux)
RealSecure Network
RealSecure Server Sensor
Proventia Desktop
Proventia Server IPS (Windows)
TLS_Heartbeat_Short_Request (既定で遮断)
TLS_Heartbeat_Long_Response
McAfee 2014/04/09対応済 McAfee Network Security Platform UDS-SSL: OpenSSL TLS DTLS Heartbeat Extension Packets Information Disclosure
Cisco 2014/04/09対応済 Cisco Intrusion Prevention System OpenSSL Information Disclosure
Juniper Networks 2014/04/09対応済 IDP HIGH SSL:OPENSSL-TLS-DTLS-HEARTBEAT SSL: OpenSSL TLS DTLS Heartbeat Information Disclosure
SecureSoft 2014/04/11対応済 SniperIPS OpenSSL TLS Heartbeat Extension Memory Disclosure.C
OpenSSL TLS Heartbeat Extension Memory Disclosure.B
OpenSSL TLS Heartbeat Extension Memory Disclosure.A
OpenSSL TLS Heartbeat Extension Memory Disclosure
Suricata 対応準備中 Suricata 2.0.1にて対応予定
HP 対応済? TippingPoint IPS 2014/04/08時点で準備中とのツイートあり
Snort(SourceFire) 2014/04/08対応済 Snort Snort Version 2960
Snort Version 2956
Snort Version 2946
TrendMicro 2014/04/08対応済 TrendMicro DeepSecurity DSRU-14-009
1006010 – Restrict OpenSSL TLS/DTLS Heartbeat Request
1006011 – OpenSSL TLS/DTLS Heartbeat Information Disclosure Vulnerability
1006012 – Identified Suspicious OpenSSL TLS/DTLS Heartbeat Request
Paloalto Networks 2014/04/09対応済 PAシリーズ ID 36416にて対応済
Arbor Networks 2014/04/11対応済 Pravail Security Analytics 2018375 ­ ET CURRENT_EVENTS TLS HeartBeat Request (Server Intiated)
2018376 ­ ET CURRENT_EVENTS TLS HeartBeat Request (Client Intiated)
2018377 ­ ET CURRENT_EVENTS Possible OpenSSL HeartBleed Large HeartBeat
Response (Client Init Vuln Server)
2018378 ­ ET CURRENT_EVENTS Possible OpenSSL HeartBleed Large HeartBeat
Response (Server Init Vuln Client)
Symantec 日付不明対応済 Symantec IPS 27517「Attack: OpenSSL Heartbleed CVE-2014-0160 3」

CVE-2014-0160の確認方法

(1) OpenSSLコマンドを使った確認方法
  • opensslコマンドを使ってサーバー内で確認する場合

$openssl version -a

出力結果に影響を受けるバージョンであること、無効化オプション(-DOPENSSL_NO_HEARTBEATS)が指定されていないこと、の2つが確認できた場合、脆弱性が存在する可能性が高いです。

  • opensslコマンドを使ってリモートからheartbeatが有効となっているか確認する場合

$echo | openssl s_client -connect host:port -tlsextdebug

と入力して「TLS server extention "heartbeat"」と出力されるとheartbeat機能が有効となっていることが分かります。ただし、脆弱性が存在するかは分かりません。

(2) オンラインスキャナーでの確認方法

方法といっても基本的にはURLを入れるだけです。インターネットに公開されたWebサーバーや自分自身に対してオンラインスキャナーを使ってCVE-2014-0160の影響を受けるか確認することが可能です。

オンラインスキャナー 提供元 検査対象 言語 CVE-2014-0160のチェック方法 証明書の確認 ログの記録
SSLチェックツール Globalsign 公開Webサーバー 日本語 Qualysのチェックサービスを利用 有り 有り
Heartbleed脆弱性検査 NetAgent 公開Webサーバー 日本語 CVE-2014-0160のExploitを実行して脆弱性の有無を確認している模様 無し 無し
SSL Labs Server Test Qualys 公開Webサーバー 英語 不明 有り 有り
LastPass Heartbleed checker LastPass 公開Webサーバー 英語 Webサーバーの種類からOpenSSLを推測 有り 不明
heartbleed test possiblelv 公開Webサーバー 英語 SSLのパケットからheartbeat機能の利用有無を確認 無し 不明
Heartbleed test Filippo Valsorda 公開Webサーバー 英語 CVE-2014-0160のExploitを実行して脆弱性の有無を確認 無し 有り
Check your certificate installation Symantec 公開Webサーバー 英語 不明 有り 不明
Reverse Heartbleed Tester Meldium 接続クライアント 英語 不明 無し 無し
heartbleedtest McAfee 公開Webサーバー 英語 不明 無し 不明
FREE HeartBleed Tester Crytical Watch 公開Webサーバー 英語 不明 無し 不明
COMODO SSL Analyzer COMODO 公開Webサーバー 英語 不明 無し 不明
rend Micro Heartbleed Detector TrendMicro 公開Webサーバー 英語 不明 無し 不明

脆弱性が存在するサイトをオンラインスキャナーにかけてみると次のように表示されます。


(3) Github/CodePlex上で公開されているCVE-2014-0160の確認ツール

公開されているツールの多くはjspenguinさんのPoCを使用しています。

CVE-2014-0160検証ツール 開発者 検査対象 実装言語 特記事項 piyokango検証
ssltest.py @jspenguin Webサーバー python CSV(番号,ホストのフォーマット)を指定して一括チェック可能 検証済
heartbleed @FiloSottile Webサーバー go   未検証
docker-heartbleed kasimon Webサーバー docter   未検証
hb-test.py takeshixx Webサーバー python2 ssltest.pyがベース 検証済
hb-test.py dyatlov Webサーバー python3 ssltest.pyがベース 未検証
Bleed Out John Leich Webサーバー Windows/C# 既定動作でExploitを実行し続ける。
.NetFramework 4/4.5が必要。
検証済
bleed_heart.bat partp cmd.exe Webサーバー pythonで実装されたExploitをバッチ実行する 未検証
openmagic isgroup-srl サーバー bash HTTPS以外のサービスに対して検証を行う 未検証
ssltest-stls.py Derek Callaway サーバー python SMTPIMAP等の様々なプロトコルに対応させたssltest.py 未検証
pacemaker Lekensteyn 接続クライアント python 自身を検査できる。ssltest.pyがベース 未検証
Hut3 Cardiac Arrest ah8r サーバー python2.7 HeartBleedのPoCに存在する3つのバグを修正したツール 検証済

脆弱性が存在するサイトでhb-test.pyを動かしてみた結果です。脆弱性の存在が確認できるとメモリを表示した後に次のような表示が出ます。

尚、jspenguinさんのPoCには次のバグが存在しHeartBleed脆弱性検出の見落としが発生する可能性が指摘されています。上記のGithubツールだけでなく、NSEやNessusにも影響が及ぶようです。そのため、この指摘をしたhut3チームが公開している「Hut3 Cardiac Arrest」が確認ツールとしては良さげと思います。

バグ1:TLS Version Support
 検知スクリプトでは TLSv1.1が指定されているが、これ以外(TLSv1.0やTLSv1.2)しか
 サポートしていないサーバだと、このH eartbeatリクエストを捨ててしまう。
 リクエストが捨てられてしまった場合、検知スクリプトでは脆弱性なしと判定している。
 
バグ2:TLS Cipher Suite Support
 現在318種類のCipher suite がIANAによって登録されている。
 多くの検知スクリプトでは51種類しか使用していなかった。
 それをサポートしていないサーバは、このリクエストを捨ててしまう。
 リクエストが捨てられてしまった場合、検知スクリプトでは脆弱性なしと判定している。
 クライアントが実際にその318種類に対応している必要はない。脆弱性を引き起こすのは、暗号化が起きる前なので。
 
バグ3:Payload Detection
 レスポンスを受け取るまでに5秒以上かかると、脆弱性なしと判定している。

http://www.pupha.net/archives/1876/

というわけで「Hut3 Cardiac Arrest」を実行した結果です。脆弱性が存在すると次の通り出力されます。

脆弱性が存在しない場合は次の通り出力されます。SSLv3だけでなく、TLSも総じてチェックされます。

(4) 自分が利用しているAndroidが影響を受けるか検証するツール

HeartBleed関連でいくつかアプリが出ています。他のスキャナーと違って、自分自身(AndroidOS、アプリ)にインストールされているOpenSSLがCVE-2014-0160の影響を受けないか確認するためのアプリです。偽チェックツールも出回るかもしれないので利用前には十分な注意が必要です。また影響対象のOpenSSLがインストールされたAndroidのバージョンは4.1.1〜4.4.2_r2ですが、HeartBeat機能が有効となっているのは4.1.1のみのため、4.1.1のみCVE-2014-0160の影響を受けます。*2

開発元 アプリ名 必要な権限
Lookout Mobile Security Heartbleed Detecter インターネットへの接続
BlueBox Heartbleed Scanner 特に無し

2社の関連情報も掲載しておきます

(6) NMAP Script Engineでの確認方法
  • ssl-heartbleed
    • 手元のWindows7環境ではうまく動作しませんでした。Ubuntu13.10(NMAP6.40)で動作確認済。
  • HeartBleedチェック用のNSEをダウンロードする。

$sudo wget https://svn.nmap.org/nmap/scripts/ssl-heartbleed.nse -P /usr/share/nmap/scripts

  • Scriptダウンロード後以下のコマンドを実行するのみ。

$nmap -sV -p SSLポート --script=ssl-heartbleed.nse ターゲットホスト

脆弱性が存在するサイトに対してNSEを実行すると次のように表示されます。脆弱性が存在しなければ何も表示されないようです。

  • tlsがないと言われたらこちらもダウンロードする。

$sudo wget https://svn.nmap.org/nmap/nselib/tls.lua -P /usr/share/nmap/nselib

OpenSSLを利用しているソフトウェア、オンラインサービスの影響範囲

量が増えてメンテナンスが大変になってきてしまったため、別ページとしました。

*1:2014/04/14修正

*2:4.1.1〜4.4.2まですべてが影響対象となる記載となっていたため、2014/04/10に修正しました。