Skip to content

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, BLR ya da ERET'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-sls ile 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 bir SB (Armv8.0-SB) ya da bir DSB+ISB dizisi 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ğin all, retbr, blr) ekledi; BLR, bir barrier ile takip edilen bir BL+BR thunk'ı 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 bir B ya da BL'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 hardening RET/BR/BLR'a odaklanır. Code bloat'ı sınırlamak için threat model'e göre seçici uygula.

References