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.
- 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
-
Type check'i mistrain et ki CPU wrong-type arm'a speculate etsin, sonra scalar field'ı leak edilecek address olan bir object ver.
-
Transient dereference + leak. Wrong-type pointer load secret memory'yi getirir; dependent bir access onu flush-reload için cache'e encode eder.
-
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.