電子証明書の業界標準を定めるCAブラウザーフォーラムの要求『Baseline Requirements※1』では、電子証明書のシリアル番号に対し、「暗号学的擬似乱数生成アルゴリズムを使って最低限64ビットとしなければならない」と定めています。
昨今、この要求事項に違反した証明書が大量に出回っているとの報告が上がり、話題になっています。
※1 正式には「Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates」というタイトルのCAブラウザーフォーラム(CA/Browser Forum)が発行するドキュメント。以下より取得できる。
https://cabforum.org/baseline-requirements-documents/
電子証明書のシリアル番号とは
認証局は、自らが発行する電子証明書に対してシリアル番号と呼ばれるIDをつけています。
そもそもシリアル番号は、電子証明書をユニークに識別するために定義されたものなのですが、ハッシュアルゴリズムの衝突が報告されたことをきっかけに、このシリアル番号にランダム性を持たせることによって電子証明書の偽造を回避することが要求されるようになりました。
この証明書の例では、シリアル番号は16進表記で24文字分、96ビットとなっているが、処理系によってはランダム性は95ビットとなる。符号情報分を差し引いてもBaseline Requirementsの求める64ビット以上のランダム性要件は満たしている。
CAブラウザーフォーラムは、「Baseline Requirements」において、電子証明書のシリアル番号に対し、「暗号学的擬似乱数生成アルゴリズムを使って最低限64ビットとしなければならない」と定めています。しかしながら、一見すると64ビットとなっていても、シリアル番号を整数として扱う処理系では、最上位ビットは0と固定になるため、実質63ビットしかない、といった状況が生じます。
今回、このような処理系を使って電子証明書を発行した結果、見かけ上64ビットのシリアル番号の証明書であっても、63ビットのランダム性※2しかない、といった証明書が大量発行されていることが発見されました。
※2 ここでは、ランダム性と書いてあるが、情報理論分野では、ランダム性を「エントロピー」という指標で表し、例えば、64ビットの真正乱数のエントロピーは64ビットとなる。
全てはハッシュアルゴリズムの衝突からはじまった
2004年8月、中国の研究チームがその当時まだ使われていたハッシュアルゴリズムであるMD5 (Message Digest Algorithm 5)のハッシュ値の衝突を発表しました。それまで、MD5のハッシュアルゴリズムの衝突については理論的に議論されていましたが、彼らの発表では「衝突値そのものを示す」という衝撃的なものでした。
また、その研究発表の中で、MD5と同様に最もよく使われていたハッシュアルゴリズムであるSHA-1についても数年後にハッシュ値の衝突が可能となることも示されました(この後、Googleにより、SHA-1のハッシュ値の衝突値も発表されることになります)。
2008年12月に実際にドイツで開催された「第25回カオス コミュニケーション会議(CCC)」において、MD5アルゴリズムへの衝突攻撃を利用し、SSLサーバ証明書の「偽造」に成功した旨の発表が行われました。
電子証明書は、その記載内容のハッシュ値を計算し、ハッシュ値に対してCAが電子署名を計算することによって発行されるため、ハッシュアルゴリズムの衝突は偽造証明書の存在が可能であることを意味します。
そもそも、電子証明書のシリアル番号は、電子証明書を一意に識別するために定義されたものであり、一昔前は通し番号として発行された証明書も多くありました。 このSSLサーバ証明書の「偽造」では、通し番号として採番されたシリアル番号を予測することによってハッシュ値の衝突した電子証明書を作り出すことに成功しています。
シリアル番号の予測が必要なわけ
CAに電子証明書の発行を依頼する場合、任意の記載内容の電子証明書の発行を依頼できるわけではありません。バージョン、シリアル番号、署名アルゴリズム、発行者、有効期間の開始、有効期間の終了など、ほとんどのフィールドの内容はCAによって決められてしまいます。このため、衝突値計算のための入力として利用できる電子証明書のフィールドは限られています。
実際に、ハッシュアルゴリズムの衝突を使って電子証明書の偽造を行うには、ハッシュ値の衝突する正当な電子証明書をCAに発行させる必要があります。シリアル番号の予測がなぜ必要なのかは、その攻撃手法の中で示されています。
攻撃のフロー
1.衝突値計算の準備
攻撃に先立って、攻撃者は1枚のSSL証明書を発行します。そこから固定フィールドを特定し、シリアル番号、有効期間の開始、有効期間の終了から、ターゲットとなる電子証明書の記載内容(衝突値計算時に固定する部分)を決めます。 この際、衝突値計算に要する時間を考慮し、その時間経過後に発行されうる電子証明書のシリアル番号、有効期間の開始、有効期間の終了を予測し、決めておく必要があります。 一方、偽造する電子証明書※3の記載内容については、固定フィールドを除いて電子証明書として成立する範囲で決めることができます。
※3 実際には、SSL証明書を直接偽造したのではなく、SSL証明書を発行したCAの下位となるCA証明書を偽造し、その偽造したCA証明書を持ったCAから任意のSSL証明書を発行する、という攻撃を行った。
2.衝突値の計算
偽造証明書の記載内容を決めた後、衝突値計算に利用できるフィールド(ターゲットとなる電子証明書、偽造証明書のそれぞれについて)に攻撃データのパターンを入力し、衝突値を計算します。
3.電子証明書の発行リクエスト
衝突値が計算できたら、ターゲットとなる電子証明書の発行を実際にCAにリクエストします。ターゲットとなる電子証明書の記載内容と同じ電子証明書(予測していたシリアル番号、有効期間の開始、有効期間の終了の電子証明書)が実際に発行されたら攻撃成立となります。
4.偽造証明書の作成
発行された電子証明書の電子署名をコピーし、偽造用に用意した電子証明書の電子署名部分に挿入すれば、偽造電子証明書の完成です。
実際の攻撃に使われたCAでは、電子証明書のシリアル番号はシーケンス番号となっていたため、また、有効期間の開始、有効期間の終了も電子証明書の発行をリクエストした時刻から一定秒経過後であったため予測は容易でした。
攻撃者は、それほど多くない証明書発行リクエストを送ることによって、CAに対しターゲットの電子証明書を発行させることに成功したのです。
CAでは発行される電子証明書のシリアル番号のランダム性を高くすると、攻撃に要する試行回数が増え(64ビットの真正乱数であれば平均試行回数は2の63乗)、証明書の偽造が困難になります。このため、シリアル番号にランダム性を持たせる、といったことが行われるようになったわけです。
実害はあるのか?
現在発行されている多くの電子証明書のハッシュアルゴリズムはSHA-2となっており、衝突は報告されていません。お使いの証明書のハッシュアルゴリズムがSHA-2(SHA-224/SHA-256/SHA-384/SHA-512)であれば、すぐにこの脆弱性の影響を受けることはない、と言えるでしょう。しかしながら、業界の要求に違反した電子証明書が発行されたとなれば、それらの電子証明書が大量失効される、という事態になるかもしれません。
関連サイト