simple_xattr spray¶
tmpfs dosyaları üzerinde extended attribute'lar ayarlayarak kalıcı, attacker-boyutlu
simple_xattrobject'leri spray'le; düzsetxattr'ın aksine bunlar resident kalır ve memory-disclosure oracle'ı olarak da iş görür.
Mechanism¶
tmpfs/shmem (ve cgroupfs) üzerinde, extended attribute'lar inode üzerindeki bir red-black tree'de tutulan kernel struct simple_xattr object'lerinde saklanır. Bir tmpfs dosyası üzerindeki her setxattr(), value'yu inline tutacak boyutta bir object allocate eder (kmalloc(header + value_size)) ve — kritik biçimde — object attribute kaldırılana kadar kalıcı olur.
Note
Kalıcılık (persistence), bunu transient düz-setxattr spray'inden ayıran şeydir: kontrollü allocation canlı kalır, dolayısıyla free edilmiş bir slot'u kalıcı olarak işgal edebilir ya da UAF olmuş bir page'i reclaim edebilir. value_size'ı seçmek object'i seçilen bir kmalloc-N cache'ine ya da — en büyük slab'ın üstünde — page allocator'a yönlendirir (ör. ~8192-byte value + ~40-byte header → order-2 / 16 KB sayfalar). Taze bir user namespace içinde unprivileged (CAP_SYS_ADMIN olmadan) erişilebilirdir.
Walkthrough¶
char val[1024]; // value_size selects the target cache
memset(val, 0x41, sizeof(val));
int fd = open("/dev/shm/groom", O_CREAT|O_RDWR, 0600); // tmpfs
for (int i = 0; i < 2048; i++) {
char name[32]; sprintf(name, "user.groom_%d", i); // unique names
fsetxattr(fd, name, val, sizeof(val), 0); // persistent simple_xattr
}
// free sparse holes as landing sites:
for (int i = 0; i < 2048; i += 170) { char n[32]; sprintf(n,"user.groom_%d",i); fremovexattr(fd,n); }
Beklenen sonuç: reclaim için aralıklarla delikler açılmış ~2048 resident, kontrollü boyutta object.
Leak / corruption oracle'ı
Value length'i inline bir size field'ında saklanır. Onu corrupt etmek (ör. 8192 → 65536) getxattr()'ın komşu belleği over-read etmesini sağlar; çok küçük bir user buffer ise ERANGE döndürür, dolayısıyla aynı çağrı bir corruption-detection oracle'ı olarak da iş görür. Inline rb_node pointer'ları da komşu tree node'larının kernel adreslerini açığa çıkarır.
Mitigation¶
RANDOM_KMALLOC_CACHES/SLAB_BUCKETS spray site'larını victim'lerden ayırır; xattr quota'ları ve value-size limitleri erişilebilir cache'leri sınırlar; unprivileged user namespace'leri kısıtlamak unprivileged path'i kaldırır.
References¶
- A Race Within A Race: Exploiting CVE-2025-38617 in Linux Packet Sockets (calif.io) — CVE-2025-38617 kendisi bir AF_PACKET race/UAF'idir;
simple_xattrspray burada teknik olarak Stage 1 grooming target'ı olarak kullanılır, CVE'nin doğruladığı primitive değildir.