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ı korumak için özellikle geliştirici hesapları oluşturun ve tercihen güvenlik anahtarıyla iki faktörlü kimlik doğrulamayı etkinleştirin .

Grupları seçici tutma

Grup yayıncılığı kullanıyorsanız grubu güvenilir geliştiricilerle sınırlı tutun. Bilinmeyen kişilerden gelen üyelik isteklerini kabul etmeyin.

Hiçbir zaman HTTP 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. Rastgele kod en aza indirilmelidir.

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

Kaynaklar arası XMLHttpRequest

Uzantılar, kaynakları yalnızca kendilerinden ve izinlerde belirtilen alanlardan almak için XMLHttpRequest'i kullanabilir.

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "permissions": [
    "/*",
    "https://*.google.com/"
  ],
  "manifest_version": 2
}

Bu uzantı, izinler bölümünde "/*" 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, "https://user_bank_info.com" hizmetine erişemez veya "https://malicious_website.com" ile etkileşime giremez.

Manifest alanlarını sınırlama

Manifeste gereksiz kayıtlar 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 ve belirli alan kaydı verin.

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://*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": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

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": "default-src 'self'"
  "manifest_version": 2
}

Uzantının belirli ana makinelere ait komut dosyaları içermesi gerekiyorsa bu komut dosyaları şu şekilde eklenebilir:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self' https://extension.resource.com"
  "manifest_version": 2
}

Çalıştırılabilir API'lerden kaçının

Kod yürüten API'ler daha güvenli alternatiflerle değiştirilmelidir.

document.write() ve innerHTML

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);
}

eval ()

eval(), kendisine iletilen tüm kodları (kötü amaçlı olabilecek kodlar dahil) yürüteceğinden saldırıları önlemek için mümkün olduğunca eval() kullanmaktan kaçının.

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // WARNING! Might be evaluating an evil script!
    var resp = eval("(" + xhr.responseText + ")");
    ...
  }
}
xhr.send();

Bunun yerine JSON.parse() gibi daha güvenli ve hızlı yöntemleri tercih edin.

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();

İç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 işlemler, uzantının arka plan komut dosyası gibi özel bir süreçte 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.onRequestExternal 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.");
});

Kullanıcı girişlerini ve gelen verileri (uzantının kendisi ve onaylı kaynaklar dahil) temizleyerek bir uzantının saldırganın komut dosyasını yürütmesini engeller. Çalıştırılabilir API'lerden kaçının.

function sanitizeInput(input) {
    return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}