Filesystem object data-only attack¶
Control flow'u hijack etmek yerine file-subsystem objelerindeki data alanlarını (credentials, file mode flag'leri, page reference'ları) bozarak ya da swap'leyerek privilege escalation; böylece CFI/KASLR/SMAP devre dışı bırakılır.
Mechanism¶
Data-only (data-oriented programming) saldırısı execution'ı asla yönlendirmez. Bunun yerine, security-relevant bir data alanı ile o alandan türetilen privilege kararı arasındaki bağı ihlal eder — örneğin write izni file->f_mode'dan bir kez belirlenir, dolayısıyla check'ten sonra FMODE_WRITE'ı flip'lemek, policy'nin hiç niyet etmediği write'ları mümkün kılar.
Note
"Beyond Control" çalışması (arXiv:2401.17618) exploit edilebilir file-system alanlarını üç aileye ayırır: Flags (inode.i_mode, file.f_mode, posix_acl.e_perm, vm_area_struct.vm_flags, pipe_buffer.flags), References (file.f_mapping, address_space.i_pages, bio.bi_iter.bi_sector, buffer_head.b_blocknr) ve Operations (bio.bi_opf, request.cmd_flags, iomap_dio.flags). Bunlardan herhangi birini bozmak, bir function pointer'a dokunmadan bir I/O'yu yeniden yönlendirir veya yeniden yetkilendirir; bu yüzden CFI, KASLR ve SMAP büyük ölçüde devre dışı kalır.
Warning
Attacker kontrolü altında hiçbir kernel pointer dereference edilmediği için, bu saldırılar çoğu zaman hiç KASLR leak'i gerektirmez ve klasik bir ROP chain'i bloklayacak control-flow-integrity mitigation'larını atlatır.
Walkthrough¶
Bu prensip üzerine kurulu temsili somut teknikler:
- DirtyCred (Lin, Wu, Xing; ACM CCS 2022): heap reuse'u kötüye kullanarak aynı tipteki low-privilege bir objeyi high-privilege biriyle swap'ler. Permission check'inden sonra ama write'tan önce yazılabilir bir
struct file'ı free et, slot'u read-only bir dosyanınstruct file'ıyla reclaim et; böylece uçuştaki write read-only dosyaya düşer. Bkz. DirtyCred credential swap ve DirtyCred file exploitation. - Dirty Pagetable (Nicolas Wu): bir page-table page'ine dangling reference tut ve arbitrary physical read/write için PTE'leri düzenle — saf bir data-only primitive. Bkz. Dirty PageTable.
- Bridge objects ("Beyond Control"):
struct page *tutan objeler (örn.pipe_buffer.page,bio_vec.bv_page) slab-cache sınırlarını aşan page-granularity dangling reference'lar oluşturur ve cross-cache'ten kaçınır. Makale 282 alandan 23'ünün exploit edilebilir olduğunu ve mitigation'lar açıkken 10 end-to-end exploit gerçekleştirildiğini bildiriyor.
Swap adımı için window kontrolü genellikle FUSE ya da filesystem lock'larıyla elde edilir; kernel permission check ile write arasında tutulur.
DirtyCred-tarzı bir credential swap'in kavramsal zaman çizgisi (boyutlar/adresler/timing kernel'e göre değişir; sıralama filozofiktir):
kernel write path attacker (paralel thread / FUSE stall)
----------------- --------------------------------------
t0 permission check OK
(writable file -> izin verildi)
t1 hedef writable `struct file` free
edilir, slab slot serbest kalır
t2 aynı slab slot read-only bir
dosyanın `struct file`'ı ile
reclaim edilir (heap reuse)
t3 write devam eder, AMA artık
slot read-only objeyi tutuyor
=> write read-only dosyaya düşer
(control flow hiç hijack edilmedi)
Saldırının özü: check ve use arasındaki pencerede, policy kararını besleyen data objesi sessizce başka bir objeyle değiştirilir; hiçbir pointer dereference attacker'a yönlendirilmediği için CFI/KASLR devre dışı kalır.
Mitigation¶
DirtyCred'in önerdiği savunma, privileged objeleri (cred, file) ayrı bir virtual-memory bölgesine izole eder; böylece aynı tipteki attacker kontrollü objelerle bir slab'ı paylaşamazlar. Slab hardening (CONFIG_SLAB_FREELIST_HARDENED, dedicated cache'ler, cross-cache mitigation'ları) çıtayı yükseltir, ama page-level bridge-object UAF'leri slab isolation'ı yener ve page-granularity savunmaları gerektirir.