Ekstensi memiliki akses ke hak istimewa di dalam browser, menjadikannya target yang menarik bagi penyerang. Jika ekstensi disusupi, setiap pengguna ekstensi tersebut menjadi rentan terhadap gangguan yang berbahaya dan tidak diinginkan. Jaga ekstensi tetap aman dan penggunanya terlindungi dengan menerapkan praktik ini.
Melindungi akun developer
Kode ekstensi diupload dan diperbarui melalui Akun Google. Jika akun developer disusupi, penyerang dapat mengirimkan kode berbahaya langsung ke semua pengguna. Lindungi akun ini dengan mengaktifkan autentikasi 2 langkah , sebaiknya dengan kunci keamanan.
Buat grup tetap selektif
Jika menggunakan publikasi grup, pastikan grup tetap terbatas untuk developer tepercaya. Jangan terima permintaan keanggotaan dari orang yang tidak dikenal.
Jangan pernah gunakan HTTP
Saat meminta atau mengirim data, hindari koneksi HTTP. Asumsikan bahwa setiap koneksi HTTP akan memiliki penyadap atau berisi modifikasi. HTTPS harus selalu diprioritaskan, karena memiliki keamanan bawaan yang menghindari sebagian besar serangan man in the middle.
Meminta izin minimal
Browser Chrome membatasi akses ekstensi ke hak istimewa yang telah diminta secara eksplisit dalam manifes. Ekstensi harus meminimalkan izinnya dengan hanya mendaftarkan API dan situs yang diandalkannya.
Membatasi hak istimewa ekstensi akan membatasi apa yang dapat dieksploitasi oleh calon penyerang.
Pengambilan lintas asal()
Ekstensi hanya dapat menggunakan fetch()
dan XMLHttpRequest()
untuk mendapatkan resource dari ekstensi dan dari domain yang ditentukan dalam izin. Perhatikan bahwa panggilan ke keduanya dicegat oleh pengendali fetch di pekerja layanan.
{
"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
}
Ekstensi dalam contoh di atas meminta akses ke apa saja di developer.chrome.com dan subdomain Google dengan
mencantumkan "https://developer.chrome.com/*"
dan "https://*.google.com/*"
dalam izin. Jika ekstensi disusupi, ekstensi tersebut hanya akan memiliki izin untuk berinteraksi dengan situs yang memenuhi pola kecocokan. Penyerang hanya akan memiliki kemampuan terbatas untuk mengakses "https://user_bank_info.com"
, atau
berinteraksi dengan "https://malicious_website.com"
.
Membatasi kolom manifes
Menyertakan kunci dan izin yang tidak diperlukan dalam manifes akan menciptakan kerentanan dan membuat ekstensi lebih terlihat. Batasi kolom manifes ke kolom manifes yang diandalkan ekstensi.
Dapat dihubungkan secara eksternal
Gunakan kolom "externally_connectable"
untuk mendeklarasikan ekstensi dan halaman web eksternal yang akan bertukar informasi dengan ekstensi. Batasi siapa saja yang dapat terhubung dengan ekstensi secara eksternal ke sumber tepercaya.
{
"name": "Super Safe Extension",
"externally_connectable": {
"ids": [
"iamafriendlyextensionhereisdatas"
],
"matches": [
"https://developer.chrome.com/*",
"https://*.google.com/*"
],
"accepts_tls_channel_id": false
},
...
}
Sumber daya yang dapat diakses dari web
Membuat resource dapat diakses oleh web, di bagian "web_accessible_resources"
akan membuat ekstensi dapat terdeteksi oleh situs dan penyerang.
{
...
"web_accessible_resources": [
{
"resources": [ "test1.png", "test2.png" ],
"matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
}
]
...
}
Semakin banyak sumber daya yang dapat diakses dari web, semakin banyak peluang yang dapat dieksploitasi oleh calon penyerang. Minimalkan file-file ini.
Menyertakan kebijakan keamanan konten eksplisit
Sertakan kebijakan keamanan konten untuk ekstensi dalam manifes guna mencegah serangan pembuatan skrip lintas situs. Jika ekstensi hanya memuat resource dari ekstensi itu sendiri, daftarkan hal berikut:
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": {
"extension_pages": "default-src 'self'"
},
"manifest_version": 3
}
Jika ekstensi perlu menggunakan assembly web, atau meningkatkan batasan di halaman dengan sandbox, ekstensi tersebut dapat ditambahkan:
{
"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
}
Menghindari document.write() dan innerHTML
Meskipun membuat elemen HTML dengan document.write()
dan innerHTML
mungkin lebih mudah,
cara ini membiarkan ekstensi, dan halaman web yang menjadi dependensi ekstensi, terbuka bagi penyerang yang memasukkan
skrip berbahaya. Sebagai gantinya, buat node DOM secara manual dan gunakan innerText
untuk menyisipkan konten dinamis.
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
Menggunakan skrip konten secara hati-hati
Meskipun skrip konten hidup di dunia yang terisolasi, skrip tersebut tidak kebal dari serangan:
- Skrip konten adalah satu-satunya bagian dari ekstensi yang berinteraksi langsung dengan halaman web. Oleh karena itu, halaman web yang berbahaya dapat memanipulasi bagian DOM yang menjadi dependensi skrip konten, atau mengeksploitasi perilaku standar web yang mengejutkan, seperti item bernama.
- Untuk berinteraksi dengan DOM halaman web, skrip konten harus dijalankan dalam proses perender yang sama dengan halaman web. Hal ini membuat skrip konten rentan terhadap kebocoran data melalui serangan saluran samping (misalnya, Spectre), dan diambil alih oleh penyerang jika halaman web berbahaya mengganggu proses perender.
Operasi yang menggunakan data sensitif (seperti informasi pribadi pengguna) atau Chrome API dengan akses ke fungsi browser harus dilakukan di pekerja layanan ekstensi. Hindari mengekspos hak istimewa ekstensi ke skrip konten secara tidak sengaja:
- Asumsikan bahwa pesan dari skrip konten mungkin telah dibuat oleh penyerang (mis., validasi dan bersihkan semua input dan lindungi skrip Anda dari pembuatan skrip lintas situs).
- Asumsikan setiap data yang dikirim ke skrip konten mungkin bocor ke halaman web. Jangan kirim data sensitif (misalnya, rahasia dari ekstensi, data dari asal web lain, histori penjelajahan) ke skrip konten.
- Batasi cakupan tindakan dengan hak istimewa yang dapat dipicu oleh skrip konten. Jangan izinkan skrip konten untuk memicu permintaan ke URL arbitrer atau meneruskan argumen arbitrer ke API ekstensi (misalnya, jangan izinkan penerusan URL arbitrer ke metode
fetch()
atauchrome.tabs.create()
).
Mendaftarkan dan membersihkan input
Lindungi ekstensi dari skrip berbahaya dengan membatasi pemroses hanya ke hal yang diharapkan ekstensi, memvalidasi pengirim data yang masuk, dan membersihkan semua input.
Ekstensi hanya boleh didaftarkan untuk runtime.onMessageExternal
, jika mengharapkan komunikasi dari situs atau ekstensi eksternal. Selalu validasi bahwa pengirim cocok dengan sumber tepercaya.
// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
if (sender.id === kFriendlyExtensionId)
doSomething();
});
Bahkan pesan melalui peristiwa runtime.onMessage dari ekstensi itu sendiri harus diteliti untuk memastikan MessageSender bukan dari skrip konten yang disusupi.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});