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 keamanan ekstensi dan penggunanya dengan menerapkan praktik ini.
Melindungi akun developer
Kode ekstensi diupload dan diperbarui melalui Akun Google. Jika akun developer diretas, penyerang dapat mengirimkan kode berbahaya langsung ke semua pengguna. Lindungi akun ini dengan mengaktifkan autentikasi 2 langkah , sebaiknya dengan kunci keamanan.
Memastikan grup tetap selektif
Jika menggunakan penayangan grup, pastikan grup hanya berisi 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 diutamakan, karena memiliki keamanan bawaan yang mengakali sebagian besar serangan man-in-the-middle.
Meminta izin minimal
Browser Chrome membatasi akses ekstensi ke hak istimewa yang telah diminta secara eksplisit dalam manifest. Ekstensi harus meminimalkan izinnya dengan hanya mendaftarkan API dan situs yang diperlukannya.
Membatasi hak istimewa ekstensi akan membatasi hal yang dapat dieksploitasi oleh calon penyerang.
Pengambilan lintas origin()
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 pengambilan 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 pun di developer.chrome.com dan subdomain Google dengan
mencantumkan "https://developer.chrome.com/*"
dan "https://*.google.com/*"
dalam izin. Jika dibobol, ekstensi tersebut hanya akan memiliki izin untuk berinteraksi dengan situs yang memenuhi pola pencocokan. Penyerang hanya 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 perlu dalam manifes akan menciptakan kerentanan dan membuat ekstensi lebih terlihat. Batasi kolom manifes ke kolom yang diandalkan ekstensi.
Dapat dihubungkan secara eksternal
Gunakan kolom "externally_connectable"
untuk mendeklarasikan ekstensi eksternal dan halaman web yang akan menjadi tujuan pertukaran informasi ekstensi. Batasi siapa yang dapat terhubung secara eksternal dengan ekstensi ke
sumber tepercaya.
{
"name": "Super Safe Extension",
"externally_connectable": {
"ids": [
"iamafriendlyextensionhereisdatas"
],
"matches": [
"https://developer.chrome.com/*",
"https://*.google.com/*"
],
"accepts_tls_channel_id": false
},
...
}
Referensi yang dapat diakses dari web
Membuat resource dapat diakses oleh web, di bagian "web_accessible_resources"
akan membuat ekstensi dapat dideteksi 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 melalui web, semakin banyak peluang yang dapat dieksploitasi oleh penyerang. Kurangi file ini seminimal mungkin.
Menyertakan kebijakan keamanan konten vulgar
Sertakan kebijakan keamanan konten untuk ekstensi dalam manifes guna mencegah serangan pembuatan skrip lintas situs. Jika ekstensi hanya memuat resource dari halaman 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 web assembly, atau meningkatkan pembatasan pada 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 mungkin lebih mudah untuk membuat elemen HTML secara dinamis dengan document.write()
dan innerHTML
,
ekstensi, dan halaman web yang menjadi dependensi ekstensi, akan terbuka bagi penyerang untuk menyisipkan
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 dengan hati-hati
Meskipun skrip konten berada di dunia yang terisolasi, skrip tersebut tidak kebal terhadap serangan:
- Skrip konten adalah satu-satunya bagian dari ekstensi yang berinteraksi langsung dengan halaman web. Oleh karena itu, halaman web 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 secara tidak sengaja ke skrip konten:
- Asumsikan bahwa pesan dari skrip konten mungkin telah dibuat oleh penyerang (misalnya, validasi dan bersihkan semua input dan lindungi skrip Anda dari cross-site scripting).
- Asumsikan ada data yang dikirim ke skrip konten mungkin bocor ke halaman web. Jangan kirim data sensitif (misalnya rahasia dari ekstensi, data dari origin web lain, histori penjelajahan) ke skrip konten.
- Batasi cakupan tindakan dengan hak istimewa yang dapat dipicu oleh skrip konten. Jangan izinkan
skrip konten 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 pada yang diharapkan ekstensi, memvalidasi pengirim data yang masuk, dan membersihkan semua input.
Ekstensi hanya boleh mendaftar 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 diperiksa untuk memastikan MessageSender bukan berasal dari skrip konten yang disusupi.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});