Skip to content

xfrm cross-border state OOB (CVE-2017-7184)

Linux IPsec (XFRM) replay-state güncellemesindeki eksik bir bounds check, CAP_NET_ADMIN yetkisine 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

  1. (Vulnerable bir kernel üzerinde) CAP_NET_ADMIN elde et — privileged isen doğrudan, ya da capability'nin verildiği bir unprivileged user namespace oluşturarak.
  2. Normal boyutta bir anti-replay window ile bir XFRM state oluştur; bu sabit replay state buffer'ı allocate eder.
  3. Uzunluğu buffer'a karşı yeniden validate edilmeyen aşırı büyük bir replay_window taşıyan bir XFRM_MSG_NEWAE güncellemesi gönder.
  4. Sonraki replay-state işlemesi buffer'ın ötesini index'ler ve kernel heap'inde bir out-of-bounds read/write verir.
  5. 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_ADMIN networking 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_ae path'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) ki CAP_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.

References