Güvende kalın

Tarayıcılarda özel ayrıcalıklara erişimi olan uzantılar, saldırganlar için cazip bir hedef haline gelir. Bir uzantının güvenliği ihlal edilirse bu uzantının her kullanıcısı kötü niyetli ve istenmeyen saldırılara karşı savunmasız hale gelir. Bu uygulamaları benimseyerek uzantının güvenliğini ve kullanıcılarını koruyun.

Geliştirici hesaplarını koruma

Uzantı kodu Google Hesapları üzerinden yüklenip güncellenir. Geliştiricilerin hesaplarının güvenliği ihlal edilirse saldırgan, doğrudan tüm kullanıcılara kötü amaçlı kod iletebilir. Özel olarak geliştirici hesapları oluşturarak ve tercihen güvenlik anahtarıyla iki faktörlü kimlik doğrulamayı etkinleştirerek bu hesapları koruyun .

Grupları seçici tutun

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

Hiçbir zaman HTTP kullanma

Veri isterken veya gönderirken HTTP bağlantısından kaçının. HTTP bağlantılarının gizli gözetlemeler veya değişiklikler içereceğini varsayın. Çoğu ortadaki adam saldırısını atlatmaya çalışan yerleşik güvenlik özellikleri olduğundan HTTPS her zaman tercih edilmelidir.

Minimum düzeyde izin isteme

Chrome tarayıcı, bir uzantının manifest'te 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 minimumda tutulmalıdır.

Uzantı ayrıcalıklarının sınırlanması, potansiyel bir saldırganın kötüye kullanabileceklerini sınırlandırır.

Kaynaklar arası XMLHttpRequest

Bir uzantı, kendisinden ve izinlerde belirtilen alanlardan kaynak almak için yalnızca XMLHttpRequest işlevini kullanabilir.

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

Bu uzantı, izinlerde "/*" ve "https://*google.com/" öğelerini listeleyerek developer.chrome.com ve Google'ın alt alan adlarındaki her şeye erişim istiyor. Uzantının güvenliği ihlal edilmiş olsa bile, yalnızca eşleşme kalıbını karşılayan web siteleriyle etkileşim kurma izni olur. Saldırgan, "https://user_bank_info.com" hizmetine erişemez veya "https://malicious_website.com" ile etkileşim kuramaz.

Manifest alanlarını sınırla

Manifest'e gereksiz kayıtların eklenmesi, güvenlik açıkları oluşturur ve bir uzantının daha görünür olmasını sağlar. Manifest alanlarını uzantının kullandığı alanlarla sınırlandırın ve belirli alan kaydı izni verin.

Harici olarak bağlanabilir

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

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

Web'den erişilebilen kaynaklar

web_accessible_resources ile kaynakları web tarafından erişilebilir hale getirmek, uzantıyı web siteleri ve saldırganlar tarafından tespit edilebilir hale getirir.

{
  ...
  "web_accessible_resources": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

Web'e erişilebilir kaynaklar ne kadar fazla olursa potansiyel saldırganlar o kadar çok istismar edebilir. Bu dosyaları en az sayıda tutun.

Uygunsuz içerik güvenlik politikası ekleme

Siteler arası komut dosyası çalıştırma saldırılarını önlemek için manifest dosyasına bir içerik güvenliği politikası ekleyin. Uzantı yalnızca kendi içindeki kaynakları 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 makinelerden komut dosyaları içermesi gerekiyorsa bunlar 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
}

Yürütülebilir API'lerden kaçının

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

document.write() ve nerHTML

document.write() ve innerHTML ile HTML öğelerini dinamik olarak oluşturmak daha kolay olabilse de bu işlem, uzantıda ve uzantının kullandığı web sayfalarında kötü amaçlı komut dosyaları yerleştiren saldırganlara açıktır. Bunun yerine, manuel olarak DOM düğümleri oluşturun ve dinamik içerik eklemek için innerText politikasını kullanın.

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

eval()

Saldırıları önlemek için mümkün olduğunda eval() kullanmaktan kaçının. eval(), kendisine aktarılan tüm kodları (kötü amaçlı olabilecek) yürütür.

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 bir dünyada yaşasa da saldırılara karşı bağışık değildir:

  • İçerik komut dosyaları, uzantıların web sayfasıyla doğrudan etkileşime giren tek bölümüdür. Bu nedenle, saldırgan web sayfaları içerik komut dosyasının kullandığı DOM'un bazı bölümlerini değiştirebilir veya adlandırılmış öğeler gibi şaşırtıcı web standardı davranışları kötüye kullanabilir.
  • Web sayfalarının DOM'si ile etkileşim kurmak için içerik komut dosyalarının 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) ve kötü amaçlı bir web sayfası oluşturucu işleminin güvenliğini ihlal ederse saldırgan tarafından ele geçirilebilir.

Hassas işler, uzantının arka plan komut dosyası gibi özel bir işlemde gerçekleştirilmelidir. Uzantı ayrıcalıklarını içerik komut dosyalarına yanlışlıkla ifşa etmekten kaçının:

Girişleri kaydedin ve temizleyin

İşleyicileri yalnızca uzantının beklediğiyle sınırlandırarak, gelen verilerin gönderenlerini doğrulayarak ve tüm girişleri temizleyerek uzantıyı kötü amaçlı komut dosyalarına karşı koruyun.

Bir uzantı, yalnızca harici bir web sitesinden veya uzantıdan iletişim bekliyorsa runtime.onRequestExternal'e 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 runtime.onMessage etkinliği aracılığıyla gelen mesajlar bile, MessageSender'in güvenliği ihlal edilmiş bir içerik komut dosyasından olmadığından 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 kendisinden ve onaylanmış kaynaklardan olsa bile temizleyerek bir uzantının saldırganın komut dosyasını çalıştırmasını önleyin. Yürütülebilir API'lerden kaçının.

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