Straight-Line Speculation (SLS)¶
Bir Arm processor, gerçek target çözülmeden önce, control flow'daki unconditional bir değişikliğin (RET, BR, BLR, ERET, exception üreten instruction'lar) linear olarak ardından gelen instruction'ları speculative olarak çalıştırabilir; orada bir Spectre revelation gadget'ı bulunursa secret'lar cache timing üzerinden leak eder. Arm CVE-2020-13844 atadı.
Mechanism¶
Execution'ın unconditional bir branch'i neden düz geçtiği
Arm architecture'ı, implementation'ların performansı maksimize edebilmesi
için çoğu instruction'ı bilerek speculate edilebilir bırakır. Bir
unconditional control-flow değişikliği için sıradaki architectural
instruction memory'de onu izleyen instruction değildir — ama front-end
gerçek target'ı henüz bilmiyor olabilir. Google SafeSide araştırmasını takip
eden Arm, bir core'un böyle bir transfer'ın hemen ardından gelen
instruction'ları speculative olarak çalıştırabileceğini belgeler:
unconditional direct branch'ler (B, BL), unconditional indirect
branch'ler (BR, BLR), function return'leri (RET), exception return'leri
(ERET) ve exception üreten instruction'lar (SVC, HVC, SMC, UNDEF,
BRK). Arm buna straight-line speculation der ve CVE-2020-13844
tahsis etti. Boundary, bu fall-through kodu bir Spectre revelation gadget'ı
olduğunda kırılır: adversary'nin etkilediği data'yı yükleyen ve onu memory'yi
index'lemek için kullanan, timing analizinin kurtarabileceği "secret'lara
işaret eden" bir cache state bırakan bir dizi. Spectre v1/v2'nin aksine bu,
bir condition'ın ya da target'ın misprediction'ına ihtiyaç duymaz — leak,
control'ü yeniden yönlendirmesi gereken bir transfer'ı geçen düz sequential
fetch üzerine biner.
Walkthrough¶
Hazard, tamamen bir transfer'ın memory'de fiziksel olarak ardından gelen şeyle ilgilidir.
Return into a revelation gadget (Arm whitepaper'ından)
Arm'ın açıklayıcı kernel durumu: bir routine, general-purpose register'lar hâlâ EL0 (user) controlled data tutarken caller'ına return eder:
RET
LDR Xa, [Xb] ; Xb is user-controlled
AND Xa, Xa, #0xFFFF
LDR Xc, [Xd, Xa] ; Xd user-controlled -> secret-dependent access
Architectural olarak control RET'te ayrılır; speculative olarak core
LDR/AND/LDR dizisini çalıştırabilir ve Xb/Xd'yi seçen bir EL0
attacker'ı bunu kernel memory üzerinde bir cache-timing oracle'ına dönüştürür.
Aynı şekil, callee address çözülmeden önce çağrının past'indeki load'un
çalıştığı BLR (indirect call) sonrasında da geçerlidir.
Yalnızca kavramsal
Bu tür gadget'ların nadir ve exploit edilmesi zor olması beklenir ve bazıları zaten Spectre v1 hardening tarafından kaldırıldı. Bu entry, çalışan bir gadget'ın nasıl bulunacağı ya da zincirleneceği değil, speculation window'unun neden var olduğu seviyesinde kalır.
Detection¶
- Static / binary analysis. Compiled image'leri, araya giren bir speculation
barrier olmadan
RET,BR,BLRya daERET'in hemen ardından yerleştirilmiş load'lar ya da secret-dependent memory access'leri için tara — bir SLS-exposed gadget'ının yapısal imzası. Hot binary'lerin-mharden-slsile build edildiğini doğrulamak pratik "kapsanıyor muyuz" check'idir. - Sınırlı runtime sinyali. SLS, end channel'ı diğer Spectre varyantlarıyla (cache timing) paylaşır, bu yüzden host detection'ı SLS'e özgü bir telemetry kaynağı yerine aynı gürültülü cache-side-channel heuristic'lerine dayanır; kalıcı kontrol runtime alerting değil, build-time hardening'idir.
Mitigation¶
- Transfer'lardan sonra speculation barrier'ları. Arm, threat modelling'in
gerektirdiği yerde
RET/BR/ERET'in hemen ardından birSB(Armv8.0-SB) ya da birDSB+ISBdizisi yerleştirmeyi önerir. Execution'ın fall through yapması beklenmediği için barrier genellikle architectural olarak çalıştırılmaz ve yalnızca code density'ye mal olur. - Compiler hardening. GCC ve LLVM, bu barrier'ları otomatik olarak eklemek
için
-mharden-sls=(örneğinall,retbr,blr) ekledi;BLR, bir barrier ile takip edilen birBL+BRthunk'ı olarak yeniden yazılabilir. - Kapsam. Mechanism'de sayılan transfer'lar, fall-through speculation'ın
architectural olarak mümkün olduğu yerlerdir; ancak Arm, whitepaper'da
gösterilebilir (demonstrable) SLS'i yalnızca
RET/BR/BLR'ı geçerek üretebildiğini belirtir. Arm ayrıca birBya daBL'i geçen SLS gösteremediğini, bu yüzden bunları barrier'sız güvenli kabul ettiğini söyler; bu nedenle compiler mitigation'ları (-mharden-sls=retbr,blr) ve pratik hardeningRET/BR/BLR'a odaklanır. Code bloat'ı sınırlamak için threat model'e göre seçici uygula.