権限を宣言してユーザーに警告する

拡張機能がウェブサイトとほとんどの Chrome API にアクセスできるかどうかは、その拡張機能の宣言された権限によって決まります。権限は、その機能に必要なものだけに制限する必要があります。 権限を制限すると、拡張機能の機能を確立でき、拡張機能が攻撃者によって侵害された場合にデータが漏洩する可能性が低くなります。明示的、最小限の、オプションの権限を実装することで、拡張機能とユーザーを保護します。

権限を整理する

権限とは、Chrome API を参照する既知の文字列、または 1 つ以上のホストへのアクセスを許可する一致パターンを指します。これらはマニフェストにリストされ、必要な権限またはオプションの権限として指定します。

{
  "name": "Permissions Extension",
  ...
  // required permissions
  "permissions": [
    "activeTab",
    "contextMenus",
    "storage"
  ],
  // optional permissions
  "optional_permissions": [
    "topSites",
    "http://www.developer.chrome.com/*"
  ],
      ...
  "manifest_version": 2
}

必要な権限は、拡張機能のコア機能に必要なものだけに限定してください。拡張機能は現在必要以上の権限をリクエストしないでください。更新で必要になる可能性のある権限をリクエストして、将来の変更に対応しないでください。

オプション機能に必要な権限は、オプションの権限として登録する必要があります。これにより、ユーザーは拡張機能を提供するアクセスレベルと必要な機能を決定できます。

必要な権限の特定

単純な拡張機能では、複数の権限のリクエストが必要になる場合があります。また、多くの権限ではインストールに関する警告が表示されます。警告が限定されている拡張機能や、権限が説明されている拡張機能は、ユーザーが信頼する可能性が高くなります。

拡張機能のインストール時に権限に関する警告が表示される

拡張機能のコア機能と、拡張機能に必要な権限を特定します。警告付きの権限が必要な場合は、機能をオプションにすることを検討してください。

イベントを使用してオプションの権限をトリガーする

省略可能な権限のサンプル拡張機能のコア機能は、新しいタブページをオーバーライドしています。その日の目標を表示する機能もあります。この機能に必要なのはストレージ権限のみです(警告はありません)。

追加機能を有効にする拡張ボタン

この拡張機能には、ユーザーの上位のサイトを表示する機能が追加されています。この機能を使用するには topSites 権限が必要ですが、これには警告もあります。

topSites API に関する広告表示オプションの警告

警告付きのオプションとして権限に依存する機能を開発し、これらの機能を自然な形で導入することで、ユーザーはリスクなく拡張機能を体験できます。さらに、ユーザーは拡張機能を使用してエクスペリエンスをさらにカスタマイズでき、警告について説明する機会も生まれます。

activeTab 権限を置き換える

activeTab 権限は、ユーザーが閲覧しているサイトへの一時的なアクセスを許可し、拡張機能が現在のタブで "tabs" 権限を使用できるようにします。多くの場合、このオプションにより "<all_urls>" が不要になります。インストール時に警告は表示されません。

ActiveTab を使用しない場合:

ActiveTab のない権限 UI

ActiveTab を使用する場合:

ActiveTab を含む権限 UI

activeTab 権限は、ユーザーが拡張機能を呼び出したときに、現在アクティブなタブに対する一時的なアクセス権を拡張機能に付与します。拡張機能が侵害された場合、攻撃者はユーザーが拡張機能を呼び出すまでアクセスを待つ必要があり、そのアクセスはタブが移動されるか閉じられるまで持続します。

タブに対して activeTab 権限が有効になっている場合、拡張機能で次のことができます。

  • そのタブで tabs.executeScript または tabs.insertCSS を呼び出します。
  • tabs.Tab オブジェクトを返す API を使用して、そのタブの URL、タイトル、ファビコンを取得します。
  • webRequest API を使用して、タブのメインフレーム送信元に対するネットワーク リクエストをインターセプトします。この拡張機能は、タブのメインフレームの生成元に対するホスト権限を一時的に取得します。

次のユーザー操作により、activeTab が有効になります。

アクセスの許可

拡張機能が file:// URL にアクセスする場合、またはシークレット モードで動作する必要がある場合、ユーザーは拡張機能の詳細ページ(chrome://extensions)内で、これらの機能へのアクセスを有効にする必要があります。

拡張機能の詳細ページでファイルの URL とシークレット モードを許可する

拡張機能は、extension.isAllowedIncognitoAccess() を呼び出すことでシークレット モードで有効になっているかどうかを検出できます。拡張機能は、extension.isAllowedFileSchemeAccess() を使用して file:// URL で実行することもできます。

権限について

権限の警告は、API によって拡張機能のユーザーに付与される機能を説明するものですが、最初は気づかないこともあります。たとえば、"tabs" 権限を追加すると、拡張機能が閲覧アクティビティを読み取ることができるという、一見無関係な警告が表示されます。chrome.tabs API は新しいタブを開くためだけに使用されますが、tabs.Tab オブジェクトを使用して新しく開かれるすべてのタブに関連付けられている URL を表示するためにも使用できます。

可能であれば、オプションの権限か、それほど強力ではない API を実装して、警告が発生しないようにします。

警告の確認

拡張機能が解凍ファイルとして読み込まれる場合、権限の警告は表示されません。拡張機能の権限に関する警告を表示するには、chrome://extensions に移動し、デベロッパー モードが有効になっていることを確認し、[拡張機能をパッケージ化] をクリックします。

[デベロッパー モード] のチェックボックスをオンにして、[拡張機能パック] をクリックする

拡張機能のルート ディレクトリ フィールドに拡張機能のフォルダへのパスを指定し、[拡張機能をパッケージ化] ボタンをクリックします。初回のパッケージでは [秘密鍵] フィールドを無視します。

拡張機能のパスを指定して、[拡張機能のパッケージ化] をクリックします。

Chrome は .crx ファイルと .pem ファイルという 2 つのファイルを作成します。このファイルには拡張機能の秘密鍵が含まれています。

パッケージ化された拡張機能ファイル

秘密鍵を紛失しないよう注意してください。拡張機能を更新するために必要となります。.pem ファイルは秘密の安全な場所に保管してください。

Chrome 拡張機能の管理ページに .crx ファイルをドロップしてインストールします。

インストールするファイルをドロップ

.crx ファイルをドロップすると、ブラウザは拡張機能を追加できるかどうかを尋ね、警告を表示します。

新しいタブ拡張機能に関する警告

警告がある権限

注: 権限テーブルはベスト エフォート ベースで更新されるため、現在の警告と若干異なる場合があります。また、権限によっては、他の権限とペアリングした場合に警告が表示されないことがあります。たとえば、拡張機能が "<all_urls>" もリクエストしている場合、"tabs" 警告は表示されません。拡張機能の権限に関して表示された最新の警告を確認するには、警告の表示の手順に沿って操作します。

権限 説明 警告
  • "http://*/*"
  • "https://*/*"
  • "*://*/*"
  • "<all_urls>"
拡張機能にすべてのホストへのアクセス権を付与します。activeTab 権限を使用すると、ホスト権限を宣言せずに済ませることができる場合があります。 アクセスしたウェブサイトにある自分のすべてのデータの読み取りと変更
"https://HostName.com/" 拡張機能に "https://HostName.com/" へのアクセス権を付与します。activeTab 権限を使用すると、ホスト権限を宣言せずに済ませることができる場合があります。 HostName.com のデータの読み取りと変更
"bookmarks" 拡張機能に chrome.bookmarks API へのアクセスを許可します。 ブックマークの読み取りと変更
"clipboardRead" 拡張機能が document.execCommand('paste') を使用する場合は必須です。 コピーして貼り付けるデータを読み取る
"clipboardWrite" 拡張機能が document.execCommand('copy') または document.execCommand('cut') を使用していることを示します。 コピーして貼り付けるデータを変更する
"contentSettings" 拡張機能に chrome.contentSettings API へのアクセスを許可します。 Cookie、JavaScript、プラグイン、位置情報、マイク、カメラなどの機能へのウェブサイトのアクセスを制御する設定を変更できます。
"debugger" 拡張機能に chrome.debugger API へのアクセスを許可します。
  • ページデバッガのバックエンドにアクセスする
  • アクセスしたウェブサイトにある自分のすべてのデータの読み取りと変更
"declarativeNetRequest" 拡張機能に chrome.declarativeNetRequest API へのアクセスを許可します。 ページ コンテンツをブロックする
"desktopCapture" 拡張機能に chrome.desktopCapture API へのアクセス権を付与します。 画面のコンテンツをキャプチャする
"downloads" 拡張機能に chrome.downloads API へのアクセス権を付与します。 ダウンロードを管理する
"geolocation" ユーザーに許可を求めることなく、拡張機能が HTML5 Geolocation API を使用できるようにします。 物理的な現在地を検出する
"history" 拡張機能に chrome.history API へのアクセス権を付与します。 閲覧履歴の読み取りと変更
"management" 拡張機能に chrome.management API へのアクセス権を付与します。 アプリ、拡張機能、テーマを管理する
"nativeMessaging" 拡張機能にネイティブ メッセージング API へのアクセス権を付与します。 連携するネイティブ アプリと通信する
"notifications" 拡張機能に chrome.notifications API へのアクセス権を付与します。 通知を表示する
"pageCapture" 拡張機能に chrome.pageCapture API へのアクセス権を付与します。 アクセスしたウェブサイトにある自分のすべてのデータの読み取りと変更
"privacy" 拡張機能に chrome.privacy API へのアクセスを許可します。 プライバシー関連の設定を変更する
"proxy" 拡張機能に chrome.proxy API へのアクセス権を付与します。 アクセスしたウェブサイトにある自分のすべてのデータの読み取りと変更
"system.storage" 拡張機能に chrome.system.storage API へのアクセス権を付与します。 ストレージ デバイスを特定して取り出す
"tabCapture" 拡張機能に chrome.tabCapture API へのアクセス権を付与します。 アクセスしたウェブサイトにある自分のすべてのデータの読み取りと変更
"tabs" chrome.tabschrome.windows など、複数の API で使用される Tab オブジェクトの特権フィールドに、拡張機能がアクセスできるようにします。多くの場合、これらの API を利用するために、拡張機能で "tabs" 権限を宣言する必要はありません。 閲覧履歴の読み取り
"topSites" 拡張機能に chrome.topSites API へのアクセスを許可します。 よくアクセスするウェブサイトのリストを表示する
"ttsEngine" 拡張機能に chrome.ttsEngine API へのアクセスを許可します。 合成音声で読み上げられたすべてのテキストを読み上げます
"webNavigation" 拡張機能に chrome.webNavigation API へのアクセス権を付与します。 閲覧履歴の読み取り

許可を更新

追加の権限で拡張機能を更新すると、一時的に無効になることがあります。ユーザーは新しい警告に同意した後、再度有効にする必要があります。

tabs 権限が追加された拡張機能をユーザーが手動で更新すると、管理ページに警告が表示されます。

タブの権限を追加する

拡張機能が自動的に更新されると、ユーザーが新しい権限に同意するまで無効になります。

拡張機能を無効にしました

権限に同意する

これを回避するには、新機能をオプションにして、マニフェストoptional_permissions に新しい権限の更新を追加します。