Güvende kalın

Uzantılar, tarayıcıda özel ayrıcalıklara erişebilir. Bu nedenle, saldırganlar için cazip bir hedef hâline gelirler. Bir uzantının güvenliği ihlal edilirse bu uzantının tüm kullanıcıları kötü amaçlı ve istenmeyen saldırılara karşı savunmasız kalır. Aşağıdaki uygulamaları kullanarak uzantınızın güvenliğini sağlayın ve kullanıcılarınızı koruyun.

Geliştirici hesaplarını koruma

Uzantı kodu, Google Hesapları üzerinden yüklenir ve güncellenir. Geliştiricilerin hesaplarının güvenliği ihlal edilirse saldırganlar kötü amaçlı kodu doğrudan tüm kullanıcılara gönderebilir. Bu hesapları iki faktörlü kimlik doğrulamayı etkinleştirerek koruyun. Tercihen güvenlik anahtarı kullanın.

Uygun üye rollerini kullanma

Yayıncınızın birden fazla üyesi varsa her kullanıcıya verilen rolün uygun olduğundan emin olun.

HTTP'yi hiçbir zaman kullanma

Veri isterken veya gönderirken HTTP bağlantısı kullanmayın. Tüm HTTP bağlantılarının dinleneceğini veya değiştirileceğini varsayın. HTTPS, çoğu ortadaki adam saldırısını engelleyen yerleşik güvenlik özelliklerine sahip olduğundan her zaman tercih edilmelidir.

Minimum izinleri isteyin

Chrome Tarayıcı, bir uzantının manifest dosyasında açıkça istenen ayrıcalıklara erişimini sınırlar. Uzantılar, yalnızca bağımlı oldukları API'leri ve web sitelerini kaydederek izinlerini en aza indirmelidir.

Bir uzantının ayrıcalıklarını sınırlamak, olası bir saldırganın yararlanabileceği şeyleri sınırlar.

Çapraz kaynak fetch()

Uzantılar, uzantıdan ve izinlerde belirtilen alanlardan kaynak almak için yalnızca fetch() ve XMLHttpRequest() kullanabilir. Her ikisine yapılan çağrıların, hizmet çalışanındaki fetch işleyici tarafından yakalandığını unutmayı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
}

Yukarıdaki örnekte yer alan bu uzantı, izinler bölümünde "https://developer.chrome.com/*" ve "https://*.google.com/*" listelenerek developer.chrome.com'daki her şeye ve Google'ın alt alanlarına erişim isteğinde bulunuyor. Uzantı güvenliği ihlal edilse bile yalnızca eşleşme kalıbını karşılayan web siteleriyle etkileşim kurma izni olur. Saldırganın "https://user_bank_info.com"'ya erişme veya "https://malicious_website.com" ile etkileşime girme olanağı sınırlı olur.

Manifest alanlarını sınırlama

Manifeste gereksiz anahtarlar ve izinler eklemek güvenlik açıkları oluşturur ve uzantıyı daha görünür hale getirir. Manifest alanlarını, uzantının kullandığı alanlarla sınırlayın.

Harici olarak bağlanılabilir

Uzantının hangi harici uzantılar ve web sayfalarıyla bilgi alışverişinde bulunacağını bildirmek için "externally_connectable" alanını kullanın. Uzantının harici olarak bağlanabileceği kişileri güvenilir kaynaklarla kısıtlayın.

{
  "name": "Super Safe Extension",
  "externally_connectable": {
    "ids": [
      "iamafriendlyextensionhereisdatas"
    ],
    "matches": [
      "https://developer.chrome.com/*",
      "https://*.google.com/*"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

Web'de erişilebilen kaynaklar

"web_accessible_resources" bölümünde kaynakları web üzerinden erişilebilir hale getirmek, uzantının web siteleri ve saldırganlar tarafından algılanmasına neden olur.

{
  ...
  "web_accessible_resources": [
    {
      "resources": [ "test1.png", "test2.png" ],
      "matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
    }
  ]
  ...
}

Web'de erişilebilen kaynakların sayısı arttıkça potansiyel saldırganların yararlanabileceği yollar da artar. Bu dosyaları en aza indirin.

Açık bir içerik güvenliği politikası ekleyin

Siteler arası komut dosyası çalıştırma saldırılarını önlemek için manifest dosyasında uzantıya yönelik bir içerik güvenliği politikası ekleyin. Uzantı yalnızca kendi kaynaklarını yüklüyorsa aşağıdakileri kaydedin:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
   "content_security_policy": {
    "extension_pages": "default-src 'self'"
  },
  "manifest_version": 3
}

Uzantının web assembly kullanması veya korumalı alan sayfalarındaki kısıtlamaları artırması gerekiyorsa uzantı şu şekilde eklenebilir:

{
  "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
}

document.write() ve innerHTML'den kaçının

document.write() ve innerHTML ile HTML öğelerini dinamik olarak oluşturmak daha kolay olsa da bu durum, uzantıyı ve uzantının bağlı olduğu web sayfalarını saldırganların kötü amaçlı komut dosyaları eklemesine açık bırakır. Bunun yerine, DOM düğümlerini manuel olarak oluşturun ve dinamik içerik eklemek için innerText kullanın.

function constructDOM() {
  let newTitle = document.createElement('h1');
  newTitle.innerText = host;
  document.appendChild(newTitle);
}

İçerik komut dosyalarını dikkatli kullanma

İçerik komut dosyaları izole edilmiş bir dünyada bulunsa da saldırılara karşı bağışık değildir:

  • İçerik komut dosyaları, bir uzantının doğrudan web sayfasıyla etkileşime giren tek kısmıdır. Bu nedenle, saldırgan web sayfaları, içerik komut dosyasının bağlı olduğu DOM'un bölümlerini değiştirebilir veya adlandırılmış öğeler gibi şaşırtıcı web standardı davranışlarından yararlanabilir.
  • İçerik komut dosyalarının, web sayfalarının DOM'uyla etkileşimde bulunabilmesi için web sayfasıyla aynı oluşturma işleminde yürütülmesi gerekir. Bu durum, içerik komut dosyalarını yan kanal saldırıları (ör. Spectre) aracılığıyla veri sızdırmaya ve kötü amaçlı bir web sayfası oluşturma işlemini tehlikeye atarsa saldırgan tarafından ele geçirilmeye karşı savunmasız hale getirir.

Hassas verilerin (ör. kullanıcının özel bilgileri) veya tarayıcının işlevlerine erişimi olan Chrome API'lerinin kullanıldığı işlemler, uzantıların hizmet çalışanında gerçekleştirilmelidir. Uzantı ayrıcalıklarını içerik komut dosyalarına yanlışlıkla göstermeyin:

Girişleri kaydetme ve temizleme

Dinleyicileri yalnızca uzantının beklediği şeylerle sınırlayarak, gelen verilerin gönderenlerini doğrulayarak ve tüm girişleri temizleyerek bir uzantıyı kötü amaçlı komut dosyalarından koruyun.

Bir uzantı, yalnızca harici bir web sitesinden veya uzantıdan iletişim bekliyorsa runtime.onMessageExternal için kaydolmalıdır. Gönderenin güvenilir bir kaynakla eşleştiğini her zaman doğrulayın.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

browser.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

Uzantının kendisinden gelen runtime.onMessage etkinliği aracılığıyla gönderilen mesajlar bile MessageSender'ın güvenliği ihlal edilmiş bir content script'ten gelmediğinden emin olmak için dikkatlice incelenmelidir.

browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.allowedAction)
    console.log("This is an allowed action.");
});