Skip to content

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.

$ cat /sys/devices/system/cpu/vulnerabilities/retbleed
Mitigation: Stuffing

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