Skip to content

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.

  1. 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.

  2. 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
  1. 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/COEP cross-origin isolation'ı).
  • Altta yatan CPU savunmaları (retpoline / eIBRS) in-process JS read'i kaldırmaz; gerçek fix isolation granularity'sidir.

References