ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

オレオレ証明書の問題点

今一よくわかってないけど、自分自身の理解の確認のために書いてみる。
まず、HTTPSの利点だが、これは以下の2点が挙げられると思う。

  1. 正しい接続先であることを信頼できる。
  2. 通信が暗号で行われるため、盗聴されるリスクをほぼなくせる。

さて、多くの人の理解では、HTTPSを使うことで2.が重要視されている。このため、オレオレ証明書でも問題ないんじゃね?という意識がまかり通っていると思われる。
しかし、HTTPSで重要なのは1.のほうだと思う。いくら情報が暗号で行われていても、接続先が正しいものでなければ、送信した情報が通信したい相手以外に渡されてしまう。

例と言うのはあまりよくないかもしれないが、オレオレ証明書と言うのは、こんな感じだ。

  • Aさん、Bさん、Cさんはそれぞれ相手の名前、所属する会社は知っているが、それ以外のことは知らない。
  • AさんはBさんと実際に会って、共通鍵暗号の鍵を手渡ししたいと考え、Bさんと会う約束をした。
  • CさんはBさんとAさんが会おうとしていることを知り、Bさんに成りすまして、Aさんと約束を取り付けた。
  • 当日、CさんはBさんの名義の名刺を作成し、それを使って、Aさんを信用させ、まんまと共通鍵を受け取った。
  • AさんはBさんに暗号で通信していると思い、後日機密情報をCさんに送った。

つまり、AさんはCさんをBさんと誤解して情報を渡してしまったことになる。このようなことが起こった原因は、信頼できない名刺(自分で自分はBさんだといってるようなもん)と言うものを信頼することで、相手が確かにBさんであるとAさんが判断したことによる。なぜ、名刺が信頼できないかと言うと簡単に偽造が出来るからだ。それこそ、PCとプリンタさえあれば誰にだって作ることが出来る。この例における名刺が、オレオレ証明書である。

一方、偽造可能な名刺を相手の確認のために使うのではなく、免許書(最近の免許書であればICチップが組み込まれているので、偽造は難しい)で行った場合を考えてみる。ここで、Bさんの免許書が盗難されれば意味はないが、盗まれていないとする。その場合、Bさんの免許書はBさん以外には持っていないので、AさんがCさんの免許書を確認することにより、AさんはCさんがBさんではないということがわかる。その結果、共通鍵をCさんに渡すことはしなくなる。したがって、機密情報をCさんに送ることはない。
この例では、偽造が不可能かつ、国という信頼できる発行機関が個人を証明している免許書というものを使っている。これは、Verisignなどで発行される正規の証明書と同じ考え方だ。

正規の証明書を使うことで、通信の相手先が確実に正しいものであると言うことがある程度保証される。その結果、他人に情報が渡ることを防ぐことが出来るのである。

オレオレ証明書でもいいじゃないかという人の言い分は、「通信の暗号だけが出来ればいいんだヨ!」と言うものであるが、暗号と言うものは送りたい相手にのみ内容が理解できると言うものでなくては意味がない。相手先がどこの誰とも知れないにもかかわらずいくら暗号で情報を送ったとしても、その情報は漏れてしまう。
先にも書いたが、オレオレ証明書は偽造可能な名刺のようなものだ。実際、オレオレ証明書を使っているサイトに対し、DNSのキャッシュ汚染やARP Spoofなどの方法を使って、フィッシングサイトに対してクレジットカードなどの機微情報を送信してしまうことも簡単に可能だ。
オレオレ証明書を使用しているサイトにアクセスした場合、証明書を受け入れるか聞かれる。それが普通だと思っている利用者は、偽造した証明書(表面上は同じ情報を表示するようなことも可能だ)であっても、同じように証明書を受け入れるか聞かれるため、フィッシングサイトでも、それが普通と考え、安心して機微情報を送ってしまうことだろう。なぜなら、オレオレ証明書は、自分自身で自分は正しいですよということを言っているに過ぎないからだ。それは、本当に正しいことなのかユーザからは判断できないし、判断する責任がユーザに存在する。
このように、オレオレ証明書を使っている場合は、送りたい相手以外に機微情報を送ってしまう危険性がある。
一方、正規の証明書は、証明書発行機関がそのサイトは本当に正しいサイトかどうかをオフラインの情報などで確認している(ただし全ての発行機関がそういったことをやっているわけではない。これが問題になっているのは確かである)。また、証明書は基本的に偽造できないので、ユーザは安心して、そのサイトが正しいものであると判断できる。したがって、正しい接続先にしか機微情報を送らないことが確実であると言える(必ずしもそういうわけではないが、そうでない可能性はかなり低い)。

もちろん、オレオレ証明書を絶対使うなと言うわけではなく、オレオレ証明書を使ったHTTPSはHTTPと同程度(というより毛の生えた程度のほうが正しいのか)の安全性しかないことを理解したうえで使うのであれば問題ないかもしれない。また、フィンガープリントを確実に相手に渡し、常にフィンガープリントを確認するなどであれば、ほぼ問題ないと考えられる。でも、そういった運用は手間だけが発生し、実際にはされない危険性が高いのでお勧めはしない。

オレオレ証明書なんて、せいぜい開発などの段階でテスト用に使用するのがいいんでないの。

Blackhatの資料(from id:tessyさんとこ)

http://164.106.251.250/docs/bh2008/
これとか面白そう。
http://164.106.251.250/docs/bh2008/Clark_SQL_Injection_for_Fun/
http://164.106.251.250/docs/bh2008/DeMott_AppSec_A-Z/
DEFCONの資料も出てたので、見てみてるけど、面白そうなのに限ってないorz
http://164.106.251.250/docs/dc2008/
プログラムとあわせてチェックしてたらツールが見つかったので、チェック。
http://www.grendel-scan.com/