sk_buff spray¶
Seçilen boyutta network paketleri göndererek eşleşen bir kmalloc cache'inde attacker-kontrollü
sk_buffdata buffer'ları allocate et; birheapspray olarak ve —skb_shared_info.destructor_argaracı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:
- Sahte bir
struct ubuf_info'yu kernel belleğine grooming yap (ör.copy_from_user'ın onu erken overwrite etmemesi içinsetxattr()+userfaultfd). - Free edilmiş/hedef skb'nin
skb_shared_info.destructor_arg'ını sahteubuf_info'ya işaret edecek şekilde overwrite et,tx_flagsiçindeSKBTX_DEV_ZEROCOPYset'liyken. - skb cleanup'ında kernel
ubuf_info.callback'i çağırır, ör.mov rdx,[rdi+8]; mov [rdx+rcx*8],rsi; retgibi birgadget→ 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¶
- Four Bytes of Power: Exploiting CVE-2021-26708 in the Linux kernel (Alexander Popov) — writeup, sk_buff spray'i CVE-2021-26708 (vsock refcount/race bug) exploit zincirinin bir adımı olarak gösterir; CVE'nin kendisi bir sk_buff bug'ı değildir. sk_buff spray'in merkezi olduğu CVE için bkz. udp-ufo-out-of-bounds-lpe (CVE-2017-1000112).