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:
- Bir iç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ı çalıştırmaya karşı koruyun).
- İçerik komut dosyasına gönderilen verilerin web sayfasına sızabileceğini varsayın. Hassas verileri (ör. uzantı gizli anahtarları, diğer web kaynaklarından alınan veriler, tarama geçmişi) içerik komut dosyalarına 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şkenleri aktarmasına izin vermeyin (ör. rastgele URL'lerin
fetch
veyachrome.tabs.create
API'ye aktarılmasına izin vermeyin).
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, '&').replace(/</g, '<').replace(/"/g, '"');
}