Tetap aman

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 lindungi penggunanya 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.

Menggunakan peran anggota yang sesuai

Jika penerbit Anda memiliki beberapa anggota, pastikan peran yang diberikan kepada setiap pengguna sudah sesuai.

Jangan pernah menggunakan HTTP

Saat meminta atau mengirim data, hindari koneksi HTTP. Asumsikan bahwa setiap koneksi HTTP akan memiliki penyadap atau berisi modifikasi. HTTPS harus selalu menjadi pilihan utama, karena memiliki keamanan bawaan yang dapat mencegah 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 menjadi dependensinya.

Membatasi hak istimewa ekstensi akan membatasi apa 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 handler 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 ini 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 ekstensi disusupi, ekstensi tersebut tetap hanya 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 hanya pada kolom yang digunakan ekstensi.

Dapat dihubungkan secara eksternal

Gunakan kolom "externally_connectable" untuk menyatakan ekstensi eksternal dan halaman web mana yang akan digunakan ekstensi untuk bertukar informasi. Membatasi siapa yang dapat dihubungkan secara eksternal oleh 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 melalui 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/*" ]
    }
  ]
  ...
}

Makin banyak resource yang dapat diakses web, makin banyak jalur yang dapat dieksploitasi oleh calon penyerang. Kurangi jumlah file ini seminimal mungkin.

Menyertakan kebijakan keamanan konten eksplisit

Sertakan kebijakan keamanan konten untuk ekstensi dalam manifes guna mencegah serangan scripting lintas situs. Jika ekstensi hanya memuat resource dari dirinya 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 batasan pada halaman sandbox, ekstensi 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
}

Hindari document.write() dan innerHTML

Meskipun lebih mudah membuat elemen HTML secara dinamis dengan document.write() dan innerHTML, hal ini membuat ekstensi, dan halaman web yang bergantung pada ekstensi tersebut, rentan terhadap penyisipan skrip berbahaya oleh penyerang. 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 berada di dunia terisolasi, skrip konten tidak kebal dari serangan:

  • Skrip konten adalah satu-satunya bagian ekstensi yang berinteraksi langsung dengan halaman web. Oleh karena itu, halaman web yang berbahaya dapat memanipulasi bagian DOM yang bergantung pada skrip konten, atau mengeksploitasi perilaku standar web yang tidak terduga, 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 dapat diambil alih oleh penyerang jika halaman web berbahaya membahayakan 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 pemaparan 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 bahwa data apa pun yang dikirim ke skrip konten mungkin bocor ke halaman web. Jangan mengirim data sensitif (misalnya, rahasia dari ekstensi, data dari origin web lain, histori penjelajahan) ke skrip konten.
  • Membatasi cakupan tindakan 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() atau chrome.tabs.create()).

Mendaftarkan dan membersihkan input

Lindungi ekstensi dari skrip berbahaya dengan membatasi pemroses hanya pada apa yang diharapkan ekstensi, memvalidasi pengirim data 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.");
});