Nemesis¶
Bir hardware enclave'inden (Intel SGX, Sancus) instruction granülerliğinde execution state'i, dikkatlice zamanlanmış bir interrupt'ın teslim edildiği latency'yi ölçerek recover et — interrupt'lar instruction retirement'a kadar bekletilir, dolayısıyla IRQ'dan handler'a gecikme, kesilen instruction'ın ne kadar sürdüğünü sızdırır.
Mechanism¶
Neden çalışır
Modern CPU'lar IRQ hattı assert edilir edilmez bir interrupt'a hizmet vermez. Kesin architectural state'i korumak için interrupt, o an yürütülen instruction retire olana kadar ertelenir — Meltdown'ın suistimal ettiği aynı retirement-ordering davranışı. Nemesis bunu bir timing oracle'ına dönüştürür.
Ayrıcalıklı bir saldırgan (SGX threat model'i zaten saldırgana OS'u verir), bir enclave'in içinde ateşlenecek bir hardware timer'ı arm eder, sonra interrupt'ın (güvenilmeyen) handler'a fiilen ulaşmasının ne kadar sürdüğünü zamanlar:
- Leak: ölçülen IRQ latency'si, timer ateşlendiğinde çalışmakta olan instruction'ın artık (residual) execution süresini içerir. Multi-cycle instruction'lar (örneğin bir multiply, cache miss eden bir load) retirement'ı geciktirir ve dolayısıyla interrupt teslimini geciktirir.
- Transmit/decode: enclave'i her seferinde bir instruction single-step ederek ve her adımın interrupt latency'sini kaydederek, saldırgan instruction başına bir timing trace yeniden inşa eder. Latency, her instruction'ın tipi ve microarchitectural state'i ile correlate olduğu için trace, secret'a bağlı control flow'u ve operand'ları ele verir.
Sızıntı speculation'dan bağımsızdır, dolayısıyla "küçük gömülü sensör node'larından yüksek seviyeli commodity x86 hardware'ine kadar tüm computing spektrumunu" kapsar — hem Intel SGX hem de Sancus gömülü TEE üzerinde gösterilmiştir.
Walkthrough¶
Nemesis, SGX-Step single-stepping framework'ü üzerine kurulur: local APIC timer'ını enclave'i (yaklaşık) bir instruction sonra kesecek şekilde yapılandır, sonra her Asynchronous Enclave Exit (AEX) etrafındaki interrupt latency'sini ölç.
// Conceptual Nemesis step: single-step the enclave and time IRQ delivery.
// Built on SGX-Step (https://github.com/jovanbulck/sgx-step).
apic_timer_oneshot(STEP_TICKS); // arm APIC timer to fire mid-enclave
// On AEX, the SGX-Step IRQ handler runs. Nemesis records the timestamp
// captured *inside* the interrupt handler relative to when the timer fired:
uint64_t irq_latency = irq_handler_tsc - timer_arm_tsc;
log(step_index++, irq_latency); // latency ~ residual exec time of the insn
Interrupt-latency trace'i, instruction'ları execution maliyetlerine göre ayırır:
step insn (illustrative) IRQ latency (cycles, relative)
---- -------------------- ------------------------------
12 add r0, r1, r2 low
13 mul r3, r0, r4 high <- multi-cycle instruction stands out
14 ld r5, [r6] high <- cache-missing load
15 nop low
Secret'a bağlı bir branch, her tarafta farklı bir instruction tipi dizisi yürütür; latency trace'i, önceki page-fault ve branch-shadowing channel'ları yapamadığında bile iki path'i ayırt eder.
Secret'a bağlı bir branch'i yeniden inşa etmek
Warning
Nemesis, kurbana kesin interrupt teslim etme OS düzeyindeki yeteneğini (SGX adversary model'i) artı doğru timestamping'i gerektirir. Bu modelin dışında — örneğin saldırganın single-step yapamadığı bir CPU'da çalışan bir enclave — channel uygulanmaz.
Mitigation¶
- Constant-time / dengeli kod: secret'a bağlı bir branch'in her iki tarafının da özdeş latency profilleriyle instruction dizileri yürütmesini sağla.
- Interrupt hardening: güvenilir single-stepping'i tespit eden ya da önleyen (örneğin AEX-notify, interrupt-rate izleme) TEE tasarımları, ölçüm primitive'ini ortadan kaldırır.
- Hardware düzeyinde deterministik / constant-time interrupt latency, kök neden channel'ını kapatırdı ama commodity CPU'larda mevcut değildir.