Uzantıların tarayıcı içinde özel ayrıcalıklara erişimi vardır, bu nedenle saldırganlar için cazip bir hedeftir. Bir uzantının güvenliği ihlal edilirse bu uzantının her kullanıcısı kötü niyetli ve istenmeyen izinsiz girişlere karşı savunmasız hale gelir. Bu uygulamaları benimseyerek uzantıları güvende tutun 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 bir saldırgan, doğrudan tüm kullanıcılara kötü amaçlı kod iletebilir. Tercihen bir güvenlik anahtarı ile iki faktörlü kimlik doğrulamayı etkinleştirerek bu hesapları koruyun.
Grupları seçmeye özen gösterin
Grup yayıncılığı 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ı kullanmaktan kaçının. HTTP bağlantılarının gizlice dinleme yapanlara veya değişiklikler içereceğini varsayın. Çoğu ortadaki adam saldırısını atlatmaya yarayan yerleşik güvenlik özelliğine sahip olduğundan HTTPS her zaman tercih edilmelidir.
Minimum düzeyde izin isteyin
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.
Bir uzantının ayrıcalıklarını sınırlamak, potansiyel bir saldırganın kötüye kullanabileceği şeyleri sınırlandırır.
Kaynaklar arası getirme()
Bir uzantı, uzantıdan ve izinlerde belirtilen alan adlarından kaynak almak için yalnızca fetch()
ve XMLHttpRequest()
öğelerini kullanabilir. Her ikisine de yapılan çağrıların, Service Worker'daki fetch işleyicisi tarafından engellendiğini 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ı, izinlerde "https://developer.chrome.com/*"
ve "https://*.google.com/*"
öğelerini listeleyerek developer.chrome.com ve Google alt alan adlarındaki her şeye erişim istiyor. Uzantının güvenliği ihlal edilmiş olsa bile uzantının yalnızca eşleşme kalıbına uyan web siteleriyle etkileşim kurma izni olur. Saldırganın yalnızca "https://user_bank_info.com"
erişimi veya "https://malicious_website.com"
ile etkileşim kurma kapasitesi sınırlıdır.
Manifest alanlarını sınırla
Manifest'e gereksiz anahtarların ve izinlerin eklenmesi, güvenlik açıkları oluşturur ve uzantıları daha görünür hale getirir. Manifest alanlarını uzantının temel aldığı alanlarla sınırlayın.
Harici olarak bağlanabilir
Uzantının hangi harici uzantılarla ve web sayfalarıyla bilgi alışverişinde bulunacağını bildirmek 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://developer.chrome.com/*",
"https://*.google.com/*"
],
"accepts_tls_channel_id": false
},
...
}
Web'den erişilebilen kaynaklar
Kaynakları "web_accessible_resources"
altında web üzerinden erişilebilir hale getirmek uzantıyı web siteleri ve saldırganlar tarafından algılanabilir hale getirir.
{
...
"web_accessible_resources": [
{
"resources": [ "test1.png", "test2.png" ],
"matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
}
]
...
}
Web'in erişebileceği kaynaklar arttıkça potansiyel bir saldırganın yararlanabileceği alan sayısı da o kadar artar. Bu dosyaları minimumda tutun.
Uygunsuz içerik güvenliği politikası ekleme
Siteler arası komut dosyası çalıştırma saldırılarını önlemek için manifest'e bir içerik güvenliği politikası ekleyin. Uzantı yalnızca kendi kaynağından kaynakları 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 derlemesi kullanması veya korumalı alandaki sayfalarda kısıtlamaları artırması gerekiyorsa uzantılar 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 kullanmaktan kaçının
document.write()
ve innerHTML
ile dinamik olarak HTML öğeleri oluşturmak daha kolay olsa da, bu işlem uzantıyı ve uzantının kullandığı web sayfalarını, saldırgan komut dosyaları yerleştiren saldırganlara açık hale getirir. Bunun yerine, DOM düğümlerini manuel olarak 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);
}
İçerik komut dosyalarını dikkatli kullanın
İçerik komut dosyaları yalnız bir dünyada yaşasa da saldırılardan etkilenmez:
- İçerik komut dosyaları, bir uzantının doğrudan web sayfasıyla etkileşime giren tek parçasıdır. Bu nedenle, saldırgan web sayfaları, içerik komut dosyasının dayalı olduğu DOM'un bazı bölümlerine müdahale edebilir 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şimde bulunmak 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 tehlikeye attığında saldırgan tarafından ele geçirilebilir.
Hassas veriler (kullanıcının özel bilgileri gibi) veya tarayıcı işlevlerine erişimi olan Chrome API'lerinin kullanıldığı işlemler, uzantının hizmet çalışanı ile gerçekleştirilmelidir. Uzantı ayrıcalıklarını yanlışlıkla içerik komut dosyalarına maruz bırakmayın:
- İçerik komut dosyasından gelen mesajların bir saldırgan tarafından oluşturulmuş olabileceğini varsayın (ör. tüm girişleri doğrulayıp temizleyin ve komut dosyalarınızı siteler arası komut dosyasına karşı koruyun).
- İçerik komut dosyasına gönderilen verilerin web sayfasına sızdırılabileceğini varsayın. İçerik komut dosyalarına hassas veriler (ör. uzantıdan gizli anahtarlar, diğer web kaynaklarından veriler, tarama geçmişi) göndermeyin.
- İçerik komut dosyaları tarafından tetiklenebilecek ayrıcalıklı işlemlerin kapsamını sınırlayın. İçerik komut dosyalarının rastgele URL'lere yapılan istekleri tetiklemesine veya uzantı API'lerine rastgele bağımsız değişkenler aktarmasına izin vermeyin (ör.
fetch()
veyachrome.tabs.create()
yöntemlerine rastgele URL'lerin geçirilmesine izin vermeyin).
Girişleri kaydedin ve temizleyin
İşleyicileri yalnızca uzantının beklediğiyle sınırlayarak, gelen verilerin gönderenlerini doğrulayarak ve tüm girişleri temizleyerek bir uzantıyı kötü amaçlı komut dosyalarına karşı koruyun.
Bir uzantı, yalnızca harici bir web sitesinden veya uzantıdan iletişim kurulmasını bekliyorsa runtime.onMessageExternal
için kaydedilmelidir. Gönderenin güvenilir bir kaynakla eşleştiğini daima 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 iletiler bile, MessageSender'ın 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.");
});