宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
第8回Mozilla拡張機能勉強会のプレゼン資料を公開した。
以下、内容を改めて整理してみる。
まず、Firefox 3ではセキュアな方法で自動更新が行われないアドオンはインストールできなくなる。ここでいう「セキュアな自動更新」とは、「インストールされたアドオンについて、自動更新でダウンロードしてきた新バージョンのXPIパッケージが、そのアドオンの作者が提供した物であると確実に保証できる」ということを指している。
その挙動を実現するために、Firefox 3ではアドオンのマニフェストファイルの解析時に、以下の判別が行われる。
Firefoxのアドオンのupdate.rdfはXML形式のリソースとして提供される。そのupdate.rdfの中に、新しいバージョンのアドオンのXPIインストーラのダウンロードURIが記述されている。ということは、このupdate.rdfが通信経路上で改竄される可能性がある――他人が別のリソースを「これがupdate.rdfですよ」と偽って、アドオン作者になりすまして送信できる――場合、最悪のケースでは、「本来の作者が作ったものではない、悪意あるコードが含まれた偽物のインストーラ」を掴まされてしまう恐れがある。よって、上記のどちらかの条件に適合しない場合、そのアドオンのインストールはFirefox 3によって拒否されるようになる。
1の場合はSSLで通信するからまぁ安全、ということでとりあえず説明は省略する(SSLだけじゃ安全じゃねえよとツッコみたい人はいるかもしれないけど)。
2の場合、update.rdfはXML署名という技術によって署名が施されることになる。簡単に言うと、update.rdfの内容そのものと、アドオン作者のみが持つ秘密鍵(という名前の数字)を元にして、暗号化された文字列が生成され、それがupdate.rdfに埋め込まれる。この「埋め込まれた文字列」が「署名」となる。この「署名」は、アドオンのinstall.rdfに書き込まれた公開鍵(という名前の数字)を使えば暗号化される前の状態に戻すことができるので、それをupdate.rdfの内容と比較して一致すれば、そのupdate.rdfは確かに元のアドオン作者が作ったままの内容から少しも改竄されていないし、そのupdate.rdfは確かに元のアドオン作者でなければ作ることができない、ということが保証できる。
さて、こうして取得した「確かにアドオン作者自身が提供した通りの内容である」ことが保証されたupdate.rdfであるが、このリソースには新バージョンのアドオンのXPIファイルをダウンロードするためのURIの情報しか含まれていない。そこでさらにそのファイルをダウンロードする作業があるわけだけれども、ここでまたもう一度チェックが入る。
1の場合は前項同様省略する。
2の場合、アドオン作者はまず、新バージョンのXPIインストーラのファイルの内容を要約した一意な文字列を生成する。これを「ハッシュ」と言って、SHA1やSHA512などアルゴリズムは何種類かあるんだけれども、統計的手法によって「似た内容のファイルからは同じハッシュは生成されない」ように考えられている。update.rdfにはそのハッシュが書き込まれていて、実際にダウンロードされたファイルの内容を元にFirefoxがハッシュを計算して、「実際のファイルのハッシュ」とupdate.rdfに書き込まれていた「ダウンロードされるべきファイルのハッシュ」とが等しければ、ダウンロードしたファイルは確かに元のアドオン作者が作成した物であるということが保証できる。
McCoyは、ここまでの話で出てきたうちの、「update.rdfに署名を施す」「その署名を検証するための公開鍵をinstall.rdfに埋め込む」の部分を担当するソフトウェアだ。(なお、秘密鍵と公開鍵のペアは自動的に生成されるので、アドオン作者自身が秘密鍵の存在を意識することはない。)使い方はリンク先の文書か、くでんさんによる解説を読んで欲しい。
McCoyを使うことで「自動更新をセキュアにする」ことはできる。でも、その前のステップである「そのアドオンを初めてのインストールをセキュアにする」ことはできない。初めてインストールする時の時点で偽物のインストーラを掴まされた場合、この仕組みは破綻してしまう。
初めてのインストールをセキュアにするためには、そのアドオン自体に署名を付けるか、SSLを使って配布するか、ハッシュを比較するしかない。しかし……
などの問題がある。
SSLが使えるのであれば、McCoyを使ってupdate.rdfに署名を施す必要性は薄い。自前でSSLが使えるサーバを用意できるなら問題ないし、そうでなくても、Mozilla Add-onsでは標準でSSLを使用しているので、ここにアドオンを登録しさえすれば初回インストールも自動更新も全部がセキュアになる。よって、McCoyが本当に必要になる場面は、以下のどちらかの場合ということになる。
ちなみに、僕は自動更新はMcCoyを使ってセキュアにしているけれども、初回インストールについては、セキュアでないことを承知の上で普通にhttpで署名無しのXPIインストーラを配布している。この点については責められてもしょうがないので何も言えない。
個人のアドオン作者としては、配布場所をMozilla Add-onsに一本化できるならそれが一番セキュアだし簡単便利だし(今はMozilla Add-onsのUIは日本語化されていて、英語ができなくてもアドオンを簡単に登録できる上、ここに登録すればupdate.rdfもMozilla Add-ons側で提供してくれる)で万々歳なんだけれども、唯一のネックがあって、それは、「一般ユーザから見える場所に置かれるには時間がかかる」ということ。
新しく作成したアドオンは「レビューがついて」「作者が公開申請をして」「そのレビューの内容が妥当と認められて」「エディタが公開を認める」まてずっと一般ユーザの目からは隠されたままになる。また、公開されたアドオンの新しいバージョンをアップロードしても、「エディタがそのアップデート版を検証して、問題ないと確認されて」初めて一般ユーザ向けに公開される。このタイムラグが、Mozilla Add-onsを全面的にお勧めしづらい最大の理由だ。先日もXUL/Migemoのアップデート版が公開を承認されるまで1ヶ月以上かかってしまっていたし、現実的に、このレビューの仕組みはすでに破綻していると言っていいと思う。
せめて、「レビューされていようがいまいが、エディタの審査をパスしていようがいまいが、一般ユーザから自由に見ることはできる」「ただし、レビューされていなかったり、エディタの審査をパスしていなかったりする物については、それ相応の警告を出す」という風な運用に変えてもらえれば、それで十分Mozilla Add-onsに一本化できるんだけど……
Firefox 3以降で「そのアドオンを初めてのインストール」でもアドオンパッケージ内のinstall.rdfにupdateURLが記載されていてそのリンク先のupdate.rdfがMcCoyで署名されていれば、署名検証できなかったらインストールできないから、アドオンパッケージとupdate.rdfの両方が偽物な場合以外はアドオン開発者が提供しようとしたパッケージであると確認できると思います。
McCoyによる署名はもともと中間者攻撃対策ですから、配布ページそのものの真偽や配布ページが他者に乗っ取られてないかは保証できませんね。それを云うとHTTPで公開されているWebというシステムそのものを疑ってかかることになるような気がしますけど……
HTTPSでAMOのスタッフとアドオン開発者しか編集できないAMOのユーザプロフィールのページに、McCoyの公開鍵(updateKey)を書けたらいいんでしょうけど、あんまりユーザプロフィールにいろいろ書けるようにすると、自分や自社の宣伝その他余計なことをいっぱい書く人や団体が出てくる可能性があるからちょっと考えないといけないでしょうね。
ユーザ的には気休めですが、AMOのユーザプロフィールのページのAMOのアドオン開発者のWebページへのリンクのリンク先からしかアドオンをダウンロードしないとか。
以前にここのコメント欄にも私が書いた記憶がありますしMozilla Updateができた時点から思ってましたけど、能力的意欲的にエディタがすることができる人が限られる以上(それほど増加が見込めない)、アドオン作成が活発になってAMOに申請される数が増えると、どう考えてもエディタによるチェックというシステムは破綻します。とりあえず、そこらへん考えてのサンドボックスですから。チェックしていないよりはマシな程度でも「一般ユーザ」の目に触れるアドオンは一応チェックしていますよ、というのがウリなわけで「レビューされていようがいまいが、エディタの審査をパスしていようがいまいが、一般ユーザから自由に見ることはできる」「ただし、レビューされていなかったり、エディタの審査をパスしていなかったりする物については、それ相応の警告を出す」というのはちょっと難しいでしょうね。
12月22日の第八回Mozilla拡張機能勉強会 Wikiに参加してきた。以下覚え書き。 mozilla Japanのエントランスに飾られていた、緑のgoo版Firefox?のクリスマスツリー。 電車の中で無線LANカードと名刺を忘れたことに気がつく。 参加予定者数が22名程と多いので、有線が確保で
> アドオンパッケージとupdate.rdfの両方が偽物な場合以外はアドオン開発者が提供しようとしたパッケージであると確認できると思います。
その「両方が偽者な場合」がありうるから問題なわけで。ご存知でしょうが、McCoy等によって実現される機能は
> それを云うとHTTPで公開されているWebというシステムそのものを疑ってかかることになるような気がしますけど……
のようにWebが疑わしい状態でも機能する(間違いなくアドオン作者が提供する更新のみを受け付ける)ように作られています。んで、インストール時の問題は、「ある利用者がダウンロードしたアドオンの作者が、その利用者が想定する作者(例えばPiroさん)と同じであるか確認できない」という問題です。例えばXさんがPiroさんの拡張機能の公開鍵とupdateURLだけを書き換え、それを中間者攻撃によってAさんにダウンロードさせたとすると、Aさんがダウンロードした拡張機能の作者はあくまでXさんであり、Xさんはその後の任意の時点で更新と称して悪意のあるコードを注入することが可能になってしまいます。
これを防ぐためには、くでんさんも書かれている通り公開鍵が想定するアドオン作者のものであることを確認する別の手段を用意することです。本気になればAMOと連携してアドオンインストール時にFirefoxが「この公開鍵はAMOアカウントの誰それのものと一致する」旨のメッセージを表示するように変更することは容易だと思いますが、今回のMcCoy関連では件の脆弱性修正のみが目的のようで、Mozillaの人たちが「大多数の人はAMOさえあれば十分なんでしょ?」というスタンスなら、それさえも難しいでしょうね。
ということで、Piroさんには率先して公開鍵をAMOで公開してほしいです。アカウントの「WebサイトURL」の項目に#として追加する、というのを考えたのですがいかがでしょう。あ、文字数の制限で元のURLが短い場合でないと入りきらないようですね……
脆弱性のことをちょっと触れておくと、アドオンインストール時にはユーザの主体的な操作が求められるので問題ないが、その後は強制更新されるので更新の過程で別人の悪意のあるコードが紛れ込むのは問題がある。そもそも自動更新での更新内容は大抵の人は注意を払わないものであり、Firefox自体の更新のように自動更新はセキュアであるべきだという共通認識があるので、その部分が脆弱性と認識されて一連のMcCoyにつながるシステムが作られました。実際、インストール時に一度注意するのと、利用中ずっと注意し続けるのでは心構えに雲泥の差があると思います。
ただ、その解決方法はFirefox 2までと整合性を持たせるため現状との妥協点というか、必要最小限の変更でこの問題に対処しようとしたためにこんなになっちゃった、というやる気のなさが感じられます。
あと細かいところをいくつか。
サーバに対する証明書は認証局証明書とは言いません。サーバ証明書と呼んでおくのが無難です。Firefoxでは「サイト証明書」と呼んでますね。認証局証明書は「認証局を識別するための証明書」のことです。あと、以前も書きましたがMcCoy等によって生成される署名は独自形式のものなので、いわゆる「XML署名(XML Signature)」とは別ものだと思います。ついでにプレゼン資料を見てのコメントを。「ハッシュ」は「難読化」のカテゴリには入らないと思います。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2007-12-25_secureaddon.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.