Skip to content

Pixel Thief: Exploiting SVG Filter Leakage in Firefox and Chrome

Browser SVG-filter rendering'indeki data-bağımlı memory erişimlerini okumak için bir CPU cache side channel (yalnızca wall-clock timing değil) kullanan bir pixel-stealing saldırısı; ~267 bit/sn sızdırır — ekran refresh hızından daha hızlı.

Mechanism

Bug sınıfı / invariant

SVG filter'lar bir page'in, bir iframe içine gömülü cross-origin içerik dahil, içeriğe pixel-işleme operasyonları uygulamasına izin verir. Leakage-free kalmak için browser'lar yıllarca filter timing'i content-independent yaptı (ör. CVE-2017-5407'in arkasındaki subnormal-float yavaşlamasını kaldırarak).

Pixel Thief bu düzeltmelerin yetersiz olduğunu gösterir çünkü daha derin bir invariant ihlal edilir: wall-clock time sabit olsa bile, filter'ın memory access pattern'i hâlâ data-bağımlıdır. feComponentTransfer filter'ı, erişilen adresleri dönüştürülen pixel değerine bağlı olan table/array lookup'lar yapar. Bu erişimler CPU cache'inde, eş-konumlu (co-resident) web-tabanlı bir attacker'ın gözlemleyebileceği bir ayak izi bırakır.

Geçilen sınır same-origin policy'dir: bir cross-origin iframe üzerine bir filter render ederek ve filter rutininin memory erişimlerini izlemek için bir cache side channel (ör. browser içinde bir eviction/Prime+Probe tarzı veya cache-template primitive'i) kullanarak, attacker okumasına izin verilmeyen içeriğin tek tek pixel renklerini recover eder — ve bunu ekran frame'i başına birden çok bit ile yapar.

Walkthrough

USENIX Security 2024 paper'ından kavramsal yeniden üretim (O'Connell, Aben Sour, Magen, Genkin, Oren, Shacham, Yarom).

  1. Victim'i cross-origin göm. Hedef içeriği (bir cross-origin page, ya da history sniffing için visited-link stillemesi) attacker page'indeki bir iframe'e yükle.

  2. Data-bağımlı bir filter uygula. SVG filter'ları öyle istifle ki bir hedef pixel'in rengi, memory access address'i pixel değerine bağlı olan bir feComponentTransfer lookup'ını sürsün.

<filter> ... <feComponentTransfer> ... </filter>   # access pattern depends on pixel
  1. Bir cache side channel ile casusluk yap. Tüm render'ı timing yerine, attacker, bir frame sırasında filter rutininin hangi memory line'larına dokunduğunu tespit eden bir JavaScript cache side channel çalıştırır, kaba wall-clock farklarına dayanmadan pixel değerinin bit'lerini recover eder.

  2. Yeniden inşa et. Gömülü page'den metin veya görüntüleri yeniden kurmak, ya da history sniffing için visited-link render'ını test etmek üzere pixel'ler/ frame'ler boyunca tekrarla. Cache channel refresh başına birden çok bit verir, toplamda ~267 bit/sn — önceki wall-clock SVG saldırılarından ve ekran refresh hızının kendisinden daha hızlı.

Warning

Yalnızca kavramsal. Tam filter zinciri, cache primitive'i ve bit-recovery pipeline'ı atlanmıştır; yetkili araştırma için paper'a bakın.

Detection

  • Page-içerik sezgileri: cross-origin iframe'lere SVG filter (özellikle feComponentTransfer) uygulayan ve bunu JS'te yüksek çözünürlüklü cache-timing döngüleriyle birleştiren page'ler şüphelidir. Browser/extension politikası bu kombinasyonu işaretleyebilir.
  • Davranışsal telemetri: güvenilmeyen page'lerde sürekli frame-başına timing/ ölçüm döngüleri, SharedArrayBuffer-tabanlı timer'lar veya eviction-set hammering.
  • Renderer enstrümantasyonu: filtrelenmiş bir cross-origin subtree'nin frame ritminde anormal tekrarlı yeniden render edilmesi.
  • website-fingerprinting tespitiyle örtüşür — yüksek çözünürlüklü timer'lar kuran ve cache state'i prob'layan JS'e dikkat et.

Mitigation

  • Browser yamaları: Firefox ve Chrome bilgilendirildi; vendor düzeltmeleri filter render yolunu sertleştirir ki memory-access pattern'leri pixel-bağımlı olmasın (constant-access-pattern / data-oblivious filtering).
  • Cross-origin filtreleme'yi kısıtla: cross-origin içeriğe uygulanan SVG filter'larını yasakla veya sandbox'la; bu SOP-ihlali sınıfı için yapısal düzeltmedir.
  • Timer/cache-channel çözünürlüğünü düşür: JS timer'larını kabalaştır, SharedArrayBuffer/yüksek çözünürlüklü timer'ları cross-origin isolation arkasına al ve jitter ekle — cache açığa çıkarma tarafını köreltir.
  • Özellikle history sniffing için: visited ve unvisited link'ler arasındaki gözlemlenebilir stilleme farklarını sınırla.

References