Skip to content

sk_buff spray

Seçilen boyutta network paketleri göndererek eşleşen bir kmalloc cache'inde attacker-kontrollü sk_buff data buffer'ları allocate et; bir heap spray olarak ve — skb_shared_info.destructor_arg aracılığıyla — bir control-flow / arbitrary-write primitive olarak kullanılır.

Mechanism

Kernel bir paket aldığında/kuyruğa aldığında socket buffer için bir data buffer allocate eder; buffer boyutu paket length'ini takip eder, dolayısıyla N-byte'lık bir paket göndermek eşleşen kmalloc cache'ine kontrollü bir allocation yerleştirir. Metadata struct skb_shared_info, aynı buffer'ın kuyruğunda (tail) yaşar ve sk_buff->head tarafından işaret edilir.

Note

İki kullanım gelir. (1) Spray: paket boyutunu seçmek bir cache'i hedefler (ör. ~2800-byte'lık UDP payload'ları data buffer'ını kmalloc-4k'ya düşürür) ve paket byte'ları object içeriğidir. (2) Hijack: skb_shared_info.destructor_arg'ı sahte bir struct ubuf_info'ya işaret edecek şekilde overwrite etmek, buffer cleanup'ında kernel'in ubuf_info.callback'i çağırması demektir — tek bir gadget aracılığıyla bir arbitrary-write/RIP primitive. destructor_arg'ı dereference eden şey zero-copy path'idir; skb_shared_info.tx_flags içindeki SKBTX_DEV_ZEROCOPY flag'i tarafından gate'lenir.

Walkthrough

// Spray kmalloc-4k with controlled bytes by sending sized UDP packets.
char payload[2800];
memset(payload, 0x41, sizeof(payload));
for (int i = 0; i < 256; i++)
    sendto(udp_fd, payload, sizeof(payload), 0, (struct sockaddr*)&dst, sizeof(dst));

Bir write primitive var olduğunda control-flow path'i:

  1. Sahte bir struct ubuf_info'yu kernel belleğine grooming yap (ör. copy_from_user'ın onu erken overwrite etmemesi için setxattr()+userfaultfd).
  2. Free edilmiş/hedef skb'nin skb_shared_info.destructor_arg'ını sahte ubuf_info'ya işaret edecek şekilde overwrite et, tx_flags içinde SKBTX_DEV_ZEROCOPY set'liyken.
  3. skb cleanup'ında kernel ubuf_info.callback'i çağırır, ör. mov rdx,[rdi+8]; mov [rdx+rcx*8],rsi; ret gibi bir gadget → arbitrary write.

Beklenen sonuç: spray için kontrollü kmalloc-4k dolumları; hijack path'inde, skb teardown sırasında attacker'ın seçtiği bir callback ateşlenir.

Mitigation

Hardened usercopy ve slab freelist hardening/randomization overlay güvenilirliğini azaltır; CFI/FineIBT keyfi bir ubuf_info.callback çağrılmasını engeller; cache ayrımı (RANDOM_KMALLOC_CACHES) spray'i victim ile aynı yere yerleştirmeyi zorlaştırır.

References