Các 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 của kẻ tấn công. Nếu một tiện ích bị xâm phạm, mọi người dùng của tiện ích đó đều sẽ dễ bị xâm nhập độc hại và không mong muốn. Đảm bảo an toàn cho một tiện ích và bảo vệ người dùng của tiện ích đó bằng cách kết hợp 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ể gửi mã độc trực tiếp cho tất cả người dùng. Hãy bảo vệ những 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à với khoá bảo mật.
Duy trì tính chọn lọc của các nhóm
Nếu sử dụng tính năng xuất bản nhóm, bạn chỉ nên chỉ định nhóm này cho các nhà phát triển đáng tin cậy. Đừng chấp nhận các yêu cầu đăng ký làm thành viên từ những người không xác định.
Không bao giờ sử dụng HTTP
Khi yêu cầu hoặc gửi dữ liệu, hãy tránh sử dụng kết nối HTTP. Giả sử mọi kết nối HTTP đều có trình nghe lén hoặc chứa nội dung sửa đổi. Bạn nên luôn ưu tiên HTTPS vì giao thức này có cơ chế bảo mật tích hợp sẵn 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 ở mức tối thiểu
Trình duyệt Chrome giới hạn quyền truy cập của tiện ích vào 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ý API và trang web mà chúng phụ thuộc.
Việc giới hạn các đặc quyền của một tiện ích sẽ giới hạn những gì mà kẻ tấn công tiềm năng có thể khai thác.
Tìm nạp nhiều nguồn gốc()
Một tiện ích chỉ có thể sử dụng fetch()
và XMLHttpRequest()
để lấy tài nguyên từ tiện ích đó và từ các miền được chỉ định trong các quyền. Xin lưu ý rằng lệnh gọi đến cả hai đều bị trình xử lý fetch trong trình chạy dịch vụ chặn.
{
"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 nội dung 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/*"
và "https://*.google.com/*"
trong các quyền. Nếu bị xâm phạm, 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 truy cập hạn chế 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 quyền và khoá không cần thiết vào tệp kê khai sẽ tạo ra các lỗ hổng bảo mật và khiến tiện ích dễ được nhìn thấy hơn. Giới hạn các trường tệp kê khai ở những trường mà tiện ích dựa vào.
Có thể kết nối bên ngoài
Sử dụng trường "externally_connectable"
để khai báo những tiện ích bên ngoài và trang web 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 bên ngoà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
Cho phép các trang web và kẻ tấn công phát hiện thấy tiện ích trong "web_accessible_resources"
.
{
...
"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 mà kẻ tấn công có thể truy cập trên web, thì kẻ tấn công tiềm năng càng có thể khai thác nhiều cách hơn. Hãy giữ các tệp này ở mức tối thiểu.
Cung cấp chính sách bảo mật nội dung phản cảm
Đư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 nó, hãy đăng ký các tài nguyên 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 cần sử dụng tập hợp web hoặc tăng các hạn chế đối với trang trong hộp cát, thì tiện ích có thể được thêm vào:
{
"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à internalHTML
Mặc dù việc tạo phần tử HTML một cách linh động bằng document.write()
và innerHTML
có thể đơn giản hơn, nhưng tiện ích này sẽ để tiện ích và các trang web mà tiện ích phụ thuộc vào, sẽ bị kẻ tấn công chèn tập lệnh độc hại mở. Thay vào đó, hãy tạo 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 trọng khi sử dụng tập lệnh nội dung
Tuy tập lệnh nội dung vẫn tồn tại trong một thế giới tách biệt, nhưng chúng không tránh được các cuộc tấn công:
- Tập lệnh nội dung là phần duy nhất của phần mở rộng tương tác trực tiếp với trang web. Do đó, các trang web gây hại 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 chuẩn web đáng ngạc nhiên, chẳng hạn như các mục được đặt tên.
- Để tương tác với DOM của trang web, tập lệnh nội dung cần phải thực thi trong cùng một quy trình kết xuất đồ hoạ như trang web. Điều này khiến tập lệnh nội dung dễ bị rò rỉ dữ liệu 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 trang web độc hại xâm phạm quá trình kết xuất.
Các thao tác 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 chức năng 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 để tình trạng vô tình để lộ đặc quyền của tiện ích cho tập lệnh nội dung:
- Giả sử rằng thông báo từ mộ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à dọn dẹp 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ả định rằng bất kỳ dữ liệu nào được gửi đến tập lệnh nội dung có thể bị rò rỉ đến trang web. Không gửi dữ liệu nhạy cảm (ví dụ: dữ liệu bí mật của 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ác thao tác đặc quyền có thể được tập lệnh nội dung kích hoạt. Không cho phép tập lệnh nội dung kích hoạt yêu cầu đến các URL tuỳ ý hoặc chuyển các đối số tuỳ ý đến API tiện ích (ví dụ: không cho phép chuyển URL tuỳ ý vào phương thức
fetch()
hoặcchrome.tabs.create()
).
Đăng ký và dọn dẹp đầ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ỉ ở những gì tiện ích mong đợi, xác thực người gửi dữ liệu đến và dọn dẹp tất cả dữ liệu đầu vào.
Một tiện ích chỉ nên đăng ký runtime.onMessageExternal
nếu nhận được kết nối 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ả những tin nhắn thông qua sự kiện runtime.onMessage từ chính tiện ích cũng phải được xem xét kỹ lưỡng để đảm bảo MessageSender không đến 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.");
});