セキュリティの確保

拡張機能はブラウザ内の特別な権限にアクセスできるため、攻撃者にとって格好のターゲット 無償ツールキットで拡張機能が不正使用されると、その拡張機能のすべてのユーザーが 防ぐことができます。以下を組み込むことで、拡張機能の安全性とユーザーを保護 学びました。

デベロッパー アカウントを保護する

拡張機能コードは、Google アカウントを通じてアップロード、更新されます。開発者がアカウントが 攻撃者は悪意のあるコードをすべてのユーザーに直接 push する可能性があります。以下の方法でこれらのアカウントを保護します。 特にデベロッパー アカウントを作成し、2 要素認証プロセスを有効にしていることが望ましい。 セキュリティ キーが必要です。

グループを選択したままにする

グループ公開を使用している場合は、グループを信頼できるデベロッパーに制限します。同意しない 知らない人からのメンバーシップ リクエスト。

HTTP を使わない

データをリクエストまたは送信するときは、HTTP 接続は使用しないでください。HTTP 接続は、すべての HTTP 盗聴したり改変したりします。HTTPS が組み込まれているため、常に HTTPS を使用することをおすすめします。 ほとんどの中間者攻撃を回避できます。

最小限の権限をリクエストする

Chrome ブラウザは、拡張機能が明示的にリクエストした権限へのアクセスを制限している マニフェストを使用します。拡張機能では、API と API の登録のみを行い、権限を最小限に抑える ウェブサイト全体。任意のコードは最小限に抑える必要があります。

拡張機能の権限を制限することで、潜在的な攻撃者が悪用できるものを制限できる。

クロスオリジンの XMLHttpRequest

拡張機能は、拡張機能自体とドメインからリソースを取得するためにのみ XMLHttpRequest を使用できます。 権限で指定されます。

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "permissions": [
    "/*",
    "https://*.google.com/"
  ],
  "manifest_version": 2
}

この拡張機能は、developer.chrome.com と Google のサブドメインへのアクセスを 権限に "/*""https://*google.com/" をリストする。もし アクセスするウェブサイトとやり取りできる権限は、 一致パターン。攻撃者は、"https://user_bank_info.com" または "https://malicious_website.com" とやり取りします。

マニフェスト フィールドを制限する

マニフェストに不要な登録を含めると脆弱性が生じ、拡張される 目に留まりやすくなりますマニフェスト フィールドは、拡張機能が依存するフィールドに限定し、特定のフィールドを指定します。 登録できます。

外部接続可能

externally_connectable フィールドを使用して、対象の外部の拡張機能とウェブページを 情報をやり取りできます。拡張機能が外部から接続できるユーザーを制限します 提供します。

{
  "name": "Super Safe Extension",
  "externally_connectable": {
    "ids": [
      "iamafriendlyextensionhereisdatas"
    ],
    "matches": [
      "/*",
      "https://*google.com/"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

ウェブアクセス可能なリソース

web_accessible_resources で、ウェブからリソースにアクセスできるようにすると、 エクステンションを検出できる可能性があります。

{
  ...
  "web_accessible_resources": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

Web アクセスが可能なリソースが多いほど、潜在的な攻撃者が悪用できる可能性も高くなります。維持 最小限に抑える必要があります。

露骨な表現を含むコンテンツ セキュリティ ポリシーを含める

クロスサイトを防ぐため、拡張機能のコンテンツ セキュリティ ポリシーをマニフェストに含めてください。 防止できます。拡張機能がそれ自体からリソースのみを読み込む場合は、以下を登録します。

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self'"
  "manifest_version": 2
}

特定のホストからのスクリプトを拡張機能に含める必要がある場合は、それらを含めることができます。

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self' https://extension.resource.com"
  "manifest_version": 2
}

実行可能 API を避ける

コードを実行する API は、より安全な代替手段に置き換える必要があります。

document.write() と innerHTML

document.write()innerHTML を使用して HTML 要素を動的に作成する方が簡単な場合もありますが、 拡張機能と依存しているウェブページが攻撃者にさらされる できます。代わりに、手動で DOM ノードを作成し、innerText を使用して動的コンテンツを挿入します。

function constructDOM() {
  let newTitle = document.createElement('h1');
  newTitle.innerText = host;
  document.appendChild(newTitle);
}

eval()

攻撃を防ぐため、可能な限り eval() は使用しないでください。eval() は、渡されたコードをすべて実行します。 悪意のある可能性があります。

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // WARNING! Might be evaluating an evil script!
    var resp = eval("(" + xhr.responseText + ")");
    ...
  }
}
xhr.send();

代わりに、より安全で高速な JSON.parse() などのメソッドを使用することをおすすめします。

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();

コンテンツ スクリプトを慎重に使用する

コンテンツ スクリプト孤立した世界で暮らしていますが、攻撃の影響を受けません。

  • コンテンツ スクリプトは、ウェブページと直接やり取りする拡張機能の唯一の部分です。 このため、悪意のあるウェブページはコンテンツ スクリプトが依存している DOM の一部を操作する可能性があります。 名前付きアイテムなど、予期しないウェブ標準の動作を悪用します。
  • ウェブページの DOM とやり取りするには、コンテンツ スクリプトを 表示されます。これにより、コンテンツ スクリプトがサイドチャネル攻撃によってデータ漏洩する脆弱性が生まれる (例:Spectre など)、悪意のあるウェブページが不正使用された場合に攻撃者に乗っ取られる レンダリングされます。

機密性の高い作業は、拡張機能の背景などの専用プロセスで行う必要があります。 スクリプト。拡張機能の権限をコンテンツ スクリプトに誤って公開しないようにする:

入力の登録とサニタイズ

対象の拡張機能のみにリスナーを制限することで、悪意のあるスクリプトから拡張機能を保護 受信データの送信者の期待、検証、すべての入力のサニタイズを行います。

拡張機能を runtime.onRequestExternal に登録できるのは、 外部のウェブサイトまたは拡張機能からの通信です。送信者が できます。

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

拡張機能自体からの runtime.onMessage イベントを介して送信されたメッセージであっても、精査する必要があります。 MessageSender が、不正使用されたコンテンツ スクリプトからのものではないことを確認します。

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.allowedAction)
    console.log("This is an allowed action.");
});

ユーザー入力と受信をサニタイズして、拡張機能による攻撃者のスクリプトの実行を防ぎます。 拡張機能自体や承認済みのソースからのデータも含められます。実行可能な API を避ける

function sanitizeInput(input) {
    return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}