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ı dahil ederek 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 güvenlik anahtarıyla iki faktörlü kimlik doğrulamayı etkinleştirerek bu hesapları koruyun.
Grupları seçkin tutun
Grup yayınlama özelliğini 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ı, bir uzantının manifest dosyasında açıkça istenen ayrıcalıklara erişimini sınırlar. Uzantıların, yalnızca bağımlı oldukları API'leri ve web sitelerini kaydederek izinlerini en aza indirmesi gerekir.
Bir uzantının ayrıcalıklarını sınırlandırmak, potansiyel bir saldırganın yararlanabileceği noktaları sınırlandırır.
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'e erişilebilen kaynaklar
"web_accessible_resources"
altındaki kaynakları web'den erişilebilir hale getirmek, uzantının web siteleri ve saldırganlar tarafından algılanabilir hale gelmesine neden olur.
{
...
"web_accessible_resources": [
{
"resources": [ "test1.png", "test2.png" ],
"matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
}
]
...
}
Web'e erişilebilen kaynaklar ne kadar fazlaysa potansiyel bir saldırgan o kadar fazla yöntemden 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ı için web derlemesi kullanılması veya korumalı alanlardaki sayfalar üzerindeki kısıtlamaların artırılması gerekiyorsa aşağıdakiler 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ü amaçlı 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şı daha 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ından gelen mesajların bir saldırgan tarafından hazırlanmış olabileceğini varsayın (ör. tüm girişleri doğrulayın ve temizleyin ve komut dosyalarınızı siteler arası komut dosyasına 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.");
});