Uzantılar, tarayıcıda özel ayrıcalıklara erişebildiğinden saldırganlar için cazip bir hedeftir. Bir uzantının güvenliği ihlal edilirse bu uzantıyı kullanan her kullanıcı, kötü amaçlı ve istenmeyen saldırılara karşı savunmasız hale gelir. Bu uygulamaları kullanarak uzantıların ve kullanıcılarının güvenliğini sağlayın.
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 doğrudan tüm kullanıcılara kötü amaçlı kod gönderebilir. Tercihen bir güvenlik anahtarı ile iki faktörlü kimlik doğrulamayı etkinleştirerek bu hesapları koruyun.
Grupların seçici olmasını sağlayın
Grup yayıncılığı kullanıyorsanız grubu güvenilir geliştiricilerle sınırlı tutun. Bilinmeyen kişilerden gelen üyelik isteklerini kabul etmeyin.
HTTP'yi hiçbir zaman kullanmayın
Veri isteğinde bulunurken veya veri gönderirken HTTP bağlantısı kullanmayın. Tüm HTTP bağlantılarında dinleyiciler olacağını veya değişiklikler içereceğini varsayın. Çoğu ortadaki adam saldırısını atlatan yerleşik bir güvenlik özelliğine sahip olduğu için HTTPS her zaman tercih edilmelidir.
Minimum izin iste
Chrome tarayıcı, uzantıların erişimini manifest açıkça istenen ayrıcalıklarla sınırlandırır. Uzantılar, yalnızca kullandıkları API'leri ve web sitelerini kaydederek izinlerini en aza indirmelidir.
Bir uzantının ayrıcalıklarının sınırlandırılması potansiyel bir saldırganın kötü amaçla kullanabileceği alanları kısıtlar.
Kaynaklar arası fetch()
Bir uzantı, uzantıdan ve izinlerde belirtilen alanlardan kaynak almak için yalnızca fetch()
ve XMLHttpRequest()
kullanabilir. Her iki çağrının da hizmet çalışanındaki fetch işleyicisi 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 örnekteki uzantı, izinler bölümünde "https://developer.chrome.com/*"
ve "https://*.google.com/*"
'ü listeleyerek developer.chrome.com ve Google'ın alt alanlarındaki her şeye erişim istiyor. Uzantı güvenliği ihlal edilmiş olsa bile yalnızca eşleşme kalıbını karşılayan web siteleriyle etkileşime girme izni olur. Saldırgan yalnızca "https://user_bank_info.com"
'e erişebilir veya "https://malicious_website.com"
ile etkileşim kurabilir.
Manifest alanlarını sınırlama
Manifest dosyasına 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ırlandırın.
Harici olarak bağlanabilir
Uzantıları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ıların harici olarak güvenilir kaynaklarla kimlerle bağlantı kurabileceğini 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 tarafından erişilebilen kaynaklar
Kaynakları "web_accessible_resources"
altında web'den 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'den erişilebilir kaynaklar ne kadar fazla olursa potansiyel bir saldırgan da o kadar çok fırsattan yararlanabilir. 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 dosyasına eklenti için 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 derlemesini kullanması veya korumalı sayfalardaki 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, uzantıyı ve uzantının bağlı olduğu web sayfalarını kötü amaçlı komut dosyaları ekleyen saldırganlara 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 kullanın
İçerik komut dosyaları tecrit edilmiş bir dünyada yer alsa da saldırılara karşı bağışık değildir:
- İçerik komut dosyaları, bir uzantının doğrudan web sayfasıyla etkileşime geçen tek parçasıdır. Bu nedenle, kötü niyetli 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şime geçmesi için web sayfasıyla aynı oluşturma sürecinde 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 sürecini ihlal ederse bir saldırgan tarafından ele geçirilme riskine karşı savunmasızdır.
Hassas verileri (ör. kullanıcının gizli bilgileri) veya tarayıcının işlevlerine erişimi olan Chrome API'lerini kullanan işlemler, uzantıların hizmet işçisinde gerçekleştirilmelidir. Uzantı ayrıcalıklarının içerik komut dosyalarına yanlışlıkla gösterilmesini önleyin:
- İçerik komut dosyasındaki mesajların bir saldırgan tarafından oluşturulmuş olabileceğini varsayalım (ör. tüm girişleri doğrulayıp temizleyin ve komut dosyalarınızı siteler arası komut dosyası çalıştırmaya karşı koruyun).
- İçerik komut dosyasına gönderilen tüm verilerin web sayfasına sızabileceğini varsayın. İçerik komut dosyalarına hassas veriler (ör. uzantıdaki gizli veriler, diğer web kaynaklarından gelen 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 istemleri rastgele URL'lere tetiklemesine veya uzantı API'lerine rastgele bağımsız değişkenler iletmesine izin vermeyin (ör.
fetch()
veyachrome.tabs.create()
yöntemlerine rastgele URL'ler iletilmesine izin vermeyin).
Girişleri kaydetme ve temizleme
Dinleyicileri 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.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();
});
MessageSender'ın güvenliği ihlal edilmiş bir içerik komut dosyasından gelmediğinden emin olmak için uzantıdan gelen runtime.onMessage etkinliği aracılığıyla gönderilen mesajlar bile incelenmelidir.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});