Luôn an toàn

Tiện ích có quyền truy cập vào các đặc quyền đặc biệt trong trình duyệt, khiến chúng trở thành mục tiêu hấp dẫn đối với kẻ tấn công. Nếu một tiện ích bị xâm phạm, mọi người dùng tiện ích đó đều trở nên dễ bị xâm nhập trái phép và không mong muốn. Hãy bảo mật tiện ích và bảo vệ người dùng tiện ích bằng cách áp dụng các phương pháp này.

Bảo vệ tài khoản nhà phát triển

Mã tiện ích được tải lên và cập nhật thông qua Tài khoản Google. Nếu tài khoản của nhà phát triển bị xâm phạm, kẻ tấn công có thể đẩy mã độc trực tiếp đến tất cả người dùng. Hãy bảo vệ các tài khoản này bằng cách bật tính năng xác thực hai yếu tố , tốt nhất là dùng khoá bảo mật.

Sử dụng vai trò thành viên phù hợp

Nếu nhà xuất bản của bạn có nhiều thành viên, hãy đảm bảo rằng vai trò được cấp cho mỗi người dùng là phù hợp.

Không bao giờ sử dụng HTTP

Khi yêu cầu hoặc gửi dữ liệu, hãy tránh kết nối HTTP. Giả sử rằng mọi kết nối HTTP đều sẽ có người nghe lén hoặc chứa các nội dung sửa đổi. Bạn nên luôn ưu tiên HTTPS vì giao thức này có tính năng bảo mật tích hợp giúp tránh hầu hết các cuộc tấn công xen giữa.

Yêu cầu quyền tối thiểu

Trình duyệt Chrome giới hạn quyền truy cập của tiện ích đối với các đặc quyền đã được yêu cầu rõ ràng trong tệp kê khai. Tiện ích nên giảm thiểu quyền bằng cách chỉ đăng ký các API và trang web mà chúng phụ thuộc vào.

Việc giới hạn đặc quyền của tiện ích sẽ giới hạn những gì mà kẻ tấn công tiềm ẩn có thể khai thác.

Tìm nạp trên nhiều nguồn gốc()

Tiện ích chỉ có thể sử dụng fetch()XMLHttpRequest() để lấy tài nguyên từ tiện ích và từ các miền được chỉ định trong quyền. Xin lưu ý rằng các lệnh gọi đến cả hai đều bị trình xử lý tìm nạp chặn trong trình chạy dịch vụ.

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

Tiện ích này trong mẫu ở trên yêu cầu quyền truy cập vào mọi thứ trên developer.chrome.com và các miền con của Google bằng cách liệt kê "https://developer.chrome.com/*""https://*.google.com/*" trong quyền. Nếu tiện ích bị xâm phạm, thì tiện ích đó vẫn chỉ có quyền tương tác với các trang web đáp ứng mẫu so khớp. Kẻ tấn công sẽ chỉ có khả năng hạn chế truy cập vào "https://user_bank_info.com" hoặc tương tác với "https://malicious_website.com".

Giới hạn các trường trong tệp kê khai

Việc đưa các khoá và quyền không cần thiết vào tệp kê khai sẽ tạo ra các lỗ hổng và khiến tiện ích dễ bị phát hiện hơn. Hãy giới hạn các trường trong tệp kê khai đối với những trường mà tiện ích phụ thuộc vào.

Có thể kết nối ra bên ngoài

Sử dụng trường "externally_connectable" để khai báo những tiện ích và trang web bên ngoài mà tiện ích sẽ trao đổi thông tin. Hạn chế những người mà tiện ích có thể kết nối ra bên ngoài đối với các nguồn đáng tin cậy.

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

Tài nguyên có thể truy cập trên web

Việc cho phép web truy cập vào tài nguyên trong "web_accessible_resources" sẽ khiến một tiện ích có thể bị các trang web và kẻ tấn công phát hiện.

{
  ...
  "web_accessible_resources": [
    {
      "resources": [ "test1.png", "test2.png" ],
      "matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
    }
  ]
  ...
}

Càng có nhiều tài nguyên có thể truy cập trên web, thì kẻ tấn công tiềm ẩn càng có nhiều cách để khai thác. Hãy giữ số lượng các tệp này ở mức tối thiểu.

Đưa chính sách bảo mật nội dung rõ ràng

Đưa chính sách bảo mật nội dung cho tiện ích vào tệp kê khai để ngăn chặn các cuộc tấn công tập lệnh trên nhiều trang web. Nếu tiện ích chỉ tải tài nguyên từ chính tiện ích đó, hãy đăng ký như sau:

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

Nếu tiện ích cần sử dụng WebAssembly hoặc tăng các hạn chế đối với các trang trong hộp cát, thì bạn có thể thêm các hạn chế đó:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
   "content_security_policy": {
    "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';",
    "sandboxed_pages":"script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
  },

  "manifest_version": 3
}

Tránh document.write() và innerHTML

Mặc dù có thể dễ dàng hơn khi tạo các phần tử HTML một cách linh động bằng document.write()innerHTML, nhưng điều này sẽ khiến tiện ích và các trang web mà tiện ích phụ thuộc vào dễ bị kẻ tấn công chèn tập lệnh độc hại. Thay vào đó, hãy tạo các nút DOM theo cách thủ công và sử dụng innerText để chèn nội dung động.

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

Cẩn thận khi sử dụng tập lệnh nội dung

Mặc dù tập lệnh nội dung tồn tại trong một thế giới biệt lập, nhưng chúng không miễn nhiễm với các cuộc tấn công:

  • Tập lệnh nội dung là phần duy nhất của tiện ích tương tác trực tiếp với trang web. Vì vậy, các trang web thù địch có thể thao túng các phần của DOM mà tập lệnh nội dung phụ thuộc vào, hoặc khai thác hành vi đáng ngạc nhiên của tiêu chuẩn web, chẳng hạn như các mục được đặt tên.
  • Để tương tác với DOM của các trang web, tập lệnh nội dung cần thực thi trong cùng một quy trình kết xuất như trang web. Điều này khiến tập lệnh nội dung dễ bị rò rỉ dữ liệu thông qua các cuộc tấn công kênh phụ (ví dụ: Spectre) và bị kẻ tấn công chiếm đoạt nếu một trang web độc hại xâm phạm quy trình kết xuất.

Các thao tác sử dụng dữ liệu nhạy cảm (chẳng hạn như thông tin riêng tư của người dùng) hoặc API Chrome có quyền truy cập vào các hàm của trình duyệt phải được thực hiện trong trình chạy dịch vụ của tiện ích. Tránh vô tình tiết lộ các đặc quyền của tiện ích cho tập lệnh nội dung:

  • Giả sử rằng các thông báo từ tập lệnh nội dung có thể do kẻ tấn công tạo ra (ví dụ: xác thực và làm sạch tất cả dữ liệu đầu vào và bảo vệ tập lệnh của bạn khỏi tập lệnh trên nhiều trang web).
  • Giả sử mọi dữ liệu được gửi đến tập lệnh nội dung đều có thể bị rò rỉ sang trang web. Đừng gửi dữ liệu nhạy cảm (ví dụ: bí mật từ tiện ích, dữ liệu từ các nguồn gốc web khác, nhật ký duyệt web) đến tập lệnh nội dung.
  • Giới hạn phạm vi của các hành động đặc quyền có thể được kích hoạt bởi tập lệnh nội dung. Không cho phép tập lệnh nội dung kích hoạt các yêu cầu đến URL tuỳ ý hoặc truyền các đối số tuỳ ý đến API tiện ích (ví dụ: không cho phép truyền URL tuỳ ý đến fetch() hoặc chrome.tabs.create() phương thức).

Đăng ký và làm sạch dữ liệu đầu vào

Bảo vệ tiện ích khỏi các tập lệnh độc hại bằng cách giới hạn trình nghe chỉ đối với những gì mà tiện ích mong đợi, xác thực người gửi dữ liệu đến và làm sạch tất cả dữ liệu đầu vào.

Tiện ích chỉ nên đăng ký runtime.onMessageExternal nếu tiện ích đó mong đợi giao tiếp từ một trang web hoặc tiện ích bên ngoài. Luôn xác thực rằng người gửi khớp với một nguồn đáng tin cậy.

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

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

Ngay cả các thông báo thông qua sự kiện runtime.onMessage từ chính tiện ích cũng cần được xem xét kỹ lưỡng để đảm bảo MessageSender không phải là từ một tập lệnh nội dung bị xâm phạm.

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