自堕落な技術者の日記

基本は喰ってるか飲んでるかですが、よく趣味でカラオケ・PKI・署名・認証・プログラミング・情報セキュリティをやっています。旅好き。テレビ好きで芸能通

POODLE

SSL Pulseの統計情報でみるSSL/TLSの引越しについて

2014年11月頃から、SSLに関する統計情報を公開しているサイトSSL Pulseのデータから推移情報をブログで公開してきました。隔月で更新するようなことを言ってて、2015年12月から更新が無い状態になっており、「コラ〜〜!サボってんじゃね〜〜」的なことを思われたかたもいらっしゃるかもしれません。すみません。すみません。すみません。

新しいサイト

SSL Pulse Trends(SSL Pulseデータの推移) https://kjur.github.io/www/sslpulsetrend/index_j.htmlというサイトを作りました。今後の毎月の更新はこちらでやっていきます。

サイトを移行した経緯など、、、

前は、エクセルなど駆使してグラフ描いてたんですが、そりゃもう、結構手間がかってたんですよ。自分も興味があって毎月すぐ知りたいんだけど、とても、毎月はできないなと、、、ざっくりとした流れはこんな感じ:

  • 今月のデータファイル(JSON)をwgetでダウンロードする
  • データの推移をTSV形式になるように変換するツールを実行する。グラフに必要なデータ列もこの時作る。
  • TSVファイルをUTF-16にする(Mac Excel対策)
  • Excelで読み込み
  • データを細かい整形(日付フォーマットや表ヘッダなど)
  • 必要なグラフを作る
  • グラフをEMF(拡張メタファイル)でエクスポートする
  • PowerPointに吹き出し等を貼り付け(位置調整)
  • PowerPointの画面を画像キャプチャし、ブログへ
まず、第一の鬼門なんですが、自分は自宅ではMac Book Airを使ってまして、Mac用のExcel(前の2011も今のやつも)は、文字化けしないようにCSVやTSVファイルを読み込むのが骨が折れるんですよ。一応ファイルの入力候補としては普通のUTF-8でも大丈夫そうに見えるんだけど、うまくいかず。結局うまくいったのはメモ帳アプリでUTF-16に変換してから読み込ませるという方法です。Googleとかで"Mac Excel TSV 文字化け"みたいなキーワードで検索すれば、方法が出てくるでしょう。
07

そして、一つ一つグラフを作っていくわけです。
01
で、Excelのグラフの凡例ではちょっと見づらいのでパワポで吹き出しをつけます。
39
どうです?結構面倒くさそうでしょう?

で、新しいサイトでは

とにかくExcelでグラフをつくるのはやめにしたく、JavaScriptベースでグラフを描けないもんかと、調べてみました。最初は、ccchartなんかがデザインも良いかなぁと考えていたんですが、思っていたデザインにするのは、至難の技であると知り、D3.jsという有名なライブラリも見たんですが、一つのフツーのグラフ書くのに多くのコードを書かねばならず断念。D3.jsを簡単に使うためのラッパーがあるそうで、それを幾つか見て、rickshawで何とか許せるグラフが描けたのでそれを使うことにしました。

本当は、SSL Pulseに置いてあるJSON形式のデータファイルをそのまま、表示の度に取り込んで加工してからグラフ表示しようとしたんですが、諸々CORSの壁に阻まれ断念。動的にダウンロードする必要もなくなり、スタティックな解析データをNodeで作って、SOURCEタグで普通にデータ取り込むことになりました。

ブログでたまたまSSL Pulseについて書くだけなら、特別な断りをいれなくてもいいかと思ったんですが、定常的に今後は英語でもページを公開するとなると、SSL Pulseの作者のIvan Ristićさんに仁義というか確認取っといたほうがいいかなと思いました。IvanさんはSSL/TLSの技術解説書の中では最高に良いと思うBulletproof SSL and TLSの著者であり、SSLの設定評価サイトであるssllabsの開発などもしています。

Bulletproof SSL and TLS
Ivan Ristic
Lightning Source Inc
2014-08

最初は、TwitterのDMで連絡取ろうとしたんですが、当然ながら私のフォローして頂いてるわけではないのでDMが送れず、メールアドレスもどこにも記載されていなので、連絡がつきませんでした。そこで、いつもJavaScriptの暗号/PKIライブラリでは情報交換などさせて頂き大変お世話になっているRyan Hurstさんに頼み込み、連絡とってくれないかと伝えました。Ryanさんは「Kenjiを紹介するよ。彼は、すげーJavaScriptの暗号/JWT/X.509ライブラリの作者だ。」と私からのお願い事項のメールを転送してくれました。2日ぐらい待ってて、「う〜〜ん」こりゃレス無しかなぁとも思ってたんですが、返事が来まして「SSL Labsは自由なコンテンツライセンスになってて、君の場合でも全く問題ないとわかると思うよ。同じようなこと(=データ推移情報)をやりたいと思ってたんだけど、時間がなくてね〜〜。」との事でした。よかった、よかった。これで安心して定常的に公開できそうです。

Rickshawの使い方は概ねこんな感じです。

<div id="chart_container"><div id="grade_chart"></div></div> <script> var graph = new Rickshaw.Graph({ element: グラフを描くキャンバスが挿入されるDIVのDOM, width: グラフ幅, height: グラフ高, renderer: グラフ形式(棒グラフとか折れ線グラフとか), series: [{"color": グラフデータ色, "name": データ名(TLS1.2とかSHA256withRSAとかデータ名), "data": [{x: 値, y: 値}, {x: 値, y: 値} ...]}, : (複数のデータがあれば続く) ] }); graph.render(); </script>
同じ形式のグラフ描くのに、同じようなコード書くのも面倒なので、さらにラッパーを作りました。
RickshawUtilGraph(グラフ描くDOM IDの共通ヘッド(グラフや凡例、XY軸など), グラフの共通テンプレート, データ(グラフデータ、データ名) [,オプションでグラフ形式を変えたい場合のパラメータ] [,オプションでグラフ色変えたい場合のパラメータ]);
これでようやく、SSL Pulseの更新があっても、make 一発でグラフデータを作れるので、毎月の更新も負担にならなくなりました。

というわけで、まだ素っ気ないページですが日本語ページ公開にこぎつけました。今までなかった評価グレード(A-F)の分布推移のグラフはNPNのHTTP/2サポートプロトコルの推移のグラフも付け加わっています。
42
しばらくしたら英語ページの作成にとりかかりたいと思います。

今後とも、よろしくお願いします。

関連記事

(続き1)POODLE攻撃について本当にTLSv1.0なら安全なのか?(OpenSSLは安全)

前回はTLSv1.1以降とTLSv1.0とでパディング処理に関するRFC上の規定が違うのでPOODLE攻撃の影響を受ける実装があるのではないか、という話をしました。

影響を受ける可能性が高いのはTLSv1.0と、TLSv1.1やTLSv1.2とで パディング処理の実装を区別しているケースでは影響をうける可能性があります。

OpenSSLの最新のもの1.0.1jについて、ソースを見てました。 結論から言うと、TLSv1.xではPOODLEへの影響が無い事が確認できました。

OpenSSLのソースコードでは、sslディレクトリの下に SSL/TLS関係のコードがまとめられており、大まかに、

  • s3_*.c SSLv3(or TLSv1.x)のコード
  • d1_*.c DTLSv1のコード
  • t1_*.c TLSv1.xのコード
となっています。 CBCモードのパディング処理については、SSLv3、TLSv1.x共に、 ssl/s3_cbc.c に定義があり、以下の関数でパディング部分の削除とパディングのチェック を行っています。
  • ssl3_cbc_remove_padding
  • tls1_cbc_remove_padding
関数ssl3_cbc_remove_paddingでは、 確かにパディングの値をチェックしていないことが確認でき、 関数tls1_cbc_remove_paddingでは、
# to_check:チェックが必要なパディングバイト数 # padding_length:パディング長の値バイト # b:チェック対象の値バイト for (i = 0; i < to_check; i++) { unsigned char mask = constant_time_ge_8(padding_length, i); unsigned char b = rec->data[rec->length-1-i]; /* The final |padding_length+1| bytes should all have the value * |padding_length|. Therefore the XOR should be zero. */ # XORを取ってゼロならばパディング長の値バイトと対象は一致 good &= ~(mask&(padding_length ^ b)); }
のようにTLSv1.0でもTLSv1.1でもTLSv1.2でも 共通で同じパディング値バイト列のチェックを行っているので、 TLSv1.0でPOODLE攻撃の影響が無い事が確認できました。

とりあえずOpenSSLについては、こんな所で。

POODLE攻撃について本当にTLSv1.0なら安全なのか?

POODLE攻撃は、運用泣かせというか、SSLv3のサポートを本当に切っちゃっていいのか、レガシークライアントについて対応するのがいいのか、悩む所ですよね。ShellShock騒ぎさえまだうちでは収束していないのに・・・

POODLE攻撃は、「SSLv3の問題であってTLSv1.0以上では(パディングの方法が違うので)影響が無い」とされていますが、nahiさんからコメントもらって「実装依存だけどTLSv1.0でも危険な実装があるんじゃないの?」ということで、その事を書いてみたいと思います。

今回のPOODLE攻撃については、何が問題でどのようにすれば攻撃できるのかという、詳しい図入りの素晴らしく判りやすい解説をモバゲーさんが 「SSL v3.0の脆弱性「POODLE」ってかわいい名前だけど何?? - Padding Oracle On Downgraded Legacy Encryptionの仕組み -」でされているので、そちらをご覧になると良いと思います。

SSLv3とTLSv1.0以降のブロック暗号のパディングの違い

SSL/TLSでAESや3DESなどのブロック暗号を使った場合には、暗号化するデータはブロックの大きさの整数倍、つまり、AES-256なら32バイト、AES-128なら16バイト、3DESなら24バイトの倍数でないといけません。で、その大きさに揃うようにパディングと呼ばれる隙間の詰め物をして倍数になるように調整するわけです。

例えば、暗号スイートとして、AES-128(16バイト)、SHA1(20バイト)を使っているとして、8バイトのデータを暗号化するとしましょう。パディングした暗号化するための入力は

平文(8)+HmacSHA1メッセージ認証コード(20)+パディング(3)+パディング長(1)=AESブロック長(16)×2
となります。必ずパディング長の1バイトは含まれます。パディングの長さは(ブロック長-1)を超えない値で今回は3となります。

さて、SSLv3とTLSv1.0のパディング方法の違いですが、

  • SSLv3の場合はパディングの値は任意の値を取れる
  • TLSv1.0の場合はパディングはPKCS#5パディング方式を用い、 具体的にはパディング値の各バイトはパディング長と同じ値が設定される。
となっています。先ほどの3バイトのパディングがあるケースでは 下の例のようになります。
パディング(3)+パディング長 [a0][f3][62][03] - SSLv3の場合(先頭3バイトは任意) [03][03][03][03] - TLSv1.0の場合(先頭3バイトはバイト長と同じ値)
今回のPOODLE攻撃では、SSLv3がパディングの値が任意であるために、 効率的に特定の位置の1バイトの平文を復元することができるわけです。 モバゲーさんの解説にある通り、SSLv3の場合は256回のHTTPS要求の試行で 1バイトを解読することができますが、TLSv1.0の場合には256の16乗の 試行が必要なために現実的な時間で復元することはできません。

で、本当にTLSv1.0なら安全なの?

今日の本題のTLSv1.0なら本当に安全なのか、という話なんですが、 とりあえず、TLSv1.1とTLSv1.0のパディングに関する規定を 見てみましょう。

まず、TLSv1.1についてですが、

RFC 4346 TLSv1.1 6.2.3.2 CBC Block Cipherより
padding
Padding that is added to force the length of the plaintext to be an integral multiple of the block cipher's block length. The padding MAY be any length up to 255 bytes, as long as it results in the TLSCiphertext.length being an integral multiple of the block length. Lengths longer than necessary might be desirable to frustrate attacks on a protocol that are based on analysis of the lengths of exchanged messages. Each uint8 in the padding data vector MUST be filled with the padding length value. The receiver MUST check this padding and SHOULD use the bad_record_mac alert to indicate padding errors.
となっています。

一方、TLSv1.0です。

RFC 2246 TLSv1.0 6.2.3.2 CBC Block Cipher より
padding
Padding that is added to force the length of the plaintext to be an integral multiple of the block cipher's block length. The padding may be any length up to 255 bytes long, as long as it results in the TLSCiphertext.length being an integral multiple of the block length. Lengths longer than necessary might be desirable to frustrate attacks on a protocol based on analysis of the lengths of exchanged messages. Each uint8 in the padding data vector must be filled with the padding length value.

TLSv1.0では、「パディングデータはパディング長で埋められなければならない。」 と書いてありますが、 TLSv1.1では、「 パディングデータはパディング長で埋められなければならない(MUST)。 受信者はこのパディングをチェックしなければならず(MUST)、 パディングエラーを示すにはbad_record_macアラートを使う べきである(SHOULD)。」 となっています。 つまり、TLSv1.0ではパディングデータがちゃんとパディング長の値で うめられているかどうかのチェックはmustとは書いてあり、 多くの実装はちゃんとしてくれていると思いますが、 RFC上の必須要件(MUST)ではないので、チェックしない実装があっても おかしくなく、 チェックされない場合、これではSSLv3と同じで、一般的なSSL/TLSの実装では MUSTと書かれていない事は実装する必要もないので (実際、SHOULDと書いてあれば、これに対応しない実装も多い)、 実装によってはパディング値のチェックをしないために、 SSLv3と同じくPOODLE攻撃の影響を受けるTLSv1.0実装がある可能性がある かもしれないという事です。

時間がある時に、ちょっと主要なオープンソースの実装を覗いてみようと思います。

今日はこの辺で。nahiさん、情報ありがとうございました。

追記

様々なサーバーのPOODLE SSLv3脆弱性(CVE-2014-3566)対策のまとめ(更新3)

もくじ

1. はじめに

いや〜、今年は脆弱性対策が当たり年ですね〜〜(トホホ)。 bash ShellShockの対策も継続して観察しているなか、 新しいPOODLEというSSLv3プロトコルに関する脆弱性が出てしまいました。 子犬のプードルだって!可愛くないっつ〜〜の!! SSLv3プロトコルのパディングの問題点を突いて、効率的に暗号文を 復号できしまうので、例えばセッションクッキーを復号して通信を盗聴することが できるのだそうです。 POODLEはPadding Oracle On Downgraded Legacy Encryptionの略だそうで、 パディングオラクルとはパディングを含む暗号文を入力として送りつけると、 そのパティングが正しいかどうかを返してくれるブラックボックスのような 計算機のこと。 SSLv3みたいなできて15年にもなる弱い暗号通信プロトコルに、 強制的にダウングレードさせて、 オラクルに対して何回もいろいろ入力を変えて試行して、 エラーメッセージなどどう反応するかを見る事で、 暗号文の解読が効率良く行えるという攻撃です。

気がついたまでの経緯は当日どんな感じだったかというと、日本時間で10月14日の23:30頃、 The Registerの「NASTY SSL 3.0 vuln to be revealed soon」の記事を見つけていまい、こりゃ、やばげだなと。知り合いに明日ヤバイのがまた来そうと連絡しました。TLS 1.0とSSL 3.0とバージョン番号が違うだけだと言い張る人も多い中、Macとか、パディングとかそのちょっとの違いが仇になるんじゃないかと、ずっと気になってたんですが、とうとう来たかと。詳細情報は夜が明けないとわからないので、半分 wktk しながら寝て待ってたんですが、朝になって、Googleのブログ 「This POODLE bites: exploiting the SSL 3.0 fallback」が出てきたものの、わかったことはプードルという可愛らしい攻撃の名前と、GoogleサイトとChromeはとっくにTLS_FALLBACK_SCSVに対応しているぜ!みたいな。 自慢かっ?技術詳細なく自慢だけなのかっ!と憤りつつ、しばらく待ってると、 やっと安定のImperialVioletで 「POODLE attacks on SSLv3 (14 Oct 2014)」 技術解説が出たのを見て、こりゃマジやべ〜〜な、と・・・ その後、情報のとりまとめにいそしんでおりました。

この記事では、様々なHTTPSサーバーに対するPOODLE脆弱性対策の 方法について、まとめておきたいと思います。

2. SSLv3を無効化できる場合のサーバー対策

古いガラケーや、一部のゲーム機や、古い環境でのAPI利用などを除いて、 一般のブラウザであればSSLv3でしか通信できないという事は無いので、 SSLv3を無効化するというのが、一番正当なPOODLE対策であると思います。 この章では、SSLv3を無効にするために、 サーバーのソフトウェア毎にどのように設定すればよいかをまとめます。

2.1. Apache HTTPD Server + mod_ssl

httpd.confやssl.confに

SSLProtocol All -SSLv2 -SSLv3
と記載しサーバーを再起動 (※Apache 2.4以降はSSLv2は無効)

2.2. Apache HTTPD Server + mod_nss

nss.confもしくはhttpd.confで

NSSProtocol TLSv1.0,TLSv1.1
と記載しサーバーを再起動

2.3. nginx

ssl_protocols TLSv1 TLSv1.1 TLSv1.2
と記載しサーバーを再起動

2.4. lighttpd

lighttpd 1.4.28 以降を使用。それ以前ではSSLv3を無効化できません。

ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
と記載しサーバーを再起動

2.5. Microsoft IIS

コマンドラインで以下を実行することで、レジストリ設定により無効化します。 (参考 [1] [2] [3])

reg add "HKLM\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKLM\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server" /v Enabled /t REG_DWORD /d 0 /f

2.6. Apache Tomcat (Java JSSE)

Tomcatの設定ファイル "server.xml"の"Connector"要素において、 Tomcatのバージョンに依存して、 sslEnabledProtocols属性もしくはprotocols属性に 使用するプロトコルをSSLv3を除いたTLSv1、TLSv1.1、TLSv1.2 を設定することにより、 SSLv3での接続を無効化することができます。 (参考 [4])

Tomcatバージョン設定例
5.0.x、5.5.x、6.0.0〜6.0.37
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" keystoreFile="/etc/tomcat/server.jks" keystorePass="password" sslProtocol="TLS" protocols="TLSv1,TLSv1.1,TLSv1.2"/>
6.0.39〜、7.0.x、8.0.x
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" keystoreFile="/etc/tomcat/server.jks" keystorePass="password" sslProtocol="TLS" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"/>

2.7. Node.js

Tomcat同様これもインターネット直出ししている事はないと思いますが 以下の実装例のようにsecureOptionsでSSLv2,SSLv3を使用しないよう設定が可能です。 (参考 [6])

var constants = require('constants') , https = require('https') , path = require('path') , tls = require('tls') , fs = require('fs'); https.createServer({ secureProtocol: 'SSLv23_method', secureOptions: (constants.SSL_OP_NO_SSLv3 | constants.SSL_OP_NO_SSLv2), cert: fs.readFileSync(path.join(__dirname, 'ssl', 'server.crt')), key: fs.readFileSync(path.join(__dirname, 'ssl', 'server.key')), }, function (req, res) { res.end('works'); }).listen(443);

2.8. (追記)IBM HTTP Server

アドバイザリ が公開されています。httpd.confで以下のように設定し、サーバーを再起動します。

<VirtualHost *:443>
SSLEnable
SSLProtocolDisable SSLv2 SSLv3
その他の設定
</VirtualHost>

2.9. (追記)Amazon Web Services

AWSから セキュリティアドバイザリが公開されており何度もアップデートされています。 利用するサービスによってそれぞれ対策が必要です。

サービス対応策
Linux AMI 2014年10月16日7時にOpenSSL関連の全てのパッケージにPOODLE対応済の ものにアップアップデートしています。ウェブサーバー等の設定は、 それぞれ実施する必要があります。
ELB 2014年10月15日9時以降に生成であればデフォルトSSLv3無効。 それ以前に生成であれば以下を実施します。 ELB Manegement Console>EC2>Load Balancers> Change>Predefined Security Policyの選択を確認> ELBSecurityPolicy-2014-10を選択>Save>個々のリスナで設定を繰り返す
CloudFront Management Console>Distribution Settings> Edit>General Tab>Custom SSL Client Support> >Only Client that Suppot SNI>Yes Edit>SSLv3無効化
TLS_FALLBACK_SCSVオプションについては10月20日の週にサポート予定。
(対応策は2014年10月18日12:00時点でのアドバイザリに基づいています。 時間はいずれも日本時間。RDBについてはPOODLE無関係のようで記載せず。)

2.10. その他のサーバー

その他のサーバーについては、以下を参考にしてみてください。

2.11. SSLv3 を無効化するリスク

現在サポートされているPCやスマートフォンのブラウザではTLSv1.0以降 がサポートされているので問題にならないと思いますが、 例えば、2007年秋以前のdocomoのガラケーやSONY PS3では、SSLv3しかサポート していないことを実機で確認しています。 古いガラケー、ゲーム機、組込み機器に対応するウェブサーバーを 運用する場合には、接続できずクレームになる可能性もありますので、 クライアント側の対応環境を確認すると良いと思います。

また、ウェブサーバーをAPIで利用する場合にも、どのような環境、 言語実装を使うかで問題があるケースがありますので、 確認しておくと良いと思います。TwitterやFacebookも API利用されているためにトラブルになったそうです。

2.12. (追記)OpenLDAP

OpenLDAPについてはslapd.confを以下のように設定します。 (参考 [?])

バージョン 2.4.36以降の場合
TLSProtocolMin 3.1
バージョン 2.4.14〜2.4.35の場合
TLSProtocolMin 769
上記以前のバージョンの場合にはアップデートの必要があります。

3. 諸般の事情で SSLv3 を有効にせざるを得ない場合

一般的なブラウザに関してはSSLv3を無効化する方向で進んでおり、 ウェブサイトでもSSLv3を無効化するのが、正しい対応だと思いますが、 古い環境をサポートしなければならないために、SSLv3を有効に しておかなければならないケースもあると思います。 3章では、SSLv3をサポートしなければならないケースでの、 脆弱性の緩和策について説明したいと思います。

3.1. 暗号スイート設定で対処する方法

POODLE脆弱性はSSLv3とブロック暗号のCBCブロックモードを使用した 場合に影響があるので、暗号スイートとして以下を選択することで 問題を緩和することができます。

  • 認証付暗号化方式(AEAD)であるGCMブロックモードの暗号スイートを使用する
  • ストリーム暗号(RC4,ChaChaなど)を使用する
古いガラケー、ゲーム機、組込み機器、API利用など、SSLv3を 使わなければならないような環境では、GCMモードを使うこともできず 暗号スイートとしてTriple DESかRC4の選択肢がありません。

RC4ストリーム暗号は、現実的な時間内に部分的に解読することが 可能な危殆化した暗号で使用すべきでないとされていますが、 POODLE脆弱性は適用条件や解読にかかる手間が極端に少ないので、 Triple DESをCBCモードで使うよりもRC4の方が、まだ安全であると 言えます。

従って、
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA を含む全ての暗号スイートを無効化
  • その上で、TLS_RSA_WITH_RC4_128_SHA のみを有効化
  • 同時に新しめのクライアントも環境もサポートしたいならGCMの暗号スイートを有効にする
するぐらいしか手がありません。

ただし、マイクロソフト製品では2014年8月のアップデート以降、RC4は無効になっていますので、 Windows系のサーバー機を使用する場合には、Apacheなど他のサーバーを使う必要があるでしょう。

3.2. TLS_FALLBACK_SCSVを使う方法(現時点で極めて限定的)

SSL/TLSで通信を開始した直後はTLSv1.0以上で問題ない接続であったとしても、 ある種の攻撃により脆弱なSSLv3.0以下にダウングレードさせる攻撃があります。

これを、防ぐための新しく提案されている仕組みが TLS_FALLBACK_SCSV オプションを使う方法です。これをサーバーとクライアントの双方が サポートする場合、TLSからSSLv3.0以下に強制ダウングレードさせることは できなくなります。

ただ、これをサポートしている環境は現時点(2014.10.18)では非常に限定的です。

  • クライアント
    • Google Chromeのみ
  • サーバー
    • 最新の2014.10.15リリースのOpenSSL 1.0.1j/1.0.0o/0.9.8zcを利用するApache,Nginx,Lighttpdなどのサーバー
    • Google提供のサービス(2014年2月頃からサポートしていたらしい)
以下のような条件のサーバーを必要としている場合で、 TLS_FALLBACK_SCSVをサポートする環境なら導入を検討しても よいかもしれません。
  • CBCブロック暗号モードをどうしても使う必要があり、
  • TLSで最初接続できた利用者にはSSLv3ダウングレードせず安全に使用して欲しい。
  • SSLv3で接続してきた利用者にはリスクを承知でCBCモードで接続してもらってもよい。
SSLv3を無効化できるか、3.1節の対策が取れるならば、 OpenSSLの今回のアップデートや、TLS_FALLBACK_SCSVの導入はあまり 気にする必要が無いと思います。

4. (追記)対応策(案)の整理

自分なりにケース毎の対応策(案)を整理してみました。よかったら参考にしてください。

ケース対応策(案)
(ケース1) 利用者が古い環境や古い言語のAPIを使っておらず、 SSLv3.0の停止が可能な場合 (対策1)2章に従いサーバーは全てSSLv3無効化する。
(ケース2) 利用者環境の判断がつかない場合や、 TLSとSSLv3.0の双方をサポートしなければならない場合や、 幅広い環境をサポートしなければならない場合 (ケース2-1) 追加の開発/構築/リソースが認められる場合 (対策2-1) レガシー向けのSSLv3専用(RC4)とモダン用(SSLv3無効)にサーバー/コンテンツを分ける。 結局対策は(対策1)(対策3)の別建て併用のようになる。
(ケース2-2) 追加リソースが認められず、ある程度リスク受容しても サーバーば1台で設定を工夫して提供する必要がある場合、 かつ認証暗号(GCM等)が使えるサーバーの場合 (対策2-2) プロトコル設定でSSLv3とTLSv1.xの双方を有効とし、 暗号スイートでCBCブロックモードを全て取りやめ、 暗号スイート設定でGCMとRC4のみを有効にする。 RC4の解読リスクは受容する。
(ケース2-3) SSLv3ダウングレード攻撃のみ対策する (対策2-3) OpenSSL系であればTLS_FALLBACK_SCSVオプションをサポートする最新のOpenSSL(10/15に公開された1.0.1j/v1.0.0o/v0.9.8zcで対応)にアップデートし、必要に応じウェブサーバーもリビルドする。 TLSからSSLv3にダウングレードされる攻撃からのみ利用者を保護し、最初からSSLv3で接続してくる利用者は保護せずリスク受容して頂く。
(ケース2-4) POODLE攻撃は、例えばRC4ストリーム暗号アルゴリズムの危殆化に比べて、 軽微な攻撃と捉える場合や、何も対策が打てない場合 (対策2-4) 対策として何もしない。 サーバー管理側も利用者も双方リスク受容する。 可能なら利用者に対してクライアントの設定でSSLv3を無効にしてもらうように啓蒙する。
(ケース3) レガシーな、 古い環境や古い言語のAPIを使っており、SSLv3.0のみサポートすればよい場合で、かつ サーバーやクライアントが認証暗号を使えない場合 (対策3) SSLv3のみを有効とし、暗号スイートはRC4のものを使う。 RC4の解読リスクは受容する。

表について、少し補足したいと思います。対策としては、SSLv3を無効にするのが基本的な対策となりますが、SSLv3を残しておく必要がある場合に、幾つかのケースに分類してみました。

一番良いのは、やはり(ケース2-1)のようにTLSv1.xのサーバーと、SSLv3のサーバーとを分ける事であるように思います。最近のウェブアプリケーションではHTML5、JavaScript、CSSなどリッチコンテンツが増えて、そうしたモダンなブラウザ向けのサービスと、SSLv3しかサポートしないサービスとを分けることで、互いに安全に利用することができます。

どうしても1台のサーバーでモダンなブラウザのユーザと、SSLv3のみにしか対応しないユーザに 対応する必要がある場合には、(ケース2-2)のように、CBCモードを使うことをあきらめ、モダンなブラウザユーザは TLSv1.xをGCMモードで接続することになり、GCMモードに対応できないユーザは、弱い暗号であるRC4のリスクを 受容して利用してもらうことになります。例えば、以下の順序で暗号スイートを設定するのが良いでしょう。

  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_GCM_SHA
  • TLS_RSA_WITH_AES_256_GCM_SHA
  • TLS_RSA_WITH_RC4_128_SHA

5. おわりに

以上、SSLサーバーでPOODLE脆弱性対応をする方法について、いろいろなサーバー 毎にまとめてみました。参考になればうれしいです。今日は、こんなとこで。

SSLv3のパディングについては、いろいろ勉強したので、近いうちに記事にできるといいなと思っています。

追記・修正

  • 2014.10.19 IBM HTTP Server, AWS, 対応策(案)の整理について追記しました。
  • 2014.10.22 OpenLDAP ついて追記しました。
  • 2014.10.28 Apache Tomcatの設定についてコメント頂きましたので、 実際に調査をし、 記述を修正しました。コメント頂きましたuraさん、takeshiさん、Youngdong.lee さん、ありがとうございました。

最新記事
Categories
Archives
Twitter
記事Google検索

本ブログ内をGoogle検索
Yahoo!アクセス解析
Travel Advisor
記事検索
QRコード
QRコード
  • ライブドアブログ