Cache Speculation Side-channels (Arm whitepaper)¶
Arm'ın temel whitepaper'ı: speculative execution'ın Arm core'larında cache state üzerinden nasıl veri sızdırdığını ve bunu hafifleten CSDB/SB barrier dizilerini anlatır.
Mechanism¶
Speculation cache üzerinden neden sızdırır
Modern Arm core'ları, çözülmemiş branch'lerin ve permission check'lerinin ötesinde instruction'ları speculative olarak çalıştırır. Yanlış spekülasyon yapılırsa speculative iş architectural olarak geri alınır, ama cache üzerindeki microarchitectural yan etkileri persist eder. Arm'ın tarif ettiği temel pattern: bir değer speculative olarak load edilir ve "speculative olarak load edilen değer daha sonra, yine speculative gerçekleştirilebilen ikinci bir load ya da indirect branch için bir adres oluşturmakta kullanılabilir." Bu ikinci access index'i secret'a bağlı olan bir cache line allocate eder. Sonradan cache hit/miss latency'sini ölçebilen bir attacker secret'ı geri kazanır — hızlı = line cache'lenmiş (hit), yavaş = cache'lenmemiş (miss). Architectural rollback cache footprint'ini asla geri almaz, dolayısıyla leak yanlış spekülasyonu atlatarak hayatta kalır.
Whitepaper, speculation tabanlı cache timing channel'larını sayar:
- Variant 1 — bounds-check bypass (CVE-2017-5753): untrusted, out-of-range index'ler privileged koda geçirilir; bu kod bounds check'in ötesini speculative olarak okur ve sonra o data'yı cache'e sızdırır.
- Variant 2 — branch target injection (CVE-2017-5715): düşük ayrıcalıklı kod branch predictor'ı eğitir, böylece yüksek ayrıcalıklı kod attacker'ın seçtiği, bir secret'ı cache timing üzerinden sızdıran bir gadget'ı speculative çalıştırır.
- Variant 3 — rogue data cache load (CVE-2017-5754, "Meltdown"): bu variant köken olarak bir Intel/POWER problemidir; Arm core'larının yalnızca küçük bir altkümesi (örn. Cortex-A75) etkilenir. Etkilenen implementation'larda permission-fault'lu konumlardan yapılan speculative load'lar yine de ileri spekülasyonda kullanılabilir data döndürür; bu da düşük-EL koduna erişilemez bellek okuma imkânı verir. Arm'ın kendi ele aldığı yakın akraba variant, aşağıdaki 3a'dır — bu ikisini birbirine karıştırma.
- Variant 3a — rogue system register read (CVE-2018-3640): Arm'ın açıkça belgelediği ayrı bir variant; speculative olarak okunan sistem register'ları (yalnızca privileged kodun görmesi gereken hardware state) bir side-channel üzerinden sızabilir. Variant 3'ün aksine keyfi bellek değil, register state hedeftir. Etkilenen core'lar için Arm CPU Security Bulletin'e bakılmalıdır.
Walkthrough¶
Variant-1 mitigation'ı, out-of-range path'te untrusted offset'i sıfırlayan bir conditional select'i, Consumption of Speculative Data Barrier yani CSDB ile eşleştirir. CSDB şunu garanti eder: "CSDB'den sonra program order'da görünen, bir branch instruction dışındaki hiçbir instruction, herhangi bir data value prediction'ının sonuçlarını kullanarak speculative çalıştırılamaz."
; AArch64 — bounds-check bypass mitigation
CMP X0, X1 ; X0 = untrusted offset, X1 = limit
BGE out_of_range
CSEL X0, XZR, X0, GE ; force X0 = 0 on the out-of-range path
CSDB ; bar speculation that consumes the predicted X0
LDRB W4, [X5, X0] ; now safe to dereference with X0
; AArch32 equivalent
CMP R0, R1
BGE out_of_range
MOVGE R0, #0 ; conditional move zeroes the offset
CSDB
LDRB R4, [R5, R0]
Arm, bu CSEL/MOV + CSDB kombinasyonunun şu anki ve gelecekteki tüm Arm
implementation'larında problemi ele almak için yeterli olduğunu belirtir. Linux
kernel'inde aynı şey, CSDB dizisini üreten architecture-neutral
nospec/array_index_nospec accessor'ları üzerinden ortaya çıkar.
DSB+ISB ağır el fallback'tir
Conditional-select + CSDB dizisinin eklenemediği yerlerde, bir alternatif,
speculation'ı zorla serialize edip drain eden DSB SYS ardından ISB
kullanmaktır. Arm bunun CSDB'ye göre "muhtemelen çok daha büyük bir performance
etkisine sahip olacağını" belirtir ve yalnızca hafif dizinin pratik olmadığı
durumlarda kullanılmalıdır.
SB instruction'ı (ARMv8.0-SB)
Daha yeni core'lar SB (Speculation Barrier) instruction'ını
implement eder; bu, kendisinden sonraki instruction'ların, kendisinden
önceki speculative execution'dan hesaplanan state kullanılarak speculative
çalıştırılmasını engeller. SB yalnızca ARMv8.0-SB extension'ını implement
eden işlemcilerde mevcuttur; ona sahip olmayan core'lar DSB+ISB dizisine
geri döner. SB, CSDB gibi value-dependent bir barrier'ın geçerli olmadığı,
control flow'un unconditional değişimlerini (örn. bir indirect branch'ten sonra
ulaşılan bir rutinin başlangıcı) korumak için tasarlanmıştır.
Mitigation¶
- Untrusted index'ler üzerindeki bounds check'lerden sonra CSEL/MOV + CSDB
ekle (variant 1); kernel'in
array_index_nospectarzı accessor'larını kullan. - Variant 2 için branch-predictor hardening / invalidation ve indirect-branch kısıtlamaları kullan.
- Variant 3, etkilenen implementation'larda KPTI tarzı kernel/user ayrımıyla ele alınır.
- Control flow'un unconditional değişimleri boyunca speculation'ı engellemek için
mümkünse
SB, değilseDSB SYS+ISBkullan.