今日は長いよ。
Web からプログラムをダウンロードして実行する場合、電子署名(デジタル署名)を確認することで、安全であることが保証されます。
ただ、電子署名をするには、法人として高額な費用をかけて証明書を購入する必要があり、個人でプログラムを配布している人には不可能です。
Firefoxの拡張機能にも電子署名を添付すると、拡張機能のインストール時に署名を確認することができます。ですが、実際に署名されている拡張機能を私はあまり見たことがありません。
これについて、outsider reflexさんには
Firefoxで拡張機能のインストール時に「署名されていません」という警告が表示されるけれども、これについて、署名くらい付けろよという話がたまに出る。(略)
とあります。
「署名くらい付けろよ」って言ってるのは誰だろう。もしそう言ってる人がいたとして、それは個人が配布している拡張機能に対して言ってるのですか?企業が配布しているものに対して言っているのではなく?
どうなのかはわかりません。
outsider reflexさんによれば
個人で趣味で拡張機能作ってる人には、重すぎる負担だと思う。
では、これだけの苦労をして署名を付けたとして、それが一体何の意味があるのか。
これは「個人が趣味で作ってる拡張機能に署名を付けたとしても、何の意味もない」ということを言いたいんだと、私は受け取りました。
結論を言えば、それは間違ってないと思います。個人が署名を付けても、意味ない。
ただ、outsider reflexさんは
また、詐欺師が休眠会社の登記簿謄本を使うようなケースも想定すると、認証機関の証明であっても確実な証明であるとは言いきれないことも、忘れてはいけないポイントだろう。
なんて書いてることから、「署名があるだけでは信用できないから、意味がない」と思ってるのかな、と思った。
だとしたら、それはちょっと違う気がする。
利用者は、自分がインストールしようとしている拡張機能に署名がついているとき、無条件にその拡張機能を信用するわけではありません。SSLだからといってどこにでも個人情報を入れるわけじゃないのと同じ。
利用者は、署名されている名前を見て、本当に自分が信用している会社による署名になっているかどうかを確認した上で、インストールするはずです(実際に全ての利用者がそうしているかどうかは別にして、電子署名はそういう運用が前提になっています)。当然そういう使い方をする人は、署名の名前が信用できないものも、署名自体されてないものもインストールしません。
個人が作って配布している拡張なんて絶対にインストールしない人が、普段から信頼している会社が提供する拡張だけをどうしても入れたいなと感じたときに、安全であることを確認するためのものが電子署名なんだと思います。
誰か(個人)が作った拡張が便利だと紹介されているのをどっかで読んで、さっそく自分もインストールしようと思った場合は、署名があろうがなかろうがほとんど変わりません。その作者の署名がそこにあったとして、それで「署名があるから安心」とか思ったら大きな間違いでしょう。
なので、休眠会社の名前を使って署名したところで、利用者がその会社を信頼している状態でなければ詐欺師にとって意味がありません。署名はあれば良いのではなく、その内容が大事なのです。
個人の場合、どんなに正当な署名をしたところで、利用者がその個人を信頼している状態があるでしょうか。悪意のない人が悪意のない拡張機能を作って正当に署名した場合も、悪意のある人が悪意のある拡張機能を作って正当に署名した場合も、利用者にしてみれば同じように見えます。そういう意味で、個人が署名することには意味がないんだと思います。
「意味がない」という結論はoutsider reflexさんと同じですが、「署名は詐欺師だってどうにかして付けることができるから無意味」という理由だと、企業が正当に署名を付けたときまで同じ理由で無意味ということになる。いくら詐欺師でも、有名企業の名前で署名を付けることはできないし、利用者は署名されている名前を確認する(べきである)ので、署名に意味が無いとは言い切れないはずです。
電子署名には、署名した時点から現在までに、プログラムが改ざんされていないことを保証する役割もあります。これに関して、
(略) SSLを使った通信でWebサイトからファイルをダウンロードさせることでカバーできる。(略)
とありますが、そうでしょうか。
SSLは、通信内容が改ざんされていないことを保証するものです。通信が始まる前、例えばサーバに置いてあるファイルそのものが改ざんされてしまえば、それをどんなにSSLを使ってダウンロードしたところで、意味がありません。
電子署名ならば、プログラムの作者がプログラムを作成した時点で埋め込むものなので、その後どこで改ざんされてもわかります。
このため、SSLが電子署名の代わりになるとは言えません。逆に「電子署名がSSLの代わりになる」というのならわからないでも無いけど。
さらに、SSLでの配布に関しては、
Mozilla Add-ons(AMO)は、サイト全体がSSLによって保護された通信を使ってアクセスするようにできている。なので、少なくとも、AMOからダウンロードしたファイルは、AMOのサーバから自分の手元までの間で改竄されていないことが(ほぼ)保証されている。(略)
とありますが、それ本当ですか?
確かにMozilla Add-onsはhttps:になっています。http:でアクセスしてもhttps:にリダイレクトされるほどです。
でも、適当な拡張機能のページを開いて、そこにある「Install now」をクリックしたあとの通信は、http:です。SSLではありませんよ。
これは、以前から私の疑問のひとつでした。なぜ最後の最後に暗号化をやめるのか。サーバ証明書は「*.mozilla.org」で取ってるんだから、拡張機能を配信してる「releases.mozilla.org」でも適用できると思うんですけど。暗号化の処理によってサーバが重くなるのがイヤだったのかなぁ。
最後は、定番のコレ。
自己証明、いわゆる一つのオレオレ証明書でも、SSLでの通信はできる。この場合、認証機関が関わっていないので「そのサイトの作者が実在するかどうか」は証明できない。しかしそれでも、通信が暗号化されていて通信経路上でファイルが改竄されていないことの証明にはなる。
これは間違いです。オレオレ証明書でもSSLの通信はできますが、ファイルが改ざんされていないことの証明にはなりません。
このことは高木さんが何度も何度も言っているのでだいぶ広まったと思ってましたが、まだまだ届いてないところも多い。
サーバからブラウザに対して正しい証明書を送られた場合、途中で改ざんされることはありません。通信経路の途中に誰かが入ろうとした場合、利用者のブラウザにはSSLの警告がでるため、利用者はここで接続を中断することで、被害に合わなくて済みます。
サーバからブラウザに対してオレオレ証明書が送られた場合は、利用者のブラウザには警告が出るけど、その警告を無視して通信をすることが前提になっています。通信経路の途中に誰かが入ったとしてもやはりブラウザにはSSLの警告が出ますが、もともと利用者は警告を無視して通信をするつもりだったため、当然のようにそのまま通信してしまい、被害に合います。
確かに暗号化はされています。ですが、途中で悪人が暗号を復号し、データを改ざんした上で、再び暗号化したデータが送られてくるのです。何の意味もない暗号化であると言えます。
ほとんどの場合は企業ではなく個人が拡張を提供することが多いと思うので、署名が無いのは仕方ないし、署名がしてあったとしてもその人が悪人かも知れない。善人だとしても意図しないセキュリティホールがあるかも知れない。それがイヤなら入れない。ベクターとか当サイトとかからフリーソフトをダウンロードしてインストールするのと同じで、自己責任で使うしかないんだと思います。だからこそ会社のPCには入れないとか、個人のPCに入れるとしても管理者権限で動かさないとか、外向き通信にファイヤーウォールを通すとか、がんばれることはがんばっていいだろうし。
まあ、私の書いた内容も間違ってる部分があると思うので、ピュアに信じてはいけない。どんなにこの日記がSSLで提供されていたとしても、やはり信じてはいけない。個人が書いてる内容なんてそんなもんです。
もとのoutsider reflexさんの記事が更新されていて、さらに続きの記事まで増えているので、こっちもちょっと追記します。
outsider reflexさんの追記にあるように、電子署名について過剰に期待している人がいることが問題なのかも知れない。勝手に過剰な期待をしていて、電子署名がないものに対して「ダメだ」と言う点。電子署名がしてあるだけで過剰に安心してしまう点。どちらも問題なんだと思う。
上に書いた私の説明だけではまだイメージしにくい気がするので、もっとシンプルな例を考えてみた。
問 : ある日、便利なプログラムがあるというので、インストールを試みた。電子署名があったので名前を見てみたら「山田」と書いてあった。このプログラムは安全であると言えますか?
この問いに、なんて答えますか。「ていうか山田って誰だよ」が正解だと思います。当然、誰だかわからない人の作ったプログラムなんて、入れてはいけません。
問 : ある日、便利なプログラムがあるというので、インストールを試みた。電子署名があったので名前を見てみたら「Microsoft Corporation」と書いてあった。このプログラムは安全であると言えますか?
これならどうでしょうか。「Microsoftのことを信頼している人は、安全だと言うだろう。Microsoftのことを信頼してない人は、危険だと言うだろう。」が正解だと思います。
つまり電子署名ってのは、誰が作ったのかを確実に利用者に伝える手段であり、それが安全かどうかの判断は利用者がするのです。たとえMicrosoftと書いてあったって、Microsoftが嫌いな人は、入れたくないわけです。署名の中身が大事というのはそういうことです。
暴論かも知れませんが、「電子署名をすれば改ざんされていないことが保証される」というのは、副作用というか前提というか、つまりは「誰が作ったのかを確実に伝える」という電子署名の本来の目的ためにどうしても必要だから付け加えた機能、だと考えてもいいのではないでしょうか。
outsider reflexさんの後から書いた方の記事には
電子署名は、後者の意味での安全性を保証してくれるけれども、前者の意味での安全性は、全く保証してくれない。
とあります。この文脈で「前者」は「プログラムが悪意によって作られていないこと」、「後者」は「プログラムが途中で改ざんされていないこと」を示しています。
で、上記の引用部分は、私の認識とはやはり違うことがわかる。電子署名は、「プログラムが途中で改ざんされていないこと」を当然のように保証した上で、「プログラムが悪意によって作られていないか」を利用者が自分のポリシーに照らし合わせて検討するための重要な情報を提供するものなのです。
「全く保証してくれない」とあるけど、「プログラムが悪意によって作られていないこと」を保証するって、具体的にどういうこと?
技術者ならもちろん、技術者じゃない人でもわかると思うけど、作られたプログラムに悪意があるかどうかなんて、機械に判断できるワケがないでしょう。冷静に考えたらそんなこと誰だって理解できるはず。そんなどう考えても無理なことを、電子署名に期待してる人がいるというのが、私には信じられません。
そして、悪意がないかどうかがわからないからって、何でもインストールしていいわけではない。なるべく被害に遭わないように、できるだけのことをやればよいのです。その「できるだけのこと」が、誰が作ったプログラムなのかを確認することなんだと思います。そのために電子署名という便利な機能が世の中にはあるわけです。
「情報は出すところに集まる」と言いますが、ホントですねぇ。上で書いている以前からの疑問「Mozilla Add-onsはなぜ拡張のダウンロードでSSLを使わないのか」がわかった。それはoutsider reflexさんによせられたコメント。
AMOで拡張機能をインストールする際、XPIファイルはreleases.mozilla.orgというホストからHTTPSではなくHTTPでダウンロードされます。ただし、JavaScriptとFirefox本体の機能でXPIファイルのSHA-1のハッシュ値の比較が行われ、XPIファイルが改変されていないかチェックされます。
なるほど。httpsで得たハッシュ値と、httpで得た実際のファイルから算出したハッシュ値を比較しているのか。
仮にハッシュ値が一致しなかったら、どういう動きをするんだろ。