Frontal Attack¶
Bir SGX enclave'i instruction-by-instruction interrupt ederek ve CPU frontend'inin instruction'ları nasıl fetch/issue ettiğini time'layarak içindeki control flow'u leak et — instruction açısından bile birbirinin aynısı olan branch'leri ayırt ederek.
Mechanism¶
Neden çalışır
Bazı instruction'ların execution süresi, CPU frontend'inin (fetch, predecode ve instruction-issue path'i) onları nasıl handle ettiğine bağlı olarak kendilerinden önce ve sonra gelen instruction'lara ve virtual address'lerine bağlıdır. Bir SGX enclave çalıştıran privileged bir adversary enclave'i her instruction'dan sonra interrupt edebilir (SGX-Step'teki gibi APIC timer ile single-stepping) ve o tek instruction'ı resume/retire etme süresini ölçebilir.
leak/transmit/decode invariant'ı:
- Leak: per-instruction execution/interrupt timing'i, instruction'ın alignment'ı ve frontend state'i ile correlate olur, ki bunlar bir branch'in iki tarafı arasında farklıdır.
- Transmit/decode: enclave'i step'leyip her execute edilen instruction'ın timing'ini kaydederek, attacker bir branch'in hangi path'i aldığını yeniden inşa eder — iki target da aynı code'u içerse bile, ki bu durum önceki controlled-channel ve branch-shadowing saldırılarını çökertiyordu.
Interrupt'ları yapılandırma yeteneği (single-step için gerekli) tam olarak SGX threat model'idir, bu da enclave'leri doğal hedef yapar.
Walkthrough¶
Saldırı, hassas single-stepping'i her step'in timing'i ile birleştirir (kavramsal; gerçek PoC SGX-Step üzerine kuruludur):
// Conceptual Frontal loop: step the enclave, time each instruction.
// Real PoC: https://github.com/dn0sar/frontal_poc
setup_apic_timer(SINGLE_STEP_TICKS); // interrupt after ~1 instruction
for (;;) {
uint64_t t0 = rdtscp();
eresume(enclave); // run one enclave instruction
// AEX (asynchronous enclave exit) fires from the timer interrupt
uint64_t t1 = rdtscp();
record(step_index++, t1 - t0); // timing depends on frontend/alignment
}
// Post-process the timing trace to classify the secret-dependent branch.
Per-instruction timing'ler üzerinde bir statistical classifier, target branch'in alınan tarafını etiketler.
Beklenen timing sınıfları (kavramsal)
Mitigation¶
- Secret-dependent branch'leri align et, böylece iki path da aynı frontend davranışını paylaşsın; timing'in alınan tarafa bağlı olmaması için padding/alignment ekle.
- Secret-dependent kararlar için constant-time, branchless code.
- Güvenilir single-stepping'i engelleyen deterministic-execution / interrupt-hardening SGX savunmaları.