自堕落な技術者の日記

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

ハッシュ関数

W3C Web Cryptography APIとの果てしなき戦い(第1回)

あけましておめでとうござます。 ウェブ関連技術の標準化を進めているW3Cから W3C Web Cryptography API という勧告候補が 出てまして、このAPIを使えば公開鍵暗号、共通鍵暗号、鍵交換、鍵生成、 暗号化、署名、ハッシュ関数、擬似乱数なんかが使えちゃうのだそう。 Twitterの私のリプライに「ほとんどのブラウザがサポートしてるから (jsrsasignでも) 使いなさいよ」と海外から何名かの方がコメントしてくださるので、 重い腰を上げて勉強してみたんですが、「ムキ〜〜っ!!わけわからん! 標準化って何なの?相互運用性著しく低いしっ。そもそも、 このAPIってJavaScriptを書くプログラマにちっとも優しくないよね!」 と怒り心頭なんですが、 年も明けたことですし、そのあたりのことを愚痴っぽく、 ぼちぼち書いてみたいと思います。

結論から言うと「今すぐ、これを使うとヤケドするので、 実装がこなれてきたり、様々なラッパーやユーティリティが整備される まで使うのは1、2年はお待ちなさい」という事かなと思います。

APIはどれくらい使えるの?

いろいろなウェブブラウザの機能のサポート状況を 公開してくれているサイトにcaniuse.comという サイトがあるのですが、そこで W3C Web Cryptography API の主要なウェブブラウザ毎のサポート状況 が公開されています。


fig1
(出典: Can I Use Web Cryptography)
グレーで囲まれているのが2015年1月時点で現行バージョンのブラウザで、 緑はフルサポート、黄緑は一部サポートを示しているんですが、 IE、Firefox、Chrome、Safari、Operaやスマホなどのほとんどブラウザで APIをサポートしていると言っています。 世界のブラウザシェアでは51.39%、日本では58.17%が APIをサポートしているのだそうです。 この図だけを見たら、問題なく簡単に使えそうな気がしちゃいますよね。

ハッシュ関数の例

それでは早速、ハッシュ関数の例を見ていきましょう。 文字列"aaa"のSHA-1ハッシュ値を計算するとします。 細かい関数は後で紹介していくとして、ハッシュ計算の流れは以下の例の ようになります。

var textBuf = asciitouint8a("aaa"); // ハッシュ対象文字列aaaをUint8Arrayに変換 window.crypto.subtle.digest({name: 'SHA-1'}, textBuf).then( // SHA1ハッシュを計算 function(hashValue) { // 成功した場合に呼び出される関数 console.log("sha1(aaa)=" + abtohex(hashValue)); // 結果ArrayBufferを16進数に }, function(error) { // 失敗した場合に呼び出される関数 console.log("sha1(aaa)エラー: " + error); } ); #文末にasciitouint8a, abtohexのコードはつけておきます。
APIのハッシュ関数、暗号化、鍵生成などの関数は、乱数生成を除いて 全て "window.crypto.subtle" の名前空間に入っており、 ハッシュ関数は "digest" となっています。

ハッシュの入力はHTML5で導入されたバイナリデータを扱うクラスUint8Arrayなど、 ハッシュの結果はArrayBufferクラスで帰ってきます。例では文字列から Uint8Array配列にしたり、ArrayBufferを16進数で表示できるようにユーティリティー関数を 使っています。

APIの殆ど全ての暗号機能は非同期実行APIになっており、 関数やメソッドが実行されても、すぐには結果が帰ってきません。 ウェブブラウザで、ある処理を行っている間、表示が固まったりしないように 非同期実行にしてあるのだそうです。(後日、突っ込みますw)

JavaScriptで非同期実行するには2通りの方法があるらしく、 windows.crypto.subtle.digest関数は非同期実行オブジェクトを返します。

  • Promiseパターンを使う方法(thenを使う。WebCryptでは主流?)
  • イベント(oncomplete,onerror)を使う方法(IE WebCryptで主流?)

Promiseパターンによる非同期実行

Promiseパターン、もしくはDeferredパターンと呼ばるデザインパターンは、 非同期処理は遅延実行を扱うパターンなのだそうです。 上の例ではdigest()関数により、非同期実行のためのPromiseオブジェクトが 生成され、処理が終わった際にどんな関数を実行するか、エラーが起きた際に どんな関数を実行するかをthen()メソッドで定義しておきます。

var promiseObj = new Promise(); promiseObj.then( 処理が終わった時に実行される関数, エラー発生時に実行される関数 );
Promiseパターンでは、非同期処理するオブジェクトをthenでチェーンすることにより、 処理1、処理2・・・のようにシーケンシャルに実行させることも可能です。
var promiseObj1 = new Promise(); promiseObj1 .then( function(result) { // 処理1が成功したら実行される関数 ... return new Promise(); // 新しい処理2の非同期処理オブジェクト } function(err) {...} ).then( function(result) { // 処理2が成功したら実行される関数 ... return new Promise(); // 新しい処理3の非同期処理オブジェクト } function(err) {...} ).then( // 処理3 );
Promiseパターンの方が、後述のイベントによる非同期実行よりも、 thenチェーンなど使えて綺麗に書けるので Web Crypto APIでは、 こちらの方が主流の使い方となるのだと思います。 Promiseパターンについて詳しく知りたい場合には、以下を参考に されると良いと思います。

イベントによる非同期実行

IEのWeb Crypto APIのサンプルでは、digest()で非同期実行オブジェクトを 生成するところまでは一緒ですが、これに処理が完了した場合に実行される 関数を参照するイベントプロパティ oncomplete と、エラーが発生した際に 実行される関数を参照するイベントプロパティ onerror を定義することにより ハッシュ計算を非同期実行しています。

var data = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); var digestValue; var crypto = window.msCrypto; if (crypto.subtle) { var op = crypto.subtle.digest({ name: "SHA-256" }, data); op.onerror = function (evt) { console.log("op.onerror event handler fired."); } op.oncomplete = function (evt) { digestValue = evt.target.result; console.log("op.oncomplete event handler fired, digest computation complete."); }; } else { console.log("Unable to create window.crypto object."); } (出典:MSDN: Web Cryptography: digest method)
IE 11+のW3C Web Cryptography APIでは、Promiseパターンではなく、 イベントによる方法しかサポートされていないのだと思います。

Web Crypto APIの困った所1:非同期実行

ここから、なんだか愚痴や文句っぽくなってきますorz W3C Web Cryptography APIの困ったなぁと思うのは、 (処理が大して重くないのに)非同期実行しかサポートされていないところです。 非同期実行は、それを使い始めてしまうと以降の全ての処理を非同期実行 しなければならず、途中の一部だけを非同期実行することができません。
fig2

非同期実行は鍵生成して、鍵を保管して、署名するといった一連の処理を まとめて非同期実行させて、表示が固まらないようにしたいのであり、 個々の暗号プリミティブレベルで非同期実行したいわけではないと思います。 暗号プリミティブを非同期実行するかはプログラマに任せてほしく、 暗号プリミティブは同期実行の方がよかったのではないかと思います。

IEと他のブラウザとで非同期実行の記述に一貫性が無いのも面倒だと思います。

Web Crypto APIの困った所2:名前空間が統一されてない

Can I useサイトやMSDNの例を見て「あれ?」と思った人もいると 思いますが、Web Crypto APIの名前空間って実装によって統一されている というわけではないんです。

  • window.crypto.subtle - Firefox、Chromeなど
  • window.msCrypt.subtle - IE11+
  • window.crypto.webkitSubtle - Safari, iOS Safari
実装の中身がブラウザによっていろいろ違うので、 名前で分かれていてもいいのかなとも思いますが、 そもそもW3Cで「標準化」してるんですよねぇ?と。 酷い話だなぁと思います。

Web Crypto APIの困った所3:ArrayBufferによるインタフェース

ハッシュや署名の入力はUint8ArrayといったArrayBufferViewのサブクラスでなければ いけなかったり、出力はArrayBufferになっていたりと、 文末のasciitouint8aやabtohexなど見てもらえれば判る通り、 処理するのが結構面倒くさいです。 ファイルなど大きなサイズのデータを扱う際にはわかりますが、 ハッシュの結果となるハッシュ値なんか大した大きさでないのに ArrayBufferで戻されます。

Web Crypto APIの困った所4:多態性のなさ

ハッシュ関数の入力に関して、文字列でも、整数は配列でも、Uint8Arrayでも 「ひとつよしなに」ハッシュを計算してくれてもよさそうなもんですが、 そうした 多態性(polymorphism)は無くて、 入力はUint8ArrayのようなArrayBufferViewでなければなりません。 多態性はJavaScriptの大きなメリットの一つだと思うんですが、 W3C Web Cryptography APIを使っていると、JavaScriptから Cで関数を呼び出ししているような気分になります。 (入力の融通のきかなさは次回他にも紹介します。)

Web Crypto APIの困った所5:ドキュメントやサンプルの少なさ

解説記事やサンプルを紹介しているサイトもあるのですが、そもそも、例が少ないですし、 それが希望のブラウザで動作するかわからず、コードの相互運用性に本当に苦労させられます。 また、ブラウザがどの機能をちゃんとサポートしているのか、よくわからず、公開ドキュメントも ないので、それが自分のコードのバグなのか仕様なのかよくわからない事も問題です。

おわりに

というわけで、今回は導入として、W3C Web Cryptography APIの雰囲気とハッシュ関数の例に ついて見てみました。 不勉強なため、認識違いをしている所もあると思いますが、その際にはコメント等でご指摘いただければ と思います。 次回以降、鍵生成、署名、共通鍵暗号等を紹介したり、 勉強になるサイトを紹介していこうと思います。 ではでは。

関連記事

(おまけ)例で使ったabtohex、asciitouint8aの定義

// ASCII文字列をUint8Arrayの配列に変換 function asciitouint8a(s) { var buf = new Uint8Array(s.length); for (var i = 0; i < s.length; i++) { buf[i] = s.charCodeAt(i); } return buf; } // ArrayBufferから16進数文字列に変換 function abtohex(arrayBuffer) { var s = ""; var dataView = new DataView(arrayBuffer); for (var i = 0; i < arrayBuffer.byteLength; i++) { var hex = dataView.getUint8(i).toString(16); hex = "00".substr(0, 2 - hex.length) + hex; s += hex; } return s; }

(小ネタ)Bitcoin勉強会の資料を公開しましたよ

会社からの許可が下りたので(^^; 2014年6月に日本ネットワークセキュリティ協会(JNSA) PKI相互運用WG・電子署名WGの共催で行われた「Bitcoin勉強会(技術編)」の資料を公開させて頂きました。

これまでにも、いろいろBitcoinを解説した資料はあったんですが、自分は電子署名屋なもんで、どんなデータにどうやって署名するのか、署名検証するのか、ハッシュ計算するのか、もやもやした感じですっきりしなかったので、実際にプログラム書いてデータ覗いたり署名やハッシュが正しいか確認したりしながら、時間をかけてじっくりいろいろ調査した結果を資料にまとめました。

例えば、blockexplorer.comのトランザクションの詳細情報なんかにしても、詳細表示といいながらこんなふうにJSONで表示されちゃうと、JSONの連想配列は順序関係がないので署名対象がどうなってるのか、理解が止まっちゃうんですよね。そのあたりが、この資料ではすっきりできるのかなと思ってます。よかったら参考にしてください。

私は、暗号の専門家ではなくて、暗号アプリケーション屋だと思っているですが、楕円曲線公開鍵暗号についても今まで理解が十分でなかったものを、これを期にかなり勉強しまして、公開鍵からECDSA署名まで「数学者」ではなく「技術屋」さんのイメージが湧くようにたった「7枚」のスライドで「なんとなく」理解できるようなものができたかなと思います。(専門家の方に言わせると「だめじゃん」みたいな話になっちゃうかもしれないですけど。)

サッカー、同点になりましたね。後半期待できそうです。今日はこんなところで。

MD5サブCA偽造問題の解決って本当?

カンファレンスでMD5ハッシュ衝突を用いたサブCAの偽造が発表されて、わずか数時間でRapidSSLサービスを提供している米VeriSign社はすぐにMD5withRSAのSSLサーバー証明書を発行することを止やめる対応をとりました。この米VeriSignの迅速な対応は私もすばらしいと思います。

日本ベリサインやグローバルサインでもMD5問題の報告をしています。

  • 日本ベリサインのグローバル・サーバーIDでは現在、証明書発行を停止しており1月15日よりSHA1withRSAに切り替えて再開する。

  • 既存のMD5withRSAのSSLサーバー証明書のオーナーには影響が無い。



と書いてあります、

米VeriSignのTom氏のブログは1月2日に読んだんですが、

米VeriSign Tim Callan氏のブログ(2008.12.30)より
Q: How many certificates are affected?
A: Zero. No end entity certificates are affected by this attack. The attack, when it worked, was a potential method for a criminal to create a new, false certificate from scratch. Existing certificates are not targets for this attack.


日本ベリサインの重要お知らせ(2009年1月6日)より
※尚、この攻撃は、既に発行されたサーバIDを利用した通信の「改ざん」「盗聴」などを可能にするものではありません。お客様のWebサイトにて現在ご利用いただいているグローバル・サーバIDおよびその他全てのサーバIDについて新たなリスクを生じさせるものではございません。


この「既存のMD5withRSAのSSLサーバー証明書のオーナーには影響が無い」ということですが、個人的には果たして本当にそうなのかと考えています。

新規に発行されるSSLサーバー証明書(の署名)はSHA1withRSAになったため偽サブCAは作れなくなりましたが、既存のRapidSSLなどMD5withRSAのSSLサーバー証明書(と私有鍵)のオーナーは、Sotirov氏らの研究成果があればいつでも、現時点で有効な偽サブCAを作れると思います。

研究では新規SSL証明書から偽サブCAを作ろうとしたために、シリアル番号の予見とか衝突計算時間が1日ぐらいといった制約があったわけですが、既存のMD5withRSA証明書と秘密鍵さえあれば多少ゆっくり数ヶ月とか時間がかかったとしても信頼されてしまう偽サブCA証明書は作れるのではと思います。この際、RapidSSLのSSLサーバー証明書の私有鍵がRSA 2048ビット以上であることが必要になると思うんですが(後日解説)そんなRapidSSLのMD5withRSA SSLサーバー証明書と鍵を持ち、研究成果さえ適用できれば可能なのかなと思います。失効していようが、期限切れだろうがかまわないわけです。期限切れになったSSLサーバー証明書と秘密鍵の組が不正利用のための価値を持つデータということになります。

すると、まさかSotirov氏らの研究グループはしないでしょうけど、彼らが安全だと判断して方法を公開してしまった後、公表された手法を用いて数ヶ月後からでもゆっくりと偽サブCAをつくりはじめればよいいことになります。

シリアル番号も、発行されたSSL証明書と、それから作った偽サブCA証明書では、あまり関係が無いように作れるようなので、今後出てくるかもしれない今後何年とかルートが有効である間は有効なこの偽サブCAは失効させることはできません。(いたちごっこです)。ちなみに Equifax Secure Global eBusiness CA-1 のCRLには今回のデモで作った偽サブCAのシリアル番号(0x41)は(まぁ期限切れなのですが)CRLに入っていません。(2009.01.07時点)

既に発行してしまったMD5withRSAのSSLサーバー証明書にも、今後のSHA1withRSAの証明書にも影響無いとしていますが、そうではありません。RapidSSLのサービスを利用しているかどうかに関わらず、どこのSSLサーバー証明書を使っていたとしても等しくSSL中間者攻撃の被害の可能性があるということです。

私はこの問題を解決するには、やはり、

・Windows UpdateやFireFox Updateなどで、信頼するルート証明書ストアからMD5withRSAのルートCA、少なくともEquifaxのルートは削除する)
・ルートCA・サブCAとウェブブラウザが基本拡張(BasicConstraints)のpathLen制約をサポートする
・ブラウザの設定でMD5withRSA証明書をはじくようにする(FireFoxプラグインができないでしょうか?)

しか無いのかな、、、と考えています。

勉強不足で思い違いをしているようでしたら、ご指摘いただけると有り難いです。

参考リンク:


米VeriSign Tim Callan氏のブログ:This morning's MD5 attack - resolved (2008.12.30)
Alexander Sotirov氏のブログ:Verisign and responsible disclosure (2009.01.06)
セキュリティmemo:追記 MD5 considered harmful today: Creating a rogue CA certificate (2009.01.07)
日本ベリサイン:MD5アルゴリズムへの衝突攻撃によるSSLサーバ証明書の偽造に関する報道について(2009.01.06)
GMOグローバルサイン:MD5アルゴリズムへの衝突攻撃によるSSLサーバ証明書の偽造に関する報道について(2009.01.06)

続々:MD5の商用ルートCAの終焉

自堕落な技術者の日記 : 続:MD5の商用ルートCAの終焉 - livedoor Blog(ブログ)


う〜〜む、続々荒野の七人みたいなタイトルになってきましたね、、、( ´∀`)

今回のMD5ニセサブCA問題について幾つか補足しておきます。

EV SSL証明書とMD5ニセサブCA問題



今回の問題のEV SSLサーバー証明書への影響についてCA Browser Forum議長
EntrustのTim MosesはIETFの関連MLに2009年1月1日以下のようにポストしています。

・EV SSLサーバー証明書を発行するCAでMD5を使って証明書に署名するCAは無い
・EV証明書は自動的な手続きにより発行されることは無い

EVのガイドラインではMD5は使えないようになっているので、これは皆さん遵守しているということでよかったです。また、今回のMD5ニセサブCA問題は、自動化された発行プロセスにより1日後のシリアル番号が予見できることに依存しているので、自動発行でないEVはこの問題の影響を受けにくいということになるかと思います。

今回の問題に関する各社の対応



幾つかの認証サービスのサイトを見ていますが、今回の問題について問題や対応の公表をしているところはまだ無いようです。RapidSSLなんかは早めにアナウンスする責任があると思うんですが、、、、

MD5のルートCAだとダメなのか



今回のニセサブCAは、衝突計算に要する時間(1〜2日)後の証明書シリアル番号が自動化された証明書発行プロセス予見されることが必要となるので、全てのMD5をルートCAに影響あるわけではないようです。

また、CA証明書がMD5withRSAであるかどうかは直接は問題なく、MD5withRSAの証明書を発行しているところが問題となるわけですが、ルートCA自己署名証明書がMD5withRSAなら発行する全ての証明書もまたMD5withRSAである場合が多いので「問題の影響有り」ということになるかと思います。

とりあえず、こんなところで、、、、

続:MD5の商用ルートCAの終焉

自堕落な技術者の日記 : MD5の商用ルートCAの終焉 - livedoor Blog(ブログ)
MD5 considered harmful today


前に書いたブログの続編です、、、、

今回はプレゼン資料やサイトの詳細情報などから、今回の問題を解説してみたいと思います。

2008年12月30日にドイツのベルリンで開催された25th Chaos Communication Congress(25C3)というカンファレンスでAlexander Sotirovらの研究グループが2007年に公表されたハッシュアルゴリズムMD5の脆弱性の攻撃方法を利用して商用のMD5withRSAのSSLサーバー証明書を発行しているサービス(RapidSSL、RSA Data Security、VeriSignなど)を利用して任意のHTTPSのサイトを中間者攻撃できることを実証したようです。

問題の詳細は以下のサイトで説明されています。
MD5 considered harmful today
http://www.win.tue.nl/hashclash/rogue-ca/

ニセサブCA作成手順



実証例として紹介されているのはRapidSSLから発行されたSSLサーバ証明書をから信頼されるニセサブCAを作ってしまいほぼ全てのブラウザではデフォルトで信頼されてしまうニセのSSLサーバー証明書をいくらでも発行できるサブCAを作ってしまっています


EquifaxルートCAは、現在GlobalSignなどにも一部移管されているようですが、デモで用いたのはRapidSSLのEquifax Secure eBusiness CA-1というルートCAを利用しています。RapidSSLのサービスは2005年3月まではFreeSSLというサービス名でした。(参考)。RapidSSLはGeoTrust Inc.の低価格ブランドのSSL証明書サービスでしたが、2006年5月にGeoTrust Inc.がVeriSign Inc.に買収されています。

さて、手順はこんな感じ、、、、

(1) RapidSSLのサービスは
  Equifax Secure eBusiness CA-1 (RootCA) → 利用者SSLサーバー証明書
  の直接信頼モデルになっています。
  発行するSSL証明書はMD5withRSAで署名されており、
  シリアル番号は連続番号になっており予測可能です。
(2) まず、SSLサーバー証明書をフツーに発行してもらい現状のシリアル番号を確認します。
(3) MD5ハッシュ衝突の脆弱性を突いて必要なSSLサーバー証明書(=ニセサブCA)の
  tbsCertificateの部分(証明書の署名アルゴリズムと署名値を除く
  部分)と実際に送信する証明書発行要求を計算します。要件は以下の通り。
  【ニセサブCA側】
  ・シリアル番号は予想値を使う(計算に1日かかるならシリアルは何番?)
   計算に要する時間(1〜2日)との兼ね合いになる。
  ・識別名は本物のサブCAっぽいと良い
  ・元はSSLサーバー証明書(エンドエンティティ証明書)だが
   ニセサブCAが欲しいのでbasicConstraint拡張はcA=TRUE
  ・CRLDP、AIAなど失効情報を提供する拡張はあえて入れない
   ことで、多くのブラウザは失効検証しないので
   ニセサブCAは失効をチェックされることは無くなり長く使える。
  ・ハッシュ値の調整(衝突ビット)にはNetscapeComment拡張など検証処理には
   使われないものを使う。2007年に公表されたMD5のchosen-prefix collision
   (指定された先頭値による衝突)攻撃を使いハッシュ値が一致するように
   計算する。
(4) 生成したtbsCertificateと対になる実際に送る用の証明書発行要求(CSR)を
  約1日後そのシリアル番号のものが出そうな時刻に連続して、
  目的のシリアル番号の証明書が発行されるまで発行要求を続ける。
(5) 発行された目的のシリアル番号のエンドエンティティ用の
  フツーのSSLサーバー証明書から証明書から署名値部分を切り出して
  (3)で作っておいたニセサブCA用のtbsCertificate部分と組み合わせて
  ニセサブCA証明書を作る。(4)の時に生成された対応する秘密鍵と
  組み合わせてニセサブCA作成は完了。これで何枚でも既存のどんな
  ホストであろうが信頼されてしまうニセサーバー証明書は発行できる。

この(3)の別原像を探す計算に要する時間は、以下の環境でおよそ1〜2日だそうです。
(a) プレステ3が200台構成のクラスタ
(b) デスクトップPCが8000 CPUコアのクラスタ
(c) Amazon Elastic Compute Cloud (EC2) 20,000米ドル分

デスクトップよりもプレステ3がこんなにもスゴイって事にびっくりしました。デュアルコアのデスクトップ4000台を個人で準備するのは無理ですが、プレステ3なら知り合いをかき集めれば200台集められるなんて人もいるんじゃないでしょうか。

EC2の環境は最初の準備が大変だそうですが、実機で数百〜数千台準備するよりもお手軽ですし値段も大したこと無いですよね。ニセサブCAさえ作れれば何枚でもSSLサーバー証明書を出せるのでたった200万円は安いかも。別の最適化を使えば20万円でもいけそうだということです。RapidSSLには無償再発行の分もあったりするので、目的のニセサブCAを得るためにRapidSSLに払ったのは7万円弱なんだそうです。

デモサイト



カンファレンスではデモ用無線LAN環境を提供して、そこから全てのHTTPSサイトに接続してもすべて中間者攻撃され通信は盗聴されているというデモを行った模様です。

Alexander Sotirovのサイト(http://www.phreedom.org/research/rogue-ca/)では、Rapid SSLから発行されるはずのSSLサーバー証明書を全てのブラウザが信頼してしまうニセサブ証明書にしてしまい、そこからニセのSSLサーバー証明書を発行しています。

デモサイトのURLはこれです。
https://i.broke.the.internet.and.all.i.got.was.this.t-shirt.phreedom.org/
この鍵が本当の不正に使えないようにあえてニセサブCA証明書やニセSSLサーバー証明書を2004年7月31日〜9月1日の有効期限に設定しているそうです。例えばPCの時計を2004年8月15日に設定して接続してみますと

MD5-OK



のようにブラウザは信頼してしまう正しい証明書をニセのサブCA(MD5 Collisions Inc.)が発行しています。

MD5-EXPIRE



現在時刻でやったら期限切れですと出ます。

IEやFirefox、ケータイなどほとんど全てのブラウザで信頼されてしまうニセのサブCAが作れてしまったので、信頼される不正なSSLサーバー証明書をどんなホスト名に対しても発行できてしまいます。

攻撃方法の詳細の公開について



この問題の対象となっている認証サービス(やブラウザ?)が対策を講じるまでは、この攻撃方法の詳細は論文公表しないそうで、数ヶ月の猶予はあると述べています。既に認証サービスと研究グループは調整を行っているそうです。

実際の盗聴などの中間者攻撃のために



以上の方法で信頼されてしまう不正なサブCAとSSLサーバー証明書を入手できますが、これを盗聴などの中間者攻撃に用いるには、DNSスプーフィングなどホスト名とIPを騙す必要があります。安全でない無線LANアクセスポイントやルーターなどもリスクとなります。

紹介された対応策について



カンファレンスのスライドでは主要な対応策として
・シリアル番号を乱数にし予測不能にする
・証明書発行要求の処理時間をランダムな長さとする
・ローカルOCSPをたて、不正サブCAのブラックリストを見るようにする
などが紹介されいていました。

せきゅめもさんとこでは「MD5」を使ったら弾くようなことを書いてありましたが、これは私も賛成です。ブラウザの設定でTLVv1、SSLv3など選択できるようなものがありますが、同様にMD5を使わない、将来的にはSHA1を使わない、警告を出すなどの設定があると良いかなと思います。

あと、今回の不正サブCAを作る方法では証明書チェーンの段数が一段増えることになるので、ルートCAのpathLenConstraintにより最大の段数の制限することとし、ブラウザの検証もこれをチェックするようになると良いかなと思います。

う〜〜ん、眠い、、、、今日はこの辺で、、、、、、

参考:
セキュリティホールmemo: MD5 considered harmful today: Creating a rogue CA certificate(win.tue.nl, 2008.12.30)
TechCrunch:MD5コリジョンでインチキ認証局は作れる(ネットにとっては悪い報せ)



MD5の商用ルートCAの終焉

MD5 considered harmful today

昨日、2008年12月30日、MD5の脆弱性をついてMD5ベースの商用ルートCAを使って信頼されてしまうニセCAを作れちゃったというものらしいです。NIST SHA3コンペのMLやIETFのS/MIME、PKIXのMLに以下のメールが流されました。

Russ Housleyのメール
From: Russ Housley
Subject:Further MD5 breaks: Creating a rogue CA certificate
Date: 2008.12.31 01:05

http://www.win.tue.nl/hashclash/rogue-ca/

MD5 considered harmful today
Creating a rogue CA certificate

December 30, 2008

Alexander Sotirov, Marc Stevens,
Jacob Appelbaum, Arjen Lenstra, David Molnar, Dag Arne Osvik, Benne de Weger

We have identified a vulnerability in the Internet Public Key
Infrastructure (PKI) used to issue digital certificates for secure
websites. As a proof of concept we executed a practical attack
scenario and successfully created a rogue Certification Authority
(CA) certificate trusted by all common web browsers. This certificate
allows us to impersonate any website on the Internet, including
banking and e-commerce sites secured using the HTTPS protocol.

Our attack takes advantage of a weakness in the MD5 cryptographic
hash function that allows the construction of different messages with
the same MD5 hash. This is known as an MD5 "collision". Previous work
on MD5 collisions between 2004 and 2007 showed that the use of this
hash function in digital signatures can lead to theoretical attack
scenarios. Our current work proves that at least one attack scenario
can be exploited in practice, thus exposing the security
infrastructure of the web to realistic threats.


年末にちょっとビックニュースですね。とうとう、こんな時が来ましたか、、、
これから、サイトや論文読んでみます。

以下の商用CAがMD5のルート証明書を出しているようです。

- RapidSSL
- FreeSSL
- RSA Data Security
- Thawte
- VeriSign

<追記>
よく読んでみるとルートがMD5であることでなく、MD5(withRSA)で署名された証明書を発行しているCAが問題なんですね。まとめは、別途書きます。


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

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