ブラウザ(Firefox)の拡張機能で「出来ること」と「出来ないこと」

Page content

ブラウザ(Firefox)の拡張機能は、 通常の Web のクライアントサイドプログラム(JavaScript + wasm) では出来ないことが 実現可能になっている。

例えば、拡張機能は表示中の全てのタブ内の情報にアクセスできる。

とはいえ、何でも出来てしまうと、それはそれでセキュリティ上問題になる。 そのため、セキュリティ問題となるようなことはそもそも実現できない。 例えば、ブラウザを実行している環境内のネットワークへの TCP,UDP でのアクセスや、 ローカルなファイルシステムへのフルアクセスは拡張機能でも実行出来ない (chrome では実現できる可能性がある)。

また、拡張機能に許可されている処理ではあるけど、実質的には実現出来ないこともある。 これはどういうことか?というと、 「技術的には拡張機能で実現できる処理だけどセキュリティ上懸念がある」と判断されると、 リリース出来なくなる、ということだ。

ブラウザ(Firefox)の拡張機能は開発段階とリリース段階とで決定的な違いがある。 拡張機能の開発段階では、それぞれの開発者が ブラウザの再起動ごとに開発中の拡張機能を明示的に読み込ませる必要がある。 一方でリリースされた拡張機能は、ブラウザに一度インストールされれば、 ブラウザの再起動ごとに自動的に拡張機能が読み込まれる。

そして、拡張機能のリリースには、ブラウザの開発元にリリース申請をする必要がある。 このリリース申請には拡張機能に対するブラウザ開発元の審査があり、 その審査にはセキュリティに関するチェックが含まれる。 セキュリティに問題があると判断されると、 技術的には拡張機能で実現できる処理であってもリリース出来ない処理になってしまう。

なお、このリリース申請が通ると、拡張機能には開発元の署名が付加される。 通常のブラウザは、この署名がない拡張機能はインストールが出来ないようになっている。 ブラウザの設定を変更することで、署名のない拡張機能をインストールすることも可能だが、 セキュリティのリスクを考えるとその設定は変更しない方が良いだろう。

タブへのアクセス制限

拡張機能に出来ることの例として以下を挙げた。

「拡張機能は表示中の全てのタブ内の情報にアクセスできる」

しかし、これは正確ではない。

正しくは、 全てのタブにアクセスできるが、アクセスできる情報に制限がある。

ではどのような制限があるかというと、具体的には以下の記載の通り。

コンテンツスクリプト環境(リンク)

上記リンク先の内容の代表的な説明だけ抜粋する。

- コンテンツスクリプトはページスクリプトにて定義された JavaScript 変数を見ることができない
- ページスクリプトが組み込み DOM プロパティを再定義した場合、
  コンテンツスクリプトはそのプロパティの(再定義後でなく)オリジナル値を見ている

これを別の表現をすると、以下になる。

「タブ内の目に見える構成に直接作用する情報にのみアクセス可能」 (JSのシンボル等はユーザの目には見えない)

ただし、hidden になっている DOM の element は目に見えないが、 例外的に拡張機能からアクセス可能だ。

もう少し具体的な例を挙げる。

時刻を AM/PM の 12 時間表示する Web ページがあった場合、 内部的には JS の time シンボルに 24 時間で管理しておき、 時刻を表示する際に AM/PM の 12 時間表現に変換して DOM を構築していたとする。 このとき拡張機能は、 AM/PM の 12 時間表現に変換されている DOM の情報にはアクセスできるが、 JS 内部の time シンボルにはアクセスできない。 アクセスできないシンボルには、単なる数値だけでなく関数なども含まれる。

Web ページの情報にアクセスする拡張機能を開発する際、 その Web ページへの情報アクセスの確認手段として ブラウザのデバッガを利用することが基本になる。 ブラウザのデバッガで情報にアクセス出来るなら、 同じことが拡張機能にも出来るんじゃないか? というようにも思ったが、それは出来ない。

この制限を意識しておかないと、拡張機能の開発に躓くことになる。 というか、自分は躓いた。

なお、拡張機能が自分自身で作成したタブ内の情報は、当然制限なくアクセス可能だ。