Call Depth Tracking (RSB underflow)¶
Call depth'i per-CPU hesaplayan ve Return Stack Buffer'ı underflow etmeden önce stuff eden, Intel Skylake'te speculative return'lerin attacker-poisonable BTB'ye geri düşmesini önleyen Linux Retbleed mitigation'ı.
Mechanism¶
Neden çalışır
Return Stack Buffer (RSB), 16-entry'lik bir hardware stack'tir: her call
return address'i bir prediction olarak push eder, her ret birini pop eder.
RSB boşken bir ret execute ettiğinde, CPU underflow yapar ve return
target için generic indirect predictor'a (BTB/BHB) geri düşer. Etkilenen Intel
Skylake parçalarında, userspace o predictor'ı poison edebilir, dolayısıyla bir
kernel ret'i speculatif olarak attacker-seçimli bir disclosure gadget'ına
jump eder — bu, Retbleed sınıfıdır (return'ler indirect branch'ler gibi
mispredict edilir; CVE-2022-29900/29901).
Call Depth Tracking underflow'u ortadan kaldırır. Kernel bir per-CPU call
depth account tutar ve RSB boşalamadan önce, onu güvenli
speculation-trapping entry'leriyle stuff eder (16 slot'u yeniden doldurur,
pratikte 12. return civarında bir stuff tetikler). RSB kernel return'lerinde
asla boş olmadığından, speculation asla poisonable BTB'ye geri düşmez.
Accounting'i yapıp sonra gerçek call target'a jump eden, runtime'da üretilen
16-byte call thunk'lar ile implement edilir ve retbleed return thunk'ıyla
(Skylake "SKL thunk"/rethunk) entegredir. Invariant restore edildi: bir
kernel ret'inin speculatif target'ı daima (trusted) RSB'den gelir, asla
(attacker-trained) BTB'den gelmez.
Walkthrough¶
Call Depth Tracking bir kernel build/boot seçeneğidir; onu seçer ve gözlemlersin.
1. Config'i build et/doğrula.
$ zcat /proc/config.gz | grep CALL_DEPTH_TRACKING
CONFIG_MITIGATION_CALL_DEPTH_TRACKING=y
# (formerly CONFIG_CALL_DEPTH_TRACKING) — off by default;
# ~5% kernel text growth, accounting thunks added per call site.
2. Boot'ta stuffing mitigation'ını seç.
# kernel command line:
retbleed=stuff # use call-depth-tracking RSB stuffing
# retbleed=stuff,force # force even on non-SKL parts (no-op otherwise)
3. sysfs üzerinden aktif olduğunu doğrula.
Mitigation: Stuffing, RSB-stuffing / call-depth-tracking path'inin kullanımda
olduğunu gösterir (diğer CPU'larda Mitigation: IBRS/Untrained return thunk'a
karşı).
Skylake'e özel, bir maliyetle
Teknik Intel SKL RSB-underflow davranışını hedefler; diğer CPU'larda bir no-op'tur ve farklı bir Retbleed mitigation'ı (IBRS / return thunk'lar) uygulanır. Ölçülebilir bir overhead taşır (text-size ve IBRS ile aynı seviyelerde bir pathological-case cezası), bu yüzden opt-in'dir.
Detection¶
Yalnızca operasyonel: retbleed vulnerabilities dosyası,
CONFIG_MITIGATION_CALL_DEPTH_TRACKING sembolü ve retbleed=stuff cmdline
durumu gösterir. Bu bir savunmadır, saldırı değil.
Mitigation¶
(Residual risk.) Yalnızca return'ler için RSB-underflow → BTB fallback path'ini ele alır; diğer Spectre-v2 / speculation sorunları kendi düzeltmelerine ihtiyaç duyar (retpoline, eIBRS, IBPB ve untrained-return tarafı için return thunk).
References¶
- LWN. x86/retbleed: Call depth tracking mitigation. — https://lwn.net/Articles/901712/
- LWN. The "Retbleed" speculative execution vulnerabilities. — https://lwn.net/Articles/900917/
- Linux kernel. lkddb: CONFIG_MITIGATION_CALL_DEPTH_TRACKING. — https://cateee.net/lkddb/web-lkddb/MITIGATION_CALL_DEPTH_TRACKING.html