Spook.js¶
Bir eTLD+1 paylaşan page'lerin aynı renderer process'inde toplandığı durumları exploit ederek Chrome'un Strict Site Isolation'ını yenen, ardından address space boyunca okumak için speculative type confusion kullanan bir JavaScript Spectre attack'ı.
Mechanism¶
Note
Strict Site Isolation, Spectre'ı "fix"lemez; farklı site'ları farklı OS
process'lerine koyarak onu kontrol altına alır, böylece bir renderer
içindeki bir Spectre read yalnızca o site'ın kendi memory'sini görebilir.
Spook.js, o boundary'nin granularity'sine saldırır. Chrome'un isolation
birimi eTLD+1'dir (effective top-level domain artı bir label, örneğin
example.com), tam origin değil. Bir eTLD+1 paylaşan page'ler —
attacker.example.com ve victim.example.com — özellikle Chrome'un
renderer'ları konsolide ettiği memory pressure altında tek bir renderer
process'inde co-locate edilebilir. Co-locate edildiklerinde attacker
JavaScript'i ve victim data'sı bir address space paylaşır ve
spectre-tarzı bir transient read victim'in byte'larına
ulaşabilir. Leak primitive'i speculative type confusion'dır: attacker, JS
engine'i transient şekilde bir object'i yanlış type olarak ele almaya
zorlar, engine'in value/pointer tagging'ini yenerek iki 32-bit değerin
speculative path'in dereference ettiği 64-bit bir pointer'a fuse
edilebilmesini sağlar. Kırılan invariant: site isolation, cross-site data'nın
asla co-reside etmediğini varsayar; eTLD+1 granularity'si artı renderer
konsolidasyonu bunu ihlal eder.
Walkthrough¶
Public paper/site'tan üst düzey; engine'e özgü bir gadget verilmemiştir.
-
Co-location sağla. Victim'i, target ile aynı eTLD+1 altında attacker-controlled içeriği (hosted bir kullanıcı page'i, bir comment widget'ı vb.) açmaya çek ve Chrome'un renderer'ı paylaşması için memory pressure oluştur.
-
Speculative type confusion. JS engine'i transient şekilde mistrain et ki bir object yanlış type olarak access edilsin, architectural path'in reddedeceği out-of-bounds / mistyped bir read versin:
Conceptual logical steps
co-locate: attacker.example.com + victim.example.com -> same renderer
confuse: transiently treat obj as wrong type -> forge 64-bit pointer
read: speculative load [forged_ptr] -> secret byte
encode: secret -> timing of a JS-visible cache/array access
recover: amplified Flush+Reload-style timing in JavaScript
- Encode + recover. Secret, latency'si JavaScript'ten ölçülen bir cache access'i yönlendirir (browser'a uyarlanmış bir flush-reload-tarzı channel) ve byte'ları yeniden inşa eder.
Warning
Gösterilen etki, autofill edilmiş credential'ların, diğer aynı-eTLD+1 page'lerinden data'nın ve — extension mimarisi üzerinden — bir password-manager extension'ının içeriği gibi secret'ların kurtarılmasını içerir. Chromium tabanlı browser'lar (Chrome, Edge, Brave) etkilendi; Firefox/Safari farklı JS engine'leri kullanır.
Detection¶
Güvenilir bir server- ya da host-tarafı detection yoktur: attack tamamen victim'in browser'ında çalışır ve hiçbir architectural iz bırakmaz. Operatörler yalnızca önkoşulları — hassas bir eTLD+1 altında host edilen third-party / kullanıcı tarafından sağlanan içerik — bir detector olarak değil, bir risk göstergesi olarak izleyebilir.
Mitigation¶
- Untrusted içeriği eTLD+1'e göre ayır: kullanıcı tarafından sağlanan ya da third-party kodu ayrı bir registrable domain üzerinde host et (ve Public Suffix List'te custom suffix'ler register et) ki hassas page'lerle asla bir renderer paylaşamasın.
- Chrome Strict Extension Isolation (Chrome 92+) her extension'ı kendi process'ine yerleştirir, extension-leak path'ini kapatır.
- Browser'ı güncel tut; browser'ın gelişen site-isolation ve Spectre
hardening'ine güven (process-per-site iyileştirmeleri, JS-timer
coarsening'i, hassas uygulamalar için
COOP/COEPcross-origin isolation'ı). - Altta yatan CPU savunmaları (retpoline / eIBRS) in-process JS read'i kaldırmaz; gerçek fix isolation granularity'sidir.