Edited at

SHA-1、破られる!で、TLSへの影響は?

More than 1 year has passed since last update.

2017年2月23日、ついに机上の理論ではなく実際に、SHA-1が破られました。具体的には、SHA-1ハッシュ値が全く同じ値を取る2つのPDFファイルが公開されました。詳細についてはSHAtteredの公式サイトを見ていただくとして、ここでは一般論としてハッシュ関数が破られるとTLSに何が起きるかという観点で考察したいと思います。


ハッシュ関数が破られても直ちに危険とは言えない、か?


デジタル署名で使う場合は危険

署名関数(RSAやDSA)と組み合わせてデジタル署名に使われるハッシュ関数で衝突に成功するということは、署名と辻褄が合うような偽造電文を作られてしまう可能性があることになりますので、基本的には、その署名は安全ではありません。もっとも、実際に攻撃が可能かどうかは、標的電文のファイルフォーマットなど複雑な要因が作用します。


HMACの中で使う場合は微妙

ハッシュ関数はHMACの中で使われますが、ハッシュ関数が脆弱ならHMACも脆弱か?というと、ちょっと古いですが2011年のRFC6151 (Google翻訳) にMD5ベース、RFC6194 (Google翻訳) にSHA-1ベースの考察が記載されています。これによると、


  • HMACをMACとして(通信改ざん検出に)利用する場合は、直ちに脆弱ではない。

  • HMACを利用するPRF関数については、影響はよくわからない。

というわけで、何だかモヤッとするところですが、直ちにHMAC-MD5、HMAC-SHAを危険と扱う必要はないと考えてよさそうです。


具体的には。。。


X.509証明書

TLSサーバ証明書などの証明書は、各認証局でSHA-2への移行が順次進んでいるはずですが、古いSHA-1の仕様がまだ残っている場合は引っかかる可能性があります。SHAtteredの公式サイトによると、FirefoxはSHA-1の廃止を当初予定より前倒しして2017年2月24日に実施したとのことです。

ちなみに、誤解されやすいのが証明書のfingerprint (拇印)ですが、証明書の中に拇印というフィールドがあるわけではありません。例えばSHA-256拇印とは、単にその証明書データのSHA-256ハッシュ値です。ですから、もしブラウザの画面にSHA-1拇印しか出てこないとしてもそれは証明書を見ているあなたのブラウザにSHA-1拇印機能しかないという話ですから、やるべきことは、あなたのブラウザをアップデートすることであり、証明書そのものを手直しする必要はありません。


TLS1.0, TLS1.1

拙稿SSL3.0, TLS1.0~1.2の微妙な違いのまとめで説明しましたが、TLS1.0とTLS1.1は、プロトコルの中にSHA-1とMD5がハードコードされています。SHA-1が破られたとすれば、TLS1.0や1.1に影響が出るのか気になるところですが、結論としては、直ちに危険ではないようです。


PRF

PRFはTLSのいろいろなところに出て来る縁の下の力持ち的な多用途の関数です。定義はこちら

使われ方としては、上述のHMACをPRFの中で使うケースですので、一応、直ちにSHA-1を廃止必須とするほど重大ではないと考えてよさそうです。


ServerKeyExchangeの署名

拙稿 SSL/TLS(SSL3.0~TLS1.2)のハンドシェイクを復習する の鍵交換のところで説明しましたが、ServerKeyExchangeは、鍵交換方式がDHEやECDHEの場合に現れるメッセージです。RSAの場合は使われません。

定義はこちらにありますが、署名に使うハッシュですので、その意味では危険度は高いということになります。もっとも、既存の署名と辻褄の合うような偽のDiffie-Hellman公開鍵(と、対応する秘密鍵)を作り上げるというのは、ちょっと高難度すぎる気がしますので、いまのところ、これが実際の脅威とは扱われていないようです。とはいえ、Forward Secrecyと呼ばれ、安全とされ、使うことが推奨される、DHEとECDHEが対象というのは、ちょっと気になるところではあります。


CertificateVerifyの署名

これはクライアント証明書を使う場合に送出されるメッセージです。これも署名に使うハッシュではありますが、CertifateVerifyは平文の正しさを証明するのではなく、証明書の正しさを証明するための署名ですので、偽の平文ではなく「偽の証明書」を作る攻撃ができないと、脅威にはなりません。SHAtteredでは、そこまで実現してはいないようです。

というわけで、結論としては、TLS1.0とTLS1.1がSHAtteredの影響を受けて非推奨と扱われることは、今のところなさそうです。もっとも、TLS1.2のほうが安全度は高く、可能であればTLS1.2に移行するほうが無難ではあります。

以上!SHAtteredに関しては今後も続報が出るかも知れませんので、開発者、運用者の皆様におかれては、ニュースに注意するようにして下さい。幸運を祈る。