保障帳戶安全

擴充功能具有瀏覽器中的特殊權限,因此成為 攻擊者擴充功能一旦遭到入侵,該擴充功能的「所有」使用者都會容易取得 惡意和不必要的入侵整合擴充功能,確保擴充功能和使用者安全無虞 這些做法。

保護開發人員帳戶

擴充功能程式碼會透過 Google 帳戶上傳和更新。如果開發人員帳戶為 攻擊者就可以直接將惡意程式碼推送至所有使用者。保護帳戶的方式如下: 最好建立開發人員帳戶,並啟用雙重驗證 使用安全金鑰

保留群組選擇性

如果使用群組發布功能,請將該群組設為只有信任的開發人員才能使用。不接受 來自不明人士的成員資格申請

一律不使用 HTTP

要求或傳送資料時,請避免使用 HTTP 連線。假設所有 HTTP 連線 竊聽或包含改造內容建議一律優先使用 HTTPS,因為這項服務已內建 HTTPS 能規避大部分中間人攻擊的安全性。

要求最低限度的權限

Chrome 瀏覽器會限制擴充功能對於特定權限 資訊清單。擴充功能應只註冊 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"
  ],
  ...
}

可用的網路資源越多,就能讓潛在攻擊者利用越多管道。保留 最低為 YAML 檔案

加入煽情露骨內容安全政策

在資訊清單中為擴充功能加入內容安全政策,防範跨網站攻擊 編寫攻擊指令碼。如果擴充功能只會從本身註冊資源,請註冊以下程式碼:

{
  "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),並在惡意網頁遭到入侵時遭到攻擊者掌控 轉譯器程序

敏感工作必須在專用程序中執行,例如擴充功能的背景 指令碼。避免意外洩露擴充功能權限給內容指令碼:

  • 假設內容指令碼中的訊息可能是攻擊者 (例如 驗證所有輸入內容並加以清除,避免指令碼跨網站指令碼攻擊
  • 假設傳送到內容指令碼的任何資料都可能流向網頁。不要傳送私密資料 的內容 (例如擴充功能中的密鑰、其他網頁來源的資料、瀏覽記錄) 到內容 指令碼
  • 限制內容指令碼可觸發的權限動作範圍。不允許 內容指令碼,觸發對任意網址的要求,或是將任意引數傳送至 擴充功能 API (例如禁止將任意網址傳送至 fetchchrome.tabs.create API)。

註冊及清除輸入內容

限制事件監聽器僅保留擴充功能的內容,保護擴充功能不受惡意指令碼侵擾 預期、驗證傳入資料的傳送者,並淨化所有輸入內容。

擴充功能應只在預期情況下註冊 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;');
}