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 các 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 đó sẽ dễ bị xâm nhập độc hại và không mong muốn. Hãy bảo mật tiện ích và bảo vệ người dùng 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. 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à bằng khoá bảo mật.
Giữ các nhóm ở chế độ chọn lọc
Nếu bạn sử dụng tính năng xuất bản nhóm, hãy đảm bảo nhóm chỉ bao gồm các nhà phát triển đáng tin cậy. Không chấp nhận yêu cầu tham gia 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 kết nối HTTP. Giả sử mọi kết nối HTTP sẽ có trình nghe trộm hoặc chứa nội dung sửa đổi. HTTPS luôn được ưu tiên, vì giao thức này có tính năng bảo mật tích hợp sẵn để tránh hầu hết các cuộc tấn công xen giữa.
Yêu cầu cấp 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 vào các đặc quyền đã được yêu cầu rõ ràng trong manifest. Tiện ích phải giảm thiểu các quyền của mình 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 một tiện ích sẽ giới hạn những gì 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()
và 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 trong worker 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 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 nhập, tiện ích vẫn chỉ có quyền tương tác với các trang web đáp ứng mẫu 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. 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 với bên ngoài
Sử dụng trường "externally_connectable"
để khai báo tiện ích bên ngoài và trang web mà tiện ích sẽ trao đổi thông tin. Hạn chế đối tượng 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
Việc cho phép web truy cập vào tài nguyên trong "web_accessible_resources"
sẽ khiến các trang web và kẻ tấn công phát hiện được tiện ích.
{
...
"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, kẻ tấn công tiềm ẩn càng có nhiều cơ hội để khai thác. Hạn chế tối đa các tệp này.
Đưa vào 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 vào tiện ích vào tệp kê khai để ngăn chặn các cuộc tấn công bằ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 tính nă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ì 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ù việc tạo linh động các phần tử HTML bằng document.write()
và innerHTML
có thể đơn giản hơn, nhưng điều này sẽ khiến trình bổ trợ và các trang web mà trình bổ trợ 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);
}
Hãy thận trọng khi sử dụng tập lệnh nội dung
Mặc dù tập lệnh nội dung được xây dựng trong một thế giới tách biệt, nhưng các tập lệnh đó sẽ 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 tiện ích tương tác trực tiếp với trang web. Do đó, 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 hoặc khai thác hành vi tiêu 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 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 đồ hoạ 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 bên (ví dụ: Spectre) và bị kẻ tấn công xâm nhập 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 chức năng của trình duyệt phải được thực hiện trong worker 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ử thông báo từ tập lệnh nội dung có thể đã được 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ả 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. Không gửi dữ liệu nhạy cảm (ví dụ: thông tin 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.
- Hạn chế phạm vi của các hành động đặc quyền mà tập lệnh nội dung có thể kích hoạt. Không cho phép các 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 các API tiện ích (ví dụ: không cho phép truyền các URL tuỳ ý đến phương thức
fetch()
hoặcchrome.tabs.create()
).
Đăng ký và dọn dẹp 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 chỉ giới hạn trình nghe ở những gì tiện ích dự kiến, 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.
Tiện ích chỉ nên đăng ký runtime.onMessageExternal
nếu tiện ích đó dự kiến sẽ nhận được thông tin liên lạc 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ả thông báo qua sự kiện runtime.onMessage từ chính tiện ích cũng phải được kiểm tra kỹ lưỡng để đảm bảo MessageSender không phải là 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.");
});