Skip to content

House of Crust

tcache stashing ve largebin attack'ları üzerinden leak'siz bir Safe-Linking bypass'ı; bir shell'e ulaşmak için yalnızca relative overwrite'lar kullanır.

Mechanism

House of Crust, c4ebt'nin "House of Rust" writeup'ı içinde anlatılan daha karmaşık bir variant'tır, glibc 2.32'yi ve onun Safe-Linking mitigation'ını (singly-linked fd pointer'larının PROTECT_PTR/REVEAL_PTR XOR-mangling'i) hedefler. house-of-rust gibi, Safe-Linking'in zayıf noktası olarak tcache stashing'i suistimal eder: stashing chunk'ları bir smallbin'den tcache'e aynı pointer-mangling validation'ı olmadan taşır ve full-PIE/no-leak binary'lerde hiçbir adres leak'i olmadan Safe-Linking'i bypass eder.

Note

"House of Crust", yazarın House of Rust writeup'ı içindeki bir variant için kendi terimidir. Rust primitive'lerini, tamamen relative overwrite'larla sürülen bir House-of-Corrosion benzeri attack'a yükseltir.

Walkthrough

Her iki variant da bir Tcache Stashing Unlink+ (TSU+), bir Tcache Stashing Unlink ve iki largebin attack'ı zincirlemek için bir UAF artı heap feng shui kullanır. largebin attack, free bir largebin chunk'ın bk/bk_nextsize'ını bozarak bir target'a kontrollü bir heap/libc pointer'ı yazar.

Crust variant'ının ayırt edici özelliği: stdout _IO_FILE'ının bir FSOP overwrite'ı yerine tamamen relative overwrite'lara dayanır, dolayısıyla target binary'nin non-fully-buffered olmasını gerektirmez ve bir shell'e stderr FSOP üzerinden ulaşır. Maliyet: daha fazla allocation ve 1/16 (4-bit) libc entropy bruteforce'u.

Warning

Boyutlar, bin seçimleri ve stashing reçetesi glibc 2.32'nin tcache/smallbin layout'una bağlıdır; sonraki sanity check'leri uygulanabilirliği değiştirir.

Mitigation

Safe-Linking (glibc 2.32), tam olarak bu sınıf singly-linked-list poisoning'i durdurmak için tasarlanmıştı; teknik, stashing yolunu bir boşluk olarak gösterir (bkz. safe-linking-bypass, tcache-stashing-unlink-attack). Sonraki glibc tcache/largebin sanity check'leri (demangle edilmiş pointer'lar üzerinde alignment check'leri, 2.30+'dan largebin bk_nextsize hardening'i) uygulanabilirliği azaltır; aligned olmayan demangle edilmiş bir chunk malloc(): unaligned tcache chunk detected ile reddedilir.

References