"매 speculative execution 의 microarchitectural side-effect leak". 2018 Kocher et al. discovery — branch predictor / BTB 를 mistrained 시켜 out-of-bounds load 의 cache footprint 로 secret 을 추출. 2026 현재 Variant 1/2/4 + Retbleed/Inception 등 8년차 ongoing mitigation arms race.
매 핵심
매 Variants
V1 (Bounds Check Bypass, CVE-2017-5753): speculative array access past bounds.
// Vulnerable: array2 cache state leaks array1[x]
uint8_tarray1[16];uint8_tarray2[256*4096];voidvictim(size_tx){if(x<16){// mistrained branch
uint8_tv=array1[x];// x can be OOB during speculation
uint8_tleak=array2[v*4096];// cache footprint encodes v
}}// Attacker: train with valid x, then call with OOB x,
// flush array2, victim(), then time array2[i*4096] reads.
voidvictim_safe(size_tx){if(x<16){_mm_lfence();// serialize — block speculation
uint8_tv=array1[x];uint8_tleak=array2[v*4096];}}// Cost: ~30-50% perf hit. 매 array_index_nospec() 의 Linux kernel 사용.
V1 mitigation: index masking
// Linux kernel array_index_nospec
staticinlinesize_tmask_idx(size_tidx,size_tsz){size_tmask=~(idx>=sz?~0UL:0);returnidx&mask;// 0 if OOB, idx otherwise — branchless
}voidvictim_masked(size_tx){if(x<16){x=mask_idx(x,16);uint8_tv=array1[x];uint8_tleak=array2[v*4096];}}
V2 mitigation: retpoline
; Replace `jmp *%rax` with retpoline trampoline
retpoline:callset_up_targetcapture:pauselfencejmpcapture; speculation trap
set_up_target:mov%rax,(%rsp); overwrite return addr
ret; predictor uses RSB, not BTB