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.