Erime/Spectre

Genel Bakış

3 Ocak'ta Project Zero, modern CPU'lardaki bir işlemin, kendisine ait olmayan bellek de dahil olmak üzere rastgele belleği okumak için kullanabileceği güvenlik açıklarını ortaya çıkardı. Bu güvenlik açıkları Spectre ve Meltdown olarak adlandırıldı. Chrome, web'in güvenliğini sağlamak için neler yapıyor ve web geliştiricileri kendi siteleri için neler yapmalı?

Özet

İnternette gezinen bir kullanıcı olarak işletim sisteminizi ve tarayıcınızı güncel tutmanız gerekir. Ayrıca Chrome kullanıcıları Site İzolasyonunu etkinleştirebilir.

Web geliştiriciyseniz Chrome ekibinin önerileri:

  • Mümkün olduğunda, SameSite ve HTTPOnly çerez özelliklerini kullanarak ve document.cookie kaynağından okumaktan kaçınarak çerezlerin oluşturucu işleminin belleğine girmesini engelleyin.
  • Site İzolasyonu'nu etkinleştirmiş kullanıcılar için Kaynak Arasında Okuma Engellemesi'nden en iyi şekilde yararlanmak üzere MIME türlerinizin doğru olduğundan emin olun ve kullanıcıya özel veya hassas içerik barındıran URL'ler için bir X-Content-Type-Options: nosniff başlığı belirtin.
  • Site İzolasyonu'nu etkinleştirin ve sitenizde soruna yol açarsa Chrome ekibine bildirin.

Bu adımların neden faydalı olduğunu merak ediyorsanız okumaya devam edin.

Risk

Bu güvenlik açıklarıyla ilgili çok çeşitli açıklamalar yapıldı. Bu nedenle, başka bir açıklama eklemeyeceğim. Bu güvenlik açıklarının nasıl kötüye kullanılabileceğiyle ilgileniyorsanız Google Cloud ekibindeki iş arkadaşlarımın blog yayınına göz atmanızı öneririm.

Hem Meltdown hem de Spectre, bir sürecin okuması gerekmeyen belleği okumasına olanak tanır. Bazen farklı sitelerdeki birden fazla doküman Chrome'da bir işlemi paylaşabilir. Bu durum, bir sayfa diğerini window.open, <a href="..." target="_blank"> veya iFrame'ler kullanarak açtığında ortaya çıkabilir. Bir web sitesi kullanıcıya özgü veriler içeriyorsa başka bir sitenin bu yeni güvenlik açıklarını kullanarak söz konusu kullanıcı verilerini okuması mümkündür.

Çözümler

Chrome ve V8 mühendislik ekibi, bu tehdidi azaltmak için birden fazla çalışma yürütüyor.

Site İzolasyonu

Spectre'nin başarılı bir şekilde kötüye kullanılmasının etkisi, hassas verilerin hiçbir zaman saldırgan tarafından kontrol edilen kodla bir işlem paylaşmasını önleyerek büyük ölçüde azaltılabilir. Chrome ekibi, bu amaca ulaşmak için "Site İzolasyonu" adlı bir özellik üzerinde çalışıyor:

Site izolasyonu, birkaç bilinen sorun olduğu ve Chrome ekibi mümkün olduğunca fazla saha testi yapmak istediği için henüz varsayılan olarak etkinleştirilmemiştir. Web geliştiriciyseniz Site İzolasyonu'nu etkinleştirmeniz ve sitenizin çalışmaya devam edip etmediğini kontrol etmeniz gerekir. Hemen etkinleştirmek istiyorsanız chrome://flags#enable-site-per-process seçeneğini etkinleştirin. Çalışmayan bir site bulursanız lütfen hata bildirerek bize yardımcı olun ve Site İzolasyonu'nu etkinleştirdiğinizi belirtin.

Siteler Arası Doküman Engelleme

Tüm siteler arası sayfalar ayrı işlemlere yerleştirilmiş olsa bile sayfalar, resim ve JavaScript gibi bazı siteler arası alt kaynakları meşru bir şekilde isteyebilir. Site izolasyonu, hassas bilgilerin sızmasını önlemek için oluşturma işlemine hangi ağ yanıtlarının iletileceğini sınırlayan bir "siteler arası doküman engelleme" özelliği içerir.

Bir web sitesi, sunucudan iki tür veri isteyebilir: "belgeler" ve "kaynaklar". Burada belgeler HTML, XML, JSON ve metin dosyalarıdır. Bir web sitesi, izin verilen CORS başlıklarıyla kendi alanından veya diğer alanlardan belge alabilir. Resimler, JavaScript, CSS ve yazı tipleri gibi öğeler kaynaklara dahildir. Kaynaklar herhangi bir siteden eklenebilir.

Siteler arası doküman engelleme politikası, aşağıdaki durumlarda bir işlemin diğer kaynaklardan "doküman" almasını engeller:

  1. HTML, XML, JSON veya metin/düz MIME türüne sahip olmalıdır ve
  2. X-Content-Type-Options: nosniff HTTP yanıt başlığı veya hızlı bir içerik analizi ("koklama") türü doğrulamalıdır.
  3. CORS, dokümana erişime açıkça izin vermiyor

Bu politika tarafından engellenen dokümanlar işleme boş olarak sunulur ancak istek arka planda gerçekleşmeye devam eder.

Örneğin, bir saldırganın <img src="https://yourbank.com/balance.json"> gibi hassas veriler içeren bir JSON dosyası içeren bir <img> etiketi oluşturduğunu varsayalım. Site yalıtımı olmadan JSON dosyasının içeriği oluşturma işleminin belleğine ulaşır. Bu noktada oluşturma işlemi, geçerli bir resim biçimi olmadığını fark eder ve resim oluşturmaz. Ancak Spectre ile artık bu bellek parçasını okumanın bir yolu var. MIME türü, siteler arası doküman engelleme özelliği tarafından engellendiğinde siteler arası doküman engelleme özelliği, bu dosyanın içeriğinin oluşturucunun çalıştığı işlemin belleğine girmesini engeller.

Kullanıcı metriklerine göre, text/html veya text/plain MIME türleriyle sunulan çok sayıda JavaScript ve CSS dosyası var. Chrome, yanlışlıkla doküman olarak işaretlenen kaynakları engellememek için MIME türünün doğru olduğundan emin olmak amacıyla yanıtı koklamaya çalışır. Bu koku alma işlemi mükemmel değildir. Bu nedenle, web sitenizde doğru Content-Type üstbilgilerini ayarladığınızdan eminseniz Chrome Ekibi, tüm yanıtlarınıza X-Content-Type-Options: nosniff üstbilgisini eklemenizi önerir.

Siteler arası doküman engellemeyi denemek istiyorsanız yukarıda açıklandığı gibi Site İzolasyonunu etkinleştirin.

SameSite çerez

Yukarıdaki <img src="https://yourbank.com/balance.json"> örneğine dönelim. Bu yöntem yalnızca yourbank.com'un kullanıcıyı otomatik olarak oturum açtıran bir çerez depoladığında çalışır. Çerezler genellikle, çerezi ayarlayan web sitesine yapılan tüm istekler için gönderilir. İstek, <img> etiketi kullanan bir üçüncü taraf tarafından yapılmış olsa bile bu durum geçerlidir. SameSite çerezleri, bir çerezin yalnızca aynı siteden gelen bir isteğe ekleneceğini belirten yeni bir özelliktir. Maalesef bu yazı hazırlandığı sırada bu özelliği yalnızca Chrome ve Firefox 58 ve sonraki sürümleri destekliyor.

HTTPOnly ve document.cookie

Sitenizin çerezleri istemci JavaScript'i tarafından değil, yalnızca sunucu tarafında kullanılıyorsa çerezin verilerinin oluşturma işlemine girmesini engellemenin yolları vardır. Chrome gibi desteklenen tarayıcılarda çereze istemci tarafı komut dosyası aracılığıyla erişilmesini açıkça engelleyen HTTPOnly çerez özelliğini ayarlayabilirsiniz. HTTPOnly ayarlaması yapılamıyorsa kesinlikle gerekli olmadığı sürece document.cookie'yi okumayarak yükleme çerez verilerinin oluşturulan işleme maruz kalmasını sınırlayabilirsiniz.

target="_blank" kullanarak başka bir sayfaya bağlantı verdiğinizde, açılan sayfa window nesnenize erişebilir, sayfanızı farklı bir URL'ye yönlendirebilir ve Site İzolasyonu olmadan sayfanızla aynı işlemde olur. Sayfanızın daha iyi korunması için yeni pencerede açılan harici sayfalara giden bağlantılarda her zaman rel="noopener" belirtilmelidir.

Yüksek çözünürlüklü zamanlayıcılar

Meltdown veya Spectre'den yararlanmak isteyen bir saldırganın, bellekten belirli bir değeri okumanın ne kadar sürdüğünü ölçmesi gerekir. Bunun için güvenilir ve doğru bir zamanlayıcı gerekir.

Web platformunun sunduğu API'lerden biri, 5 mikrosaniye doğrulukla çalışan performance.now() API'sidir. Bu sorunun önüne geçmek için tüm büyük tarayıcılar, saldırıların yapılmasını zorlaştırmak amacıyla performance.now()'ün çözünürlüğünü düşürdü.

Yüksek çözünürlüklü bir zamanlayıcı elde etmenin bir diğer yolu da SharedArrayBuffer kullanmaktır. Tampon, bir çalışan tarafından sayacı artırmak için kullanılır. Ana iş parçacığı bu sayacı okur ve zamanlayıcı olarak kullanır. Diğer azaltıcı önlemler uygulanana kadar tarayıcılar şu anda SharedArrayBuffer'ı devre dışı bırakmaya karar verdi.

V8

Spectre'den yararlanmak için özel olarak hazırlanmış bir CPU talimatı dizisi gerekir. V8 ekibi, bilinen saldırı kavram kanıtları için azaltıcı önlemler uyguladı ve optimize edici derleyicileri TurboFan'da, bu saldırılar tetiklendiğinde bile oluşturulan kodun güvenli olmasını sağlayacak değişiklikler üzerinde çalışıyor. Ancak bu kod oluşturma değişiklikleri performansta düşüşe neden olabilir.

Web'in güvenliğini sağlama

Spectre ve Meltdown'un keşfi ve bu keşfin sonuçları konusunda çok fazla belirsizlik vardı. Bu makalenin, Chrome ve V8 ekiplerinin web platformunu güvende tutmak için neler yaptığına ve web geliştiricilerin mevcut güvenlik özelliklerini kullanarak nasıl yardımcı olabileceğine dair bazı bilgiler verdiğini umuyoruz. Sorularınız varsa Twitter üzerinden benimle iletişime geçebilirsiniz.