xfrm cross-border state OOB (CVE-2017-7184)¶
Linux IPsec (XFRM) replay-state güncellemesindeki eksik bir bounds check,
CAP_NET_ADMINyetkisine sahip bir kullanıcının replay state buffer'ının ötesine okuma ve yazma yapmasına izin verir; bildirildiğine göre Pwn2Own 2017'de (Chaitin Security / ZDI atfı doğrulanmayı bekliyor) gösterilmiştir.
Mechanism¶
Invariant: kullanıcının verdiği window boyutu, ayrılmış state buffer'a sığmalı
XFRM (IP transformation / IPsec) subsystem'i anti-replay state'i, boyutu state oluşturulurken sabitlenen bir buffer'da saklar. Userspace anti-replay parametrelerini bir XFRM_MSG_NEWAE netlink mesajıyla güncellediğinde, kernel'in verilen replay_window'un (ve ilgili uzunlukların) hâlâ o önceden allocate edilmiş replay state buffer'ın içine sığdığını doğrulaması gerekir.
net/xfrm/xfrm_user.c içinde, xfrm_new_ae() tarafından çağrılan xfrm_replay_verify_len(), kullanıcının belirttiği replay_window'un replay state buffer sınırları içinde olduğunu validate etmiyordu. Allocate edilenden büyük bir window dolayısıyla kernel'in buffer'ın ötesini index'lemesine olanak tanır — bir heap out-of-bounds read and write (allocation'ın ötesine geçen "cross-border"). Komşu heap içeriğini kontrol etmek bu OOB'yi local privilege escalation'a dönüştürür. Bu path'e ulaşmak CAP_NET_ADMIN gerektirir, ancak unprivileged user namespaces etkin olan kernel'lerde sıradan bir kullanıcı bu capability'yi yeni bir namespace içinde elde edebilir — bu da attack surface'i ciddi şekilde genişletir.
Walkthrough¶
Public oss-sec/ZDI açıklamasından kavramsal yeniden kurgu
- (Vulnerable bir kernel üzerinde)
CAP_NET_ADMINelde et — privileged isen doğrudan, ya da capability'nin verildiği bir unprivileged user namespace oluşturarak. - Normal boyutta bir anti-replay window ile bir XFRM state oluştur; bu sabit replay state buffer'ı allocate eder.
- Uzunluğu buffer'a karşı yeniden validate edilmeyen aşırı büyük bir
replay_windowtaşıyan birXFRM_MSG_NEWAEgüncellemesi gönder. - Sonraki replay-state işlemesi buffer'ın ötesini index'ler ve kernel heap'inde bir out-of-bounds read/write verir.
- Slab'ı groom et ki işe yarar bir hedef object komşuya gelsin; root'a yükselmek için onu corrupt et.
Detection¶
- Auditd / netlink telemetry: network yönetimi yapmayan process'lerden gelen beklenmedik
XFRM_MSG_NEWAE(ve XFRM state oluşturma), çoğu workload'da şüphelidir. - User namespaces oluşturup hemen ardından
CAP_NET_ADMINnetworking config'i kullanan process'leri işaretle — yaygın bir privilege-escalation pattern'i. - Crash/oops signature'ları: SLUB/SLAB corruption,
xfrm_replay_*/xfrm_new_aepath'lerinde KASAN out-of-bounds raporları. - XFRM allocation'larının yakınında tetiklenen kernel hardening telemetry'si (slab redzone / freelist hardening).
Mitigation¶
replay_window'u replay state buffer'a karşı düzgünce bounds validation eden upstream fix'i uygula (bildirildiğine göre 4.10.6 civarı stable tree'lerde düzeltildi — kesin fix-version doğrulanmayı bekliyor; SUSE/Ubuntu/Amazon'dan vendor backport'ları mevcut).- Gerekmediği yerlerde unprivileged user namespaces'i devre dışı bırak (
kernel.unprivileged_userns_clone=0/user.max_user_namespaces=0) kiCAP_NET_ADMIN'e giden unprivileged path ortadan kalksın. - OOB corruption'ı tespit etmek/körleştirmek için slab/heap hardening'i etkinleştir (
CONFIG_SLAB_FREELIST_HARDENED, redzoning, test fleet'lerinde KASAN). - Güvenilmeyen workload'lar için
CAP_NET_ADMIN'i seccomp/least privilege ile kısıtla.