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 her kullanıcısı 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ı saldırıya uğrarsa saldırgan, 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 dinlenildiğini veya değiştirildiğini varsayın. Çoğu ortadaki adam saldırısını engelleyen yerleşik güvenlik özellikleri nedeniyle HTTPS her zaman tercih edilmelidir.

Minimum izinleri isteme

Chrome tarayıcı, 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, potansiyel bir saldırganın yararlanabileceği şeyleri sınırlar.

Kaynaklar arası 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 ihlaline uğrasa bile yalnızca eşleşme kalıbını karşılayan web siteleriyle etkileşim kurma iznine sahip 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

Bildiride gereksiz anahtarlar ve izinler bulundurmak güvenlik açıkları oluşturur ve uzantının daha görünür olmasına neden olur. 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

Kaynakları web üzerinden erişilebilir hale getirmek, "web_accessible_resources" altında 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 ne kadar çok olursa potansiyel saldırganların yararlanabileceği yollar da o kadar 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'te 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 bunlar 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 basit 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 karşı savunmasız 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 kullanın

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

  • İçerik komut dosyaları, bir uzantının web sayfasıyla doğrudan etkileşimde bulunan tek bölümü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şim kurabilmesi için web sayfasıyla aynı oluşturucu 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ı yanlışlıkla içerik komut dosyalarına göstermekten kaçının:

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";

chrome.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 incelenmelidir.

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