Flashblock アドオン と Click-to-Play の違い

最近、Firefoxに「ユーザーが許可するまでFlashなどのプラグインを実行しない機能(以下Click-to-Play)」が実装された。だが、似たような機能は昔からアドオンで提供されていて、 Flashblockというアドオンがある。
で、これらの違いってなんなのよということを掻い摘んで書く。とにかく掻い摘んで書くので、背景知識わからない人には暗号みたいなエントリになってると思います。具体例としてFirefoxで話しますが、基本的にはどのブラウザにも適応される話です。

Flashblock

基本原理としては「XBLでプラグインを呼び出す要素(object, embed)を瞬間的に置き換える」挙動でプラグインの実行を防止している。
まず、アドオンをインストールすることでFirefoxに専用のCSS(XBL指定)を登録する。その後、開いたWebページ中にプラグインを呼び出す要素があった場合、FlashblockのXBL指定によってその場で対象の要素が無害なplaceholder用の要素に置き換えられる。置き換え処理の際、object要素やembed要素の属性値やパラメーターを読み出してplaceholderに持たせることで、「placeholderをクリックしてプラグインを実行する」という処理が可能になるわけですね。
ただし、この方式にはいくつかの欠点がある。
エンジン側を直接フックしているわけでは無い為、対象となる要素を置換する前にどうしてもプラグインが「一時的に」呼び出される。どの程度呼び出されるかはXBLによるバインディング置き換え処理にかかる時間に依存するものの、根本原理的に数~数百msはプラグインが実行されることとなる。そのため、プラグインの脆弱性を狙う系統の攻撃に対しては基本的に無力であると思った方が良い。
また、置き換える対象の要素はXBLを使う都合上、CSSセレクタで表現できるものに限られる。(あまり考えなくても大丈夫ですが)CSSセレクタに抜け漏れがあると、プラグインの置換処理は確実には行われない。また、JSなどで動的にDOMを構築してプラグイン要素を読み込むような処理に対しても置換の成功率が下がる(Flashblockでは、setTimeout(function, 0)で置換処理の開始を先延ばしするようなダーティなハックを行っていたりする)。
ここに挙げた欠点は、XBLを使用する置換処理に限った話ではなく、エンジン側のプラグイン呼び出しを直接フックしない手法全般に存在するものと考えるべきです。

Click-to-play

IE9もChromeOperaも積んでて、ついにFirefoxにも載った機能。
前者の手法とは違って、エンジンレベルで組み込まれた機能であり、Geckoのプラグイン呼び出しに挟まるっているため、「置換処理終了までの間に数~数百msのプラグインほど実行される」という問題が無い。そのため、セキュリティ的な緩和策として十分役に立つものとなる。前者の他の欠点も原理的に全部潰れる。素敵ですね。
エンジンレベルでこの機能が組み込まれている場合、実装にバグが無い限り、XBLやスクリプトによる根性式プラグイン実行停止処理の欠点は基本的に消えることとなる(Firefoxのそれは一部のページでplaceholderが美味く表示されないバグがまだ残ってるんだ。てへぺろ

まとめ

エンジンレベルのClikc-to-playに頼ってもセキュリティ的には緩和策なんでプラグインのアップデートは必要です