Skip to content

type confusion WrongZone rooting (CVE-2018-9568)

Linux/Android kernel'inin sk_clone_lock socket-cloning yolundaki bir type-confusion / memory-corruption açığı; "WrongZone" universal Android root tarafından kullanılır ve yanlış kullanılan bir socket alanı kontrol edilebilir bir kernel write'ına dönüşür.

Mechanism

Bug class: socket cloning'de type confusion (sk_clone_lock)

Bir connection accept edildiğinde, kernel net/core/sock.c'deki sk_clone_lock ile dinleyen socket'i klonlar ve birçok parent alanını kopyalayan bir child struct sock üretir. Açıklanan açık (CVE-2018-9568, CWE-704 "Incorrect Type Conversion or Cast") şudur: klonlanan socket'teki bir alan yanlış tipte bir değer tutabilir — bir pointer/nesne, gerçekte olduğundan farklı bir yapı olarak yorumlanır.

Somut olarak, cloning yolu bir üyeyi yanlış işler; öyle ki inline bir scalar olması gereken bir değer (örneğin bir accounting/reference counter) daha sonra pointer taşıyan bir nesne gibi ele alınır ya da onunla alias olur. Linux'un SLAB/SLUB allocator'ı aynı boyut sınıfındaki nesneler için free edilmiş chunk'ları yeniden kullandığından, saldırgan karışan alanın aynı cache'te yaşayan farklı bir nesne tipinden gelen saldırgan kontrolündeki veriyle üst üste binmesini ayarlayabilir.

Kırılan güvenlik sınırı kernel type safety'sidir: kernel bir alanı bir tip sanarak deref eder ya da üzerinde işlem yapar, oysa byte'lar saldırgan kontrolündedir. Socket'in normal lifecycle'ını sürdürmek (örneğin decrement/free eden ya da karışan pointer'ı takip eden işlemler) sonra bu confusion'ı kontrollü bir free'ye ya da saldırganın seçtiği bir kernel adresinde kontrollü bir write'a çevirir — credential'ları overwrite edip root almanın basamak taşı.

Walkthrough

Public WrongZone disclosure'ından (Wang Yong, "From Zero to Root") ve QuestEscape writeup'ından kavramsal yeniden kurgu. Offset yok, spray boyutu yok, exploit kodu yok.

  1. Clone'u tetikle. Socket accept/clone yolunu çalıştır ki sk_clone_lock, yanlış işlenen alanı tip-dışı bir değer taşıyan bir child sock üretsin.
  2. Slab'i groom et. Object spraying kullan — klasik olarak sk-buff-spray.md ve diğer same-size-class allocation'lar — karışan alanın yeniden yorumlanacağı yere saldırgan kontrolündeki byte'ları yerleştirmek için. Bu, kernel allocator'ının ders kitabı niteliğinde heap grooming / feng shui'sidir (bkz. slab-grooming.md ve kmalloc-cache-feng-shui.md).
  3. Confusion'ı silahlandır. Socket'in lifecycle'ını ilerlet ki kernel karışan alanı meşru tipmiş gibi takip etsin. Alana bağlı olarak bu, saldırgan etkisi altında bir use-after-free ya da write-what-where tarzı bir corruption verir.
  4. Root'a yüksel. Ortaya çıkan primitive'i bir process'in credential yapısını overwrite etmeye (örneğin cred'deki UID/GID'yi sıfırlamaya) ya da bir kernel control pointer'ını hijack etmeye yönlendir; bir root shell üretilir. WrongZone, birçok cihazda universal bir Android rooting tekniği olarak gösterildi (ve daha sonra Oculus Quest'i etkiledi).

Universal, etkileşimsiz, local

Bug kullanıcı etkileşimi ya da ekstra execution ayrıcalığı gerektirmez (CVSS 7.8, AV:L). Saldırganlar için çekiciliği genişliğiydi: geniş bir Android kernel yelpazesinde genelleşen tek bir type-confusion primitive'i, ki bu yüzden birden çok rooting toolkit'inde yer aldı.

Detection

  • Patch-level envanteri. Düzeltme Aralık 2018 Android Security Bulletin'inde geldi. Etkilenen kernel'lerde o patch seviyesinin altındaki cihazlar açıktır; eski güvenlik patch seviyelerinin MDM/envanter raporlaması birincil sinyaldir.
  • Anormal socket-clone davranışı. Başarılı exploitation socket accept/clone'u olağandışı biçimlerde manipüle eder; anormal sock lifecycle olaylarının kernel auditing'i ya da eBPF tracing'i, yoğun same-size-class allocation patlamalarıyla birlikte grooming faaliyetini işaretleyebilir.
  • Credential-tamper sinyalleri. Hiç ayrıcalıklı olmamış bir process'in aniden UID 0'a geçmesi ya da beklenmedik bir root context'in ardından gelen SELinux denial'ları / avc artışları, Android'de güçlü post-exploitation göstergeleridir.
  • Crash adli analizi. Kusurlu grooming, sk_clone_lock'ta kernel oops/panic trace'leri, slab corruption mesajları ya da socket yapılarına atıfta bulunan "BUG: unable to handle" kayıtları üretir.

Mitigation

  • Aralık 2018 patch'ini uygula (ve Android güvenlik patch seviyesini güncel tut); bu type confusion'ı kaynağında düzeltir.
  • Allocator hardening: CONFIG_SLAB_FREELIST_RANDOM, CONFIG_SLAB_FREELIST_HARDENED ve freelist pointer obfuscation, same-cache grooming'i ve karışan-pointer overwrite'larını daha az güvenilir kılar.
  • Çıtayı yükselten mimari savunmalar: PAN (Privileged Access Never) kernel'in user pointer'ları deref etmesini engeller ve KASLR statik hedef adreslerini ortadan kaldırır — yamalı WrongZone-etkili build'ler tam olarak bunları ekledi. Hardware destekli CFI (örneğin daha yeni arm64'te PAC/BTI) hijack edilen control pointer'ları daha da kısıtlar.
  • Credential koruması: read-only / hardened cred işleme ve enforcing modda SELinux, primitive elde edilse bile bir credential overwrite'ının değerini düşürür.

References