Skip to content

Spectre Variant 1 (Bounds Check Bypass) on Arm

Speculative execution'lı Arm core'ları bir bounds-check branch'ini mispredict eder ve transient olarak out-of-bounds data load eder; secret'ları sızdıran bir cache izi bırakır — data-dependent bir speculation barrier ile ele alınabilir.

Mechanism

Bug sınıfı: conditional-branch misprediction bir load'un kendi bounds check'ini bypass etmesine izin verir

Spectre Variant 1 (CVE-2017-5753, "bounds check bypass") architecture-agnostic'tir; fix Arm'a özgü instruction'lar kullandığından Arm kendi rehberini yayımlar. Kanonik pattern, length-guarded bir array access'tir:

if (untrusted_index < array1_size)        // conditional branch
    y = array2[ array1[untrusted_index] * L ];  // dependent loads

Bound'un tutacağını beklemeye mistrain edilmiş branch predictor, core'un untrusted_index >= array1_size olsa bile body'yi speculative olarak execute etmesine izin verir. O transient window boyunca core array1[untrusted_index]'i out of bounds okur ve secret byte'ı array2'yi index'lemek için kullanır, cache'e secret-dependent bir line çeker. Misprediction resolve edildiğinde architectural sonuç atılır — ama cache state kalıcı olur. Ardından array2 üzerinde bir timing side channel secret'ı recover eder.

Kırılan invariant şudur: bir bounds check, koruduğu access'i gate etmelidir. Speculation altında access, check resolve olmadan önce çalışır, dolayısıyla check transient domain'de artık hiçbir şeyi korumaz.

Walkthrough

Yüksek seviyeli kavramsal reprodüksiyon (Arm whitepaper, CVE-2017-5753)

Arm'ın kamuya açık "Cache Speculation Side-channels" whitepaper'ına / Spectre-v1'i software'de ele almasına göre:

  1. conditional branch predictor'ı "in-bounds" yolunu almaya eğitmek için guarded kodu in-bounds index'lerle tekrar tekrar çağır.
  2. array1_size'ı evict et (ya da başka türlü resolution'ını geciktir) ki branch yavaş resolve olsun ve speculation uzun çalışsın.
  3. Malicious bir out-of-bounds index'le bir kez çağır; core secret'ı speculative olarak load eder ve onu probe array'e index olarak kullanır.
  4. Cached line'ı bulmak ve sızdırılan byte'ı çıkarsamak için probe array boyunca erişimleri zamanla.

Arm, düz source-level değişikliklerin yetersiz olduğunu belirtir; bir barrier ya da data-dependent mask gerekir. Burada turnkey bir exploit reprodüks edilmez.

Detection

Spectre-v1 neredeyse hiç architectural iz bırakmaz — channel'a ve koda odaklan

  • Cache side-channel davranışı: strided bir buffer üzerinde sıkı Flush+Reload / probe-and-time loop'ları, tek bir guard değişkeninin tekrarlanan cache eviction'ları (bkz. flush-reload, prime-probe).
  • Branch-mistraining loop'ları: tek bir out-of-bounds index'le takip edilen uzun in-bounds çağrı dizileri; Arm'da branch-mispredict performance counter'ları anormal mispredict yoğunluğunu yüzeye çıkarabilir.
  • Statik sinyal: CSDB/masking olmadan derlenmiş bounds-checked load'lar kalıcı risk göstergesidir; binary'leri mitigate edilmemiş gadget'lar için taramak runtime detection'dan daha güvenilirdir.

Mitigation

Data-dependent speculation barrier (CSDB) artı conditional masking

  • conditional-select masking'li CSDB barrier'ı: Arm'ın önerdiği yapı, bounds koşuluna bağlı olarak all-zero ya da all-ones bir mask üreten bir conditional select/move'u bir CSDB (ve uygun yerlerde DSB/ISB) ile birleştirir, böylece speculative olarak load edilen değer sonraki address'leri etkileyemez. Bu, __builtin_load_no_speculate / speculation-barrier intrinsic'inin özüdür.
  • Compiler desteği: el yazısı assembly'ye güvenmek yerine, vulnerable bounds-checked load'larda bu barrier'ları/mask'leri emit eden Spectre-v1-aware bir toolchain kullan.
  • Index masking: index'i array bound'una clamp et (index &= mask) ki out-of-bounds bir değer speculative olarak bile aralık içine zorlansın.
  • Gadget'ları azalt: security-critical yollarda secret-dependent memory indexing'den kaçın; secret'ları constant-time kodda tut.
  • Speculate eden Arm Cortex-A core'larında geniş çapta geçerlidir; tam etkilenen parçalar için Arm'ın per-core security bulletin'ine danışın.

References