Skip to content

Speculative type confusion

Bir branch misprediction'ın victim'i, yanlış type'ta bir değer tutan bir variable ile çalıştırdığı bir Spectre v1 vector'ü — örneğin attacker'ın seçtiği bir integer'ın pointer olarak kullanılması — bunu transient şekilde dereference ederek memory leak'i sağlar.

Mechanism

Note

Spectre v1 genellikle array bounds-check bypass ile özdeşleştirilir, ama Kirzner & Morrison'ın gözlemlediği gibi, victim'in "kodu yanlış çalıştırmasına" yol açan herhangi bir conditional-branch misprediction'ı exploit edebilir. Speculative type confusion (STC) içinde mispredict edilen branch, normalde bir variable'ın type'ını ya da provenance'ını garanti eden branch'tir. Branch mispredict edilirken victim, o variable'ı gerçekte tuttuğundan farklı bir type olarak ele alan bir path çalıştırır — en tehlikelisi, attacker-controlled bir scalar'ı pointer olarak ele alıp dereference etmek. Invariant şu: bir type/tag check'i (bir union tag üzerinde switch, polymorphic kodda bir class/v-table dispatch, typed bir list iterator'da loop-termination check'i) bir conditional branch'tir ve herhangi bir branch gibi mistrain edilebilir ya da ilk çalışmada basitçe mispredict edilebilir. Transient path ardından klasik bir confused-deputy gadget oluşturur — attacker'ın belirlediği bir address'ten okur ve değeri bir covert channel üzerinden leak eder — ama ders kitabındaki array[x] bounds-check pattern'ine benzemez, bu yüzden pattern-matching savunmaları onu kaçırır.

Walkthrough

Kirzner & Morrison, STC'nin iki yolla ortaya çıktığını gösterir: attacker-introduced (eBPF üzerinden) ve compiler-introduced.

  1. Type-guard eden bir branch bul. Bir branch'in bir variable'ın hangi type olduğuna karar verdiği kodu bul, örneğin bir tagged union ya da bir polymorphic dispatch. "Güvenli" architectural path doğru type'ı kullanır; diğer path yanlış olanı kullanırdı.
// Architecturally, when tag==INT the value is a scalar, not a pointer.
// Under misprediction the CPU may transiently take the PTR arm,
// dereferencing an attacker-chosen integer as a pointer.
if (obj->tag == TAG_PTR)
    secret = *(obj->as_ptr);     // transiently reached even when tag==TAG_INT,
                                 // so obj->as_int is dereferenced as an address
else
    secret = obj->as_int;        // architecturally-correct path
  1. Type check'i mistrain et ki CPU wrong-type arm'a speculate etsin, sonra scalar field'ı leak edilecek address olan bir object ver.

  2. Transient dereference + leak. Wrong-type pointer load secret memory'yi getirir; dependent bir access onu flush-reload için cache'e encode eder.

  3. eBPF durumu. Unprivileged bir kullanıcı bir eBPF programı yükler; verifier architectural güvenlik hakkında akıl yürütür ama speculative control flow hakkında değil ve eBPF'in emit ettiği Spectre mitigation'ları yalnızca bounds-check-bypass gadget'larını hedefler — böylece bir STC gadget'ı verification'dan geçer ve kernel context'inde universal bir read primitive verir.

Expected behavior
Class:         Spectre v1 (conditional branch misprediction)
Confusion:     variable used as the WRONG type under misspeculation
               (scalar dereferenced as pointer)
Sources:       attacker-introduced (eBPF), compiler-introduced (C codegen)
Reported:      eBPF universal read ~6.7 KB/s at 99% accuracy (Linux)
Why it evades: not the array[x] pattern; verifier/mitigations miss it
Discovery:     Kasper (VUSec) scans the kernel for such generalized gadgets

Warning

Bir compiler, source code'da hiç olmadığı yerde STC introduce edebilir, bu yüzden "kötü" pattern'ler için manuel audit yapmak sağlam değildir. Yazarlar, kötü kod pattern'lerini statik/manuel olarak belirlemeye dayanan mitigation'ların "yeniden düşünülmesi gerektiği" sonucuna varır.

Detection

VUSec'in Kasper scanner'ı, control'ü (mispredict edilen branch), data'yı (arbitrary güvenlik açıkları üzerinden secret access) ve leakage'i (cache, MDS, port contention) modelleyen taint analysis kullanarak Linux kernel'inde generalized transient-execution gadget'ları bulur — pattern matcher'ların kaçırdığı STC gadget'larını ortaya çıkarır.

Mitigation

Spot düzeltmeler yerine kapsamlı serialization: type-guard eden branch üzerinde speculative load hardening ya da lfence, tam compiler Spectre-mitigation mode'ları (yalnızca bounds-check hardening değil) ve eBPF verifier/JIT'i speculative path'ler hakkında akıl yürütecek şekilde genişletmek. indirect-branch-restricted-speculation gibi geniş kapsamlı kontroller, PHT-driven v1 confusion'ı ele almaz.

References