Skip to content

Website Fingerprinting (cache)

JavaScript'ten last-level-cache occupancy'sini ölçerek ve sonuçtaki aktivite trace'lerini deep learning ile sınıflandırarak bir victim'in hangi website'i yüklediğini belirleme.

Mechanism

The invariant

Prime+Probe gibi klasik cache saldırıları belirli cache set'lerini hedefler ve doğru olanları bulmak için address-space randomization'ı yenmek zorundadır. Shusterman ve ark. (USENIX Security 2019) tam tersi yolu izler: seçilmiş set'lerdeki conflict'leri çözmek yerine, tüm last-level cache'in toplam occupancy'sini ölçerler. Attacker JavaScript'i LLC boyutunda bir buffer allocate eder ve onu tekrar tekrar sweep eder (okur); tüm buffer'ı sweep etme süresi, kabaca victim'in o anda kaç cache line kullandığıyla orantılıdır, çünkü victim'in erişimleri attacker'ın buffer'ını evict eder. Bir sayfa yüklendikçe, rendering'i, layout'u ve ağ aktivitesi cache occupancy'nin karakteristik bir zaman serisini üretir — bir fingerprint. Channel hassas adreslemeye ihtiyaç duymadığından, memory randomization'a ve Spectre'den sonra getirilen cache-set-targeting savunmalarına karşı robust'tır. Ayrıca kaba timer'ları da tolere eder: bir browser saat çözünürlüğünü kısıtladığında (Tor'un ~100 ms'si), saldırı sweep latency'sini ölçmekten bir timeslot'a kaç tam cache sweep'inin sığdığını saymaka geçer ve sinyali korur. Occupancy trace'i ardından bir neural network tarafından sınıflandırılır.

Walkthrough

Yayımlanan JavaScript metodolojisinin kavramsal yeniden kurgusu.

  1. LLC boyutunda bir buffer allocate et. Tam bir sweep'in tüm cache'e dokunması için onu kabaca last-level cache boyutuna göre boyutlandır.
const LLC_BYTES = 8 * 1024 * 1024;      // ~match target LLC size
const buf = new Uint8Array(LLC_BYTES);
const STRIDE = 64;                       // one access per cache line
  1. Sweep et ve timing'le (high-resolution timer mevcut). Her sweep'in latency'si victim cache basıncını izler:
function sweepLatency() {
  const t0 = performance.now();
  for (let i = 0; i < buf.length; i += STRIDE) buf[i]++;
  return performance.now() - t0;
}
  1. Sweep'leri say (kaba timer, örn. Tor'un 100 ms'si). Saat körken, bir sweep'i timing'lemek yerine bir timeslot içinde kaç tam sweep'in tamamlandığını say:
function sweepsPerSlot(ms = 100) {
  const end = performance.now() + ms; let n = 0;
  while (performance.now() < end) { for (let i = 0; i < buf.length; i += STRIDE) buf[i]++; n++; }
  return n;
}
  1. Victim gezinirken bir trace kaydet, sonra sınıflandır. Occupancy zaman serisi, etiketli site yüklemeleri üzerinde eğitilmiş bir CNN ya da LSTM classifier'a beslenir.

Warning

Occupancy channel'ı, conflict-based saldırılara yönelik savunmalara (randomization, set isolation) dirençlidir ve düşürülmüş çözünürlüklü timer'lardan sağ çıkar; bu yüzden yayımlandığı dönemde hardening yapılmış mainstream browser'larda ve hatta Tor Browser'da etkili kalmıştır.

Beklenen davranış
closed-world, 100 websites, mainstream browsers:
  CNN/LSTM accuracy ~70-90% (reported 72.5% - 91.4% across OS/browser)
Tor Browser (sweep-counting): ~45-47%
open-world (100 sensitive + 5000 non-sensitive): ~70-90%

Detection

Saldırı, memory erişimleri yapan sıradan JavaScript'tir, dolayısıyla meşru workload'lardan ayırt etmek zordur. Heuristic'ler, başka bir tab/process aktifken cache boyutunda buffer'lar allocate edip onları sıkı loop'larda sweep eden sayfaları işaretlemeyi içerir.

Mitigation

  • Yapay cache aktivitesi / noise inject et — yazarlar bunun Tor Browser'da channel'ı önemli ölçüde bozabileceğini ya da ortadan kaldırabileceğini belirtir.
  • Timer'ları kabalaştır ya da jitter ekle (yardımcı olur ama sweep-counting varyantını yenmez).
  • Origin'ler/process'ler arasında cache partitioning.
  • İlgili: cache-occupancy-channel, javascript-prime-probe, prime-probe.

References