Skip to content

Execution Port Contention (PortSmash)

Paylaşılan execution port'larındaki contention'ı time'layarak birlikte yerleşik bir SMT sibling'ının instruction mix'ini çıkarsa — memory ve shared cache gerektirmeyen bir port-contention timing channel.

Mechanism

Neden çalışır

Bir SMT/Hyper-Threading core'unda iki logical thread, sabit bir issue port seti üzerinden erişilen core'un execution unit'lerini paylaşır. Her micro-op, onu çalıştırabilen bir port'a dispatch edilmek zorundadır; her iki sibling aynı cycle'da aynı port'a ihtiyaç duyduğunda biri geciktirilir.

PortSmash, bu contention'ı bir covert/side channel'a dönüştürür:

  • Leak: attacker thread'i sürekli olarak belirli bir port'a bağlanan instruction'lar (örn. yalnızca port 1 veya port 5'in hizmet verebileceği bir chain) çalıştırır ve sabit bir batch'in ne kadar sürdüğünü time'lar. Victim sibling de o port'u kullandığında attacker'ın batch'i daha yavaştır; victim başka port'ları kullandığında daha hızlıdır.
  • Transmit/decode: batch başına latency trace'i, port baskısının bir zaman serisidir. Secret'a bağlı control flow (örn. bir modular-exponentiation / scalar-multiplication loop'undaki bir branch) farklı instruction mix'leri çalıştırdığı için, trace victim'in secret'a bağlı yolunu ortaya çıkarır.

Cache attack'lerinin aksine, channel port seviyesindedir — herhangi bir shared memory veya shared cache line olmadan çalışır, yalnızca SMT yoluyla aynı fiziksel core üzerinde co-residency gerektirir.

Walkthrough

Spy, sıkı bir port-bound loop çalıştırır ve victim (SMT sibling) secret'a bağlı bir operasyon gerçekleştirirken iterasyon başına timing'i kaydeder:

// Conceptual PortSmash spy: saturate one port, time the batch.
static inline uint64_t batch_latency(void) {
    uint64_t t0 = rdtscp();
    // Long dependency chain of ops that contend for a specific port,
    // e.g. repeated CRC32 / specific ALU ops mapping to one port:
    asm volatile(
        "mov $1024, %%ecx\n"
        "1:\n"
        "  crc32 %%rax, %%rax\n"   // illustrative port-bound op
        "  dec %%ecx\n"
        "  jnz 1b\n"
        ::: "rax","ecx","cc");
    return rdtscp() - t0;
}
// for(;;) record batch_latency(); -> high latency == victim used that port

Ortaya çıkan latency zaman serisi, secret'a bağlı branch'leri çıkarmak için post-process edilir (alignment + classification) — örn. victim'in modular arithmetic'inden bir ECDSA/TLS private key geri elde etmek.

Beklenen trace (kavramsal)
iteration latency (cycles):
...,  low,  low,  HIGH, HIGH,  low, HIGH, ...   <- HIGH == port contended
pattern of HIGH/low aligns to victim's secret-dependent operation sequence

Mitigation

  • SMT/Hyper-Threading'i devre dışı bırak (standart workaround); CVSS'te moderate derecelendirilmiş.
  • Secret'lardan bağımsız, port-stable bir instruction mix'e sahip constant-time crypto.
  • Güvenilmeyen kod bir victim ile asla fiziksel bir core paylaşmasın diye scheduler isolation.

References