Skip to content

simple_xattr spray

tmpfs dosyaları üzerinde extended attribute'lar ayarlayarak kalıcı, attacker-boyutlu simple_xattr object'leri spray'le; düz setxattr'ı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