Tony Hawk’ın Pro Strcpy Oyun Hack’i
(icode4.coffee)- Create-A-Park kayıt dosyasında gap name işlenişindeki
strcpybuffer overflow, original Xbox, Xbox 360, PS2 ve GameCube gibi birçok platformda kayıt dosyası ve ağ exploit’lerine yol açtı - THPS4’ün original Xbox sürümü, 31 karakter sınırındaki bir dizgiyi sınır kontrolü olmadan 32 baytlık stack buffer’a kopyalayarak return address’in üzerine yazılmasına izin veriyordu; kayıt dosyası başlığı ve yürütülebilir veri segmenti kullanılarak shellcode çalıştırıldı
- THPS3’te aynı girdi stack yerine heap’i bozuyordu; bu yüzden custom allocator ve vtable yolu üzerinden geçen bir ROP chain gerekiyordu, THUG 1 ve 2’nin Xbox sürümlerinde ise stack cookie nedeniyle gap name yolu kapalıydı
- THPS4 multiplayer’da kötü niyetli bir host, park dosyasını istemciye göndererek uzaktan kod çalıştırma ve eşzamansız dosya aktarımı gerçekleştirebiliyordu; aktarım sırasında ortaya çıkan ağ bellek sızıntısı exploit içinde hot patch ile aşıldı
- Xbox 360’taki Tony Hawk’s American Wasteland’de de gap name overflow ile ROP çalıştırmak mümkün, ancak tam hypervisor kod çalıştırma yalnızca 4548 kernel’deki system call handler hatasıyla birleştirildiğinde mümkün oluyor; kaynak kod ve yamalanmış kayıt dosyası GitHub’da yayımlandı
Başlangıç noktası: gap name ve strcpy
- 2016’da original Xbox için yeni bir kayıt dosyası hack açığı aranırken Tony Hawk’s Pro Skater 4’ün custom park kayıt dosyası analiz konusu oldu
- THPS4’ün Create-A-Park özelliği, oyuncuların kendi skate park’larını oluşturmasına ve atlama bölümleri olan gap’lere ad vermesine izin veriyordu
- gap name, en fazla 31 karakter ve bir null terminator’dan oluşan kullanıcı tanımlı bir dizgidir
- Bu dizgi
strcpygibi işlevlerle işlenirse bir bellek bozulması primitive’ine dönüşebilir
- gap name’i uzun bir
0x41tekrar dizgisiyle değiştiren kötü niyetli kayıt dosyası Xbox’a kopyalanıp yüklendiğinde konsol çöktü ve instruction pointer0x41414141olarak ayarlandı- Bu, gap name’in stack’e kopyalanırken return address’e kadar üzerine yazıldığının işaretiydi
- IDA analizi, kayıt dosyasındaki gap listesinin dolaşılması sırasında
save_file_gap_dataiçindekigap_namealanının stack’tekigap_description gapDescyapısınastrcpyile kopyalandığını gösterdi- Sınır kontrolü olmadığı için null terminator görülene kadar kopyalama sürüyordu
- İlgili oyun sürümü stack cookie olmadan derlenmişti; bu da stack verisinin ve return address’in üzerine yazılabilmesini sağlıyordu
original Xbox THPS4: shellcode’u yürütülebilir alana taşımak
- original Xbox’ta modern cihazlardaki gibi keyfi veri çalıştırmayı engelleyen donanımsal DEP yoktu, ancak daha geç kernel sürümleri ve oyunlarda bir miktar soft DEP bulunuyordu
- Yöntem, code segment selector adresini değiştirerek yalnızca belirli bir adresin altının çalıştırılabilmesini sağlamaktı
- Stack ve kayıt dosyasının bulunduğu heap allocation’lar yürütülebilir alanın dışındaydı
- Oyunun yürütülebilir dosyasındaki read-write veri segmenti yürütülebilir alanın içinde olduğundan, kodu önce oraya kopyalayıp sonra çalıştırma stratejisi kullanıldı
- park adı kayıt dosyası başlığında yer alıyordu ve oyuncu kayıt dosyasını seçtiğinde arayüzde göstermek için başlığın ilk 136 baytı yürütülebilir dosyanın veri segmentindeki bir struct’a kopyalanıyordu
- Başlığın tamamı serbestçe değiştirilemiyordu ama küçük bir
memcpystub’ı yerleştirmek için yeterli alan vardı
- Başlığın tamamı serbestçe değiştirilemiyordu ama küçük bir
- THPS4 original Xbox exploit akışı
- Kayıt dosyası yüklendikten sonra, “Start Game”e basılmadan önce ilk 136 bayt yürütülebilir dosyanın veri segmentine kopyalanır
- “Start Game”e basıldığında kötü niyetli gap name stack’e kopyalanır ve return address shellcode kopyalama stub’ının adresiyle üzerine yazılır
- İşlev döndüğünde kopyalama stub’ına atlanır; bu stub kayıt dosyası buffer’ındaki büyük payload’u yürütülebilir veri segmentine kopyalar
- Kopyalama sonrası payload’a atlanarak keyfi kod çalıştırma elde edilir
İmza doğrulamasını aşmak ve habibi key
- original Xbox’ta kod çalıştırma elde edildikten sonra imza kontrolünü devre dışı bırakmak ve unsigned executable çalıştırmak gerekir
- payload, mevcut 007 Agent Under Fire softmod installer kayıt dosyasının payload’unu temel alıyordu
- Kernel işlevlerinin ve veri adreslerinin yeri bulunur, ardından yürütülebilir dosya imza doğrulamasında kullanılan RSA public key adresi tespit edilir
- machine state register’daki write protection devre dışı bırakılır ve RSA public key, habibi key ile yamalanır
- Kayıt dosyasına dahil edilen yardımcı yürütülebilir dosya çalıştırılır; testlerde
nyan catyürütülebilir dosyası kullanıldı
- habibi key pair’in, 2000’lerin başındaki original Xbox Linux hacking group tarafından oluşturulmuş bir RSA anahtarı olduğu düşünülüyor
- Yöntem, kernel’in RSA imza kontrolünü her durumda geçerli saymak yerine public key’i kendi anahtarlarıyla değiştirip Linux loader çalıştırmaktı
- Bu, söz konusu kayıt dosyasıyla korsan içerik çalıştırmayı engellemeyi amaçlayan bir tercihti; ancak daha sonra başka gruplar kalıcı hack kurulumu için exploit dosyalarını yayımladı
- habibi public key modulus’unun Microsoft RSA public key’den yalnızca 4 bayt farklı olması dikkat çekici
- exponent’ın 3 olarak değişmesi gerekiyormuş gibi görünse de mevcut shell code payload’ları exponent’ı değiştirmiyor
- Bunun tam olarak nasıl çalıştığı kesin olarak bilinmiyor
- habibi key yöntemi, birden çok Xbox kernel sürümüyle uyumluluk nedeniyle tercih edildi
- İmza doğrulama işlevini her zaman true dönecek şekilde yamamak için kernel sürümüne göre instruction pattern eşleştirmesi gerekir
- habibi key için ise bellekte kolayca bulunabilen bir yere yalnızca 4 baytlık patch uygulamak yeterlidir
Varyant analizi: THPS3, THUG, THAW
-
Tony Hawk’s Pro Skater 3
- THPS3’te de Create-A-Park ve gap name vardı, ancak kötü amaçlı kayıt dosyası yüklendikten hemen sonra çökme yaşanmıyordu
- Oyun içinde skate yapılabiliyor, konsol ise “quit game” seçildiğinde çöküyordu
- gap name stack’e değil, heap’e kopyalanıyordu ve overflow bir sonraki heap allocation’ın allocation header’ını eziyordu
- Sonraki allocation free edildiğinde, header’daki pointer’lar cleanup routine function pointer’ının bulunduğu vtable’a ulaşıyordu
- THPS3, THPS4’ün aksine kayıt dosyası header’ını yürütülebilir data segment’ine kopyalamıyordu ve kayıt dosyası verisi de yürütülemez heap belleğinde bulunuyordu
pAllocOwnerpointer’ı ezilerek cleanup function pointer’ının yükleneceği konum kontrol ediliyor ve stack pivot ile kayıt dosyası belleğindeki ROP chain kullanılıyordu- ROP chain, yalnızca birkaç gadget ile heap’teki shellcode’u yürütülebilir data segment’ine kopyalayıp oraya atlıyordu
- Sonrasında da THPS4 için genel “hack xbox kernel” payload’unda olduğu gibi habibi key patch’i ve unsigned executable çalıştırma işlemi yapılıyordu
-
Tony Hawk’s Underground 1 & 2
- THUG’da gap name fuzzing yapıldığında access violation yerine
Buffer overrun detected!mesajıyla birlikte tam bug check oluşuyordu - Yürütülebilir dosyada stack cookie kontrolü vardı
- stack cookie, return address’in önüne yerleştirilen rastgele bir değerdir ve fonksiyon dönmeden önce bu değerin değişip değişmediği kontrol edilir
- return address’i ezmek için cookie değerini bilmek gerekir, ancak gap name yolunda bunu leak etmenin bir yolu yoktu
- gap name buffer’ının arkasında ve stack cookie’nin önünde bozulabilir değişkenler vardı, ancak bunlar hemen ardından oyun kodu tarafından ezildiği için exploit açısından faydalı değildi
- SEH exploitation da değerlendirildi, ancak stack cookie kontrolünden önce kalan kodda exception üretmenin bir yolu yoktu ve o noktada SEH chain’i gezecek bir exception handler da kayıtlı değildi
- THUG2’nin Xbox sürümünde de aynı nedenle gap name tabanlı exploit mümkün değildi
- Ancak başka
strcpybug’ları ve heap tabanlı olarak exploit edilebilen bug’lar mevcuttu - PlayStation 2, PC ve muhtemelen GameCube sürümleri stack cookie olmadan derlendiği için gap name buffer üzerinden exploit edilebiliyordu
- THUG’da gap name fuzzing yapıldığında access violation yerine
-
Tony Hawk’s American Wasteland
- THAW, THUG 1·2’den sonraki bir oyun olduğu için stack cookie içerdiği düşünülüyordu, ancak Xbox sürümü stack cookie olmadan derlenmişti
- gap name buffer overflow’a açıktı ve exploit neredeyse THPS4 ile aynı şekilde kuruluyordu
THPS4 ağ RCE’si: kayıt dosyası olmadan istemci hack’leme
- Kayıt dosyası exploit’i bellek kartı gerektirdiği için, giriş eşiği daha düşük bir saldırı yüzeyi olarak çok oyunculu LAN oyunu seçildi
- Create-A-Park ile oluşturulan bir park LAN multiplayer’da kullanıldığında host kayıt dosyasını ağ üzerinden gönderiyor ve client bunu yüklüyordu
- Buradan, kötü amaçlı bir park dosyası gönderilerek client konsolunun hack’lenebileceği varsayıldı
- Host’un kendisini hack’lememesi için oyun executable’ı değiştirilerek
strcpybug’ı engellendi ve ek fonksiyonlar için code segment de eklendi - İlk başta client host’a bağlanabiliyor ve normal şekilde skate yapabiliyordu, ancak payload çalışmıyor, buffer overflow da tetiklenmiyordu
- client belleğindeki park file verisi exploit dosyasındakinden farklı şekilde değişmişti
- host, park file’ı yükledikten sonra bunu bellekte yeniden kaydedip ortaya çıkan sonucu client’a gönderdiği için exploit verisi bozuluyordu
- Bu function call NOP’landığında client kötü amaçlı park file’ı alıp compromise oldu ve LED rengi değişti
- Ağ yolunda kayıt dosyası header’ı data segment’ine kopyalanmadığı için, THPS4 yerel exploit’indeki shellcode kopyalama stub’ı kullanılamıyordu
- Bunun yerine THPS3’e benzer bir ROP chain ile shellcode yürütülebilir belleğe kopyalandı
THUG kaynak kodunun bulunması ve ağ kodunun kullanılması
- Ağ üzerinden yardımcı payload executable’ını client’a aktarmak gerekiyordu, ancak yerel kayıt dosyası exploit’indeki gibi save game folder içine birlikte dosya koymak mümkün değildi
- executable’ı yazılmış CD’den ya da yerel ağ adresinden yükleme yöntemleri de değerlendirildi, ancak tercih edilmedi
- Xbox winsock implementation varsayılan olarak secure socket connection kullandığı için, Xbox security layer’ını bir Python script ile yeniden üretmek gerekiyordu
- park save file ile ilgili materyal aranırken
Sk4Ed_Deaddize aramasıyla GitHub’dakithugdeposu bulundu- Bunun bir homebrew tool değil, Tony Hawk’s Underground oyununun tam kaynak kodu olduğu anlaşıldı
- Doğrudan THPS4 olmasa da kod tabanı yeterince benzerdi ve networking code ile hook yazımında kullanıldı
- Kaynak kodunda park file loading code ve
strcpybug’ının bulunduğu tam satır yer alıyordu- Visual Studio project file yeniden oluşturularak ve birkaç compiler error düzeltilerek, son oyun asset’leriyle çalışabilen bir build üretilebildi
- Nihai sürümle tamamen aynı olmasa da çok yakın bir kod olduğu görülüyordu
- Hedef, basit RCE’nin ötesine geçerek match’e bağlanan konsolda sessizce RCE elde etmek, ardından unsigned code çalıştırmayı mümkün kılmak ve oyun sırasında yardımcı executable’ı aktarmak şeklinde değişti
Yürütmenin geri kazanılması ve asenkron dosya aktarımı
- client oyunu oynamayı sürdürürken payload aktarımını yapmak için, shellcode çalıştıktan sonra oyunun yürütme akışının geri kazanılması gerekiyordu
- ROP chain, stack pivot’tan önce mevcut stack pointer’ı kaydedecek ve shellcode çalıştıktan sonra daha sonra geri yükleyecek şekilde değiştirildi
- Ardından shellcode yürütülebilir belleğe kopyalanıp oraya atlanıyordu
- Oyunun networking system’i, message ID ve handler function kaydı yapıyor, ardından alınan mesajın ID’sine uygun handler’ı çağırıyordu
- Kullanılmayan bir message ID kaydedilerek basit bir dosya aktarım protokolü uygulandı
- client bağlandığında aktarımı başlatmak için host’a
MSG_ID_PAYLOAD_REQUESTgönderiyordu - host,
MSG_ID_PAYLOAD_DATAmesajlarıyla payload verisini gönderiyordu - client
PAYLOAD_MSG_ID_ENDaldığında aktarım tamamlanıyordu
- client bağlandığında aktarımı başlatmak için host’a
15 yıllık bellek sızıntısı ve hot patch
- Dosya aktarımı sırasında client konsolu bir null pointer dereference nedeniyle çöküyordu
- network data allocator NULL döndürüyordu ve networking memory pool’daki boş byte sayısı 0 oluyordu
- THUG kaynak kodunda message data buffer’ının free edildiği kod vardı, ancak THPS4’ün yayımlanmış build’inde bu düzeltme yoktu
stream_desciçindekip_databuffer’ı her mesajdan sonra serbest bırakılmadığı için networking memory pool tükeniyordu- Normal multiplayer kullanımında, uzun süre kalınmadıkça bu muhtemelen sorun yaratmıyordu
- Exploit, client koduna hook atarak
p_desc->p_databuffer’ını doğru free function ile serbest bırakacak şekilde hot patch uyguluyordu - hot patch’ten sonra host ve client konsolları arasında dosya aktarımı başarılı oldu ve client
nyan-catexecutable’ını çalıştırdı- Aynı exploit daha sonra tunneling app kullanılarak başka bir bölgedeki bir arkadaşın konsolunda da uzaktan test edildi
Nihai original Xbox ağ exploit akışı
- client, kötü amaçlı host console’a bağlanır ve ağ üzerinden “Hack Xbox” park dosyasını alır
- client park dosyasını parse ederken buffer overflow oluşur ve stack’teki return address üzerine yazılarak ROP chain başlatılır
- ROP chain, tam shell code payload’unu yürütülebilir bir bellek alanına kopyalar ve oraya dallanır
- shell code, oyun çalışmasına geri dönmeden önce gerekli hook ve patch’leri ayarlar ve player’ı maça spawn eder
- player oyun içinde kayarken host, executable file’ı client’a gönderir ve client bunu HDD’ye kaydeder
- dosya aktarımı tamamlandıktan sonra shell code, client kernel’ini habibi key kullanacak şekilde patch’ler ve aktarılan secondary executable’ı boot eder
- LED rengi değiştirilmezse kullanıcı, başka bir application aniden boot edene kadar ilerlemenin farkına varmakta zorlanır
Xbox 360: THAW ve 4548 kernel
- Xbox 360 için Tony Hawk’s American Wasteland de gap name buffer overflow açığına karşı savunmasızdır
- amaç, console’u daha yeni bir kernel version’da exploit etmekti, ancak yeni bir hypervisor bug olmadan bu mümkün değildi
- bunun yerine THAW’daki
strcpybug’ı ile mevcut 4548 kernel system call handler bug’ı birleştirilerek Xbox 360’ın yalnızca yazılımla çalışan ilk exploit’i oluşturulabildi - Xbox 360’taki mevcut King Kong hack’i, kernel memory üzerinde arbitrary write gerçekleştirmek ve system call handler bug’ını exploit etmek için modified shader file kullanıyordu
- bu yöntem, modified King Kong disc kullanabilmek için console’un açılmasını ve DVD drive firmware’inin değiştirilmesini gerektiriyordu
- game save bug’ı, ROP chain’i başlatan farklı bir entry point olabilir
Xbox 360 kayıt dosyası imzalama ve geliştirme konsollarının rolü
- Xbox 360 game save file’ları, her console’a özgü bir RSA key pair ile imzalanır
- her console’un key store’unda, game save imzalamada kullanılan cryptographic key bulunur
- farklı bir console’un kayıt dosyasını doğrulayabilmesinin nedeni, RSA public key’in save file header’ında yer almasıdır
- bu public key’in kendisi de yalnızca Microsoft’ta bulunan başka bir RSA key pair ile imzalanır
- header’a herhangi bir public key koyup doğrulamadan geçmek mümkün değildir
- keyfi olarak değiştirilmiş bir save file’ı başka bir console’da kullanmak için herhangi bir Xbox 360 console’un decrypted key store’u gerekir
- Xbox 360 hacking’in çıkış noktası, development console ve SDK sızıntısıydı
- çalıştırılabilir kod şifrelenmiş olduğundan, dışarıdan code inspect edilemezse bug bulmak mümkün değildi
- development console ve SDK, executable code decrypt etme ile boot chain, hypervisor ve game code reverse engineering için gerekli bilgileri sağladı
4548 system call handler bug’ı
- Xbox 360’ta hypervisor real mode ve kernel mode bulunur
- hypervisor real mode en ayrıcalıklı moddur
- kernel mode’da OS ve game çalışır
- CPU’da, L2 cache’in yanında memory encryption ve hashing’den sorumlu bir cryptography unit bulunur
- kernel mode’da hypervisor page’leri encrypted + hashed olarak görünür; bunların üzerine keyfi biçimde yazılırsa hypervisor erişiminde console durur
- real mode’da 64-bit physical address’in üst 32 biti encryption ve hashing kontrolü için kullanılır
0x80000000.00000000mask’i uygulanırsa encryption ve hashing’i yok sayan memory access mümkün olur- kernel mode’un hypervisor’a physical address verebildiği yerlerde üst 32 bit mutlaka temizlenmelidir
- normal system call handler, system call ordinal’ini
slwikomutuyla 2 bit sola kaydırır ve sonucun üst 32 bitini atarak yalnızca 32-bit offset kullanır - 4548 kernel’in system call handler’ı
slwiyerinesldikullanırsldi64-bit çalıştığı için r0’ın üst 32 biti de table index offset hesabına dahil olur- ordinal range check yalnızca r0’ın alt 32 bitine uygulanır
- örneğin
0x20000000.0000003F, range check’i geçerken0x80000000.000000FCoffset’i üretip korunmasız memory access’e yol açabilir
- bu değişikliğin, geliştiricinin kasıtlı bir düzenlemesinden çok bir compiler bug olma ihtimalinin yüksek olduğu değerlendirilir
Xbox 360 exploit yapısı
- kernel mode'da şifrelenmiş hypervisor bellek görünümünün üzerine yazmak normalde konsolun durmasına yol açar, ancak system call işleyicisinin üst protection bit'i ayarlanmış bir adresteki function pointer'ı okuması sağlanırsa, fault olmadan üzerine yazılan değer okunabilir
- exploit aşamaları
- shell code belleğe yüklenir ve physical address alınır
- kernel memory manager değişkeni değiştirilerek şifrelenmiş hypervisor bellek görünümü yazılabilir bir address range olarak açığa çıkarılır
- hypervisor system call function pointer'ı
mtctr r4; bctrinstruction sequence adresiyle üzerine yazılır - r0'a kötü amaçlı ordinal konur ve r4'e shell code physical address'ine
0x80000000.00000000maskesi OR'lanmış değer yerleştirilir - system call instruction'ı çalıştırılarak hypervisor'ın üzerine yazılmış function pointer'ı okuması ve
mtctr r4; bctrüzerinden shell code'a atlaması sağlanır
- THAW kayıt dosyası exploit'i PowerPC ROP chain kullanır
- Ida-Sploiter IDA eklentisi değiştirilerek PowerPC gadget aramayı destekler hâle getirilmiştir
- exploit'in tamamı 24 ROP gadget'tan oluşur
- THAW Xbox 360 genel akışı
- gap name buffer overflow ile return address ilk ROP gadget ile üzerine yazılır
- stack pointer, save buffer içindeki ROP chain'e pivot edilir
MmAllocatePhysicalMemoryExile hypervisor shell code için physical memory ayrılırmemcpyile shell code kopyalanır veMmGetPhysicalAddressile physical address alınır- şifrelenmiş hypervisor bellek görünümü yazılabilir olacak şekilde map edilir
- system call function address,
mtctr r4; bctrsequence'i ile üzerine yazılır - kötü amaçlı system call ordinal'i ve shell code physical address'i ile
syscallçalıştırılır - hypervisor code execution elde edildikten sonra LED rengi değiştirilir ve executable RSA signature check yamanır
- kernel mode ROP chain'e dönülür,
ObCreateSymbolicLinkile HDD klasörü map edilir veXLaunchNewImageile imzasız ikincil payload çalıştırılır
- Bu yöntem, herhangi bir Xbox 360 OS version'ında THAW'ın
strcpyhatasıyla ROP çalıştırma olanağı sağlar, ancak tam hypervisor code execution yalnızca 4548 kernel üzerinde mümkündür- yeni bir hypervisor bug'ı bulunursa bu entry point ile birleştirilerek daha yeni kernel version'larına da uygulanabilir
2024'te yayın ve ek platform portları
- 2024'te Tony Hawk exploit'leri derlenip yayımlandı
- Aynı
strcpyhatası, Tony Hawk serisinin 5 iterasyonunda ve birçok console ile handheld platformda bulunuyor -
PlayStation 2
- THPS4 network RCE exploit'i PlayStation 2 sürümüne portlandı
- PCSX2 ya da başka bir konsol ve yalnızca THPS4 diski ile ağ üzerinden konsol hacklenebiliyor
- exploit, ağ üzerinden uLaunchElf gönderiyor ve aktarım tamamlanınca çalıştırıyor
- sonrasında USB stick gibi başka medyalardan FreeMcBoot veya FreeHDBoot installer'ı yüklenebiliyor
- PS2 save game exploit'inin kullanışlılığı düşüktür
- memory card'a dosya kopyalamanın bir yolu varsa doğrudan FreeMcBoot kurulabilir
- FreeMcBoot memory card'ı Amazon'da 15 dolara satın alınabilir ya da phat konsol ve network adapter ile FreeHDBoot kullanılabilir
-
GameCube
- THPS4 save game exploit'i GameCube sürümüne portlandı
- network RCE veya diğer save game exploit sürümleri portlanmadı
- GameCube memory card'ına dosya kopyalamak kolay değildir ve önceden hacklenmiş save file içeren memory card'lar eBay'de 50 doların üzerinde fiyata satılmıştır
- Tony Hawk oyununun GameCube sürümünde network support bulunmadığından, network adapter olsa bile network exploit kullanılamaz
- hâlihazırda birden fazla game save exploit bulunduğu ve kalıcı bir software hack olmadığı için birçok kullanıcı modchip'i tercih ediyor
-
Windows
- THUG PRO için de bir game save exploit'i yapıldı; bug report 7 yıl önce iletilmişti, ancak o dönemde düzeltmeye ilgi yoktu
- Windows'ta exploit'in sağladığı bir değer olmadığı için yayımlanmıyor
- PC için Tony Hawk oyunları aynı
strcpyhatasını içeriyor ve exploitable durumda - network play'de exploit edilebilen başka
strcpyhataları da var - ASLR'nin zorunlu olarak etkinleştirilmesi ve Administrator olarak çalıştırılmaması öneriliyor
Yayınlanan materyaller
- Tüm source code ve yamalı game save file'lar GitHub üzerinde yayımlandı
- Tek bir
strcpyhatası, birden çok platformda kayıt dosyası exploit'ine, network RCE'ye ve Xbox 360 için yalnızca yazılımla çalışan bir exploit entry point'ine dönüştü
1 yorum
Hacker News yorumları
Habibi anahtarındaki daha ilginç nokta, açık anahtar modülünün Microsoft RSA açık anahtarından yalnızca 4 bayt farklı olması.
Rastgele bir 2048 bit tamsayının önemsiz biçimde çarpanlarına ayrılabilme olasılığı epey var; gerçek olasılığı bilmiyorum ama kabaca 2^-32 düzeyinde tahmin edilebilir.
Muhtemelen açık modülün 4 baytını rastgele değiştiren ya da artıran, sonra yaklaşık 1 milisaniye çarpanlara ayırmayı deneyip başarılı olunca duran bir kod kullanmışlardır.
Sonuçtaki açık modülde çok sayıda küçük çarpan bulunma olasılığı yüksek; RSA modülü normalde tam olarak iki asal sayının çarpımıdır, ama e ile aralarında asal olduğu sürece çarpan sayısı daha fazla olsa da matematik hâlâ çalışır.
Şanslıysanız ve RSA uygulaması tam olarak iki asal çarpan kullanıyorsa, çarpanlardan birinin 3 olduğunu zaten bildiğiniz için açık anahtarı 3’e bölüp diğer asal çarpanı elde etmek yeterli olur.
Wikipedia’ya göre RSA açık anahtar yapısında N büyük bir yarı-asal olmalı ve e, φ(N) ile aralarında asal olmalıdır; N’i çarpanlarına ayıran kişi özel anahtarı elde edebilir. Xbox hack’i bağlamında N, asal 3’e bölünebilir hâle getirilirse diğer asal N/3 olur; yani çarpanlara ayırma başarılmış sayılır.
Habibi anahtarıyla imzalama kodu https://github.com/XboxDev/xbedump/blob/b8cd5cd0f8b1cbc4e64f... adresinde. Son 4 baytı 0x89, 0x9c, 0x90, 0x6b olarak değiştirdikten sonra 3’e bölüyor ve bu değerle uygun özel anahtarı üretiyor.
Uygulama, rowhammer ile açık anahtarı bozup ardından bu çarpanlara ayırmayı kullanarak yeni karşılık gelen özel anahtarı üretme biçimindeydi. SSH ve GPG anahtarlarında çalıştı; pratiklik için anahtarın bulunduğu sayfanın içeriğinin bilindiği gibi varsayımlar yapıldı.
Kullanılabilir hesaplama süresine göre ampirik başarı oranları Figure 7’de, analitik değerlendirme 3. bölümde, gerçek yöntemin açıklaması ise 4.4. bölümde yer alıyor.
https://www.usenix.org/system/files/conference/usenixsecurit...
Örneğin 2’den 499’a kadarki asal sayılarla bölmeyi deneyip değer 1 olursa başarılı sayan, aksi hâlde Miller–Rabin’i 20 kez çalıştıran kodla rastgele 2048 bit tamsayıyı tamamen çarpanlarına ayırmak benim ortamımda yaklaşık 100 denemede mümkün oldu.
Bu başarının ne kadar akıl almaz olduğunu ifade etmek zor.
Xbox 360’ı bir Tony Hawk oyununun park adıyla softmod etmek ve 24 aşamalı bir ROP zinciri kullanmak gerçekten etkileyici.
Hypervisor için kısa bir ağıt, kısa ve pratik bir analiz, hemen akla gelen x360 botnet fikriyle birleşince, gelmiş geçmiş en güçlü Xbox 360 nostalji darbelerinden biri gibi hissettiriyor.
“Şansımız varsa strcpy’dir” kısmı eğlenceli. Aslında strncpy olmalıydı; güvenlik ekipmanı savunuculuğuyla ünlü Tony Hawk, muhtemelen daha güvenli string kopyalamayla ilişkilendirilmeyi isterdi.
Kaynak hedefe sığmıyorsa kırpmanın kabul edilebilir olup olmadığı, tüm işlemin durdurulup durdurulmayacağı ya da hedef tamponun yeniden ayrılıp ayrılmayacağı gibi uygulamaya özgü işlemler gerekir. strncpy neredeyse her zaman yanlış şeyi yapar.
Temelde strncpy neredeyse hiç kullanılmamalıdır;
struct dirent { unsigned short inode; char name[14]; };gibi sabit boyutlu alanlar içindir.Bu tür durumlarda bile padding baytlarının nul yerine çoğu zaman boşluk olması gerekir ve strncpy standart kütüphaneye hiç girmemeliydi.
C/C++ kullanırken standart C fonksiyonlarına göre daha kolaydı; tamponun çok küçük olması veya tamsayı taşması gibi yaygın hata durumlarını ele alıyordu ve tüm fonksiyonlar hata kodu döndürdüğü için hata kontrolü de kolaydı.
Bu durumda strcpy yerine
StringCchCopyW()veyaStringCbCopyW()daha iyi bir seçim olur.Bu exploit’in THUG PRO için de geçerli olması biraz üzücü.
Tony Hawk serisinin rekabet sahnesi, THPS1+2 remake’i gibi kısa süreli bir istisna dışında neredeyse 20 yıldır ölüydü ve bu mod hâlâ oynanıyor.
Modun kendisi de artık 10 yılı geçti ve orijinal geliştiriciler ayrılmış görünüyor; Ryan bildirdiğinde kimsenin bunu düzeltmeye çalışmamasının nedeni de bu. Ama artık bu modu kullanmak, tüm PC’nin ele geçirilmesi riski nedeniyle zorlaştı.
Umarım bu yazı, modu yamalamaya istekli birine ulaşır.
O kaynak yalnızca konsol sürümü içindi; Windows için derleme varsayımı Xbox Windows değil, araçlar içindi; bu yüzden pek çok bölüm tamamen farklı çalışıyordu.
“So what's the habibi key?” metninden önceki bölüm başlığı simgesi gibi görünen şey aslında tıklanıp açılan bir HTML details bölümü; ilginizi çekiyorsa basıp bakmanız gerekir.
Merak ettiğim şu: Habibi anahtarının Linux konsol grubunda korsan içerik kullanımını engellemek için özel olarak kullanıldığı hikâyesi doğruysa, buna karşılık gelen özel anahtar nerede, ne zaman ve nasıl yayımlandı ya da sızdı?
Yazar, Microsoft anahtarı ile Habibi anahtarı arasındaki 4 baytlık farkı yamalayarak “imzasız” bir çalıştırılabilir dosyayı, aslında Habibi özel anahtarıyla imzalanmış bir çalıştırılabilir dosyayı çalıştırmış; yani özel anahtarı ele geçirmiş olduğu açık görünüyor.
Özel anahtar, açık anahtardan önemsiz bir şekilde geri elde edilebildiğinden özellikle yayımlanacak ya da sızdırılacak bir şey yoktu.
Temelde, ilk 007: Agent Under Fire kayıt dosyası hack’inin içine gömülmüş küçük bir kriptografi CTF’siydi; o kayıt dosyası hack’i de başlı başına epey obfuscate edilmiş bir CTF’ye yakındı. Hem korsan kullanıcılara gününü göstermek gibi bir niyet hem de diğer tersine mühendisçilere yönelik bir meydan okuma varmış gibi görünüyor.
Gerçekten harika. Bir süredir PSX decompilation ile biraz uğraşıyorum; orada da buna benzer çok şey var.
İlginç şekilde
memmovegibi şeyler SDK kütüphanesiyle[0] linkleniyor, amastrcpyBIOS’un sağladığı bir fonksiyon.Daha sonraki SDK sürümlerinde bu, kütüphane sürümüyle yamalanabiliyordu; fakat 1997’ye kadar bile böyle değildi.
0 - https://github.com/Xeeynamo/sotn-decomp/blob/master/src/main...
Artık N64 oyunları decompiler’lar aracılığıyla PC’ye port edildiğine göre insan umutlanıyor.
“Bu oyunların zaten PC sürümü var” tepkisi gelebilir; ama N64 oyununu yeniden derleyip efektleri shader yerine saf texture’lara ya da daha basit efektlere çevirirseniz, 2009 model düşük seviye netbook gibi yavaş cihazlarda bile neredeyse her yerde çalışabilir.
Super Mario 64’ün 3DFX API’ye port edilmiş bir örneği de var. N64 framebuffer’ına karmaşık biçimde erişen bir oyun, o microcode’u taklit etmek için OpenGL 3.3 gerektirebilir; ancak engine Pentium III sonrası donanımlarda çok hızlı çalışıyorsa geri kalanını GL 2.1 hızlandırmasıyla çalıştırıp yalnızca bazı kısımları yazılımla taklit etmek de zor değildir.
Bu tür exploit analizlerini birçok farklı biçimde çok okudum; bundan 100 tane daha okuyacak olsam daha da mutlu olurum.
Konsol geliştirmede hatalı güvenlik zihniyetini gösteren iyi bir örnek gibi görünüyor.
“Kayıt verilerini yalnızca biz kullanabiliyoruz, o yüzden yalnızca bizim yazdığımız şeyi parse etmemiz yeterli” düşüncesi konsol tarafında yaygın; ama insanların yapay olarak oluşturulmuş kayıt verileri hazırlayabilmesi bakımından temelden yanlış.
Bundan bağımsız olarak konsolun kullanıcıyı düşman olarak görmemesi gerekir; ama yine de böyle yapacaksa, oyunun da bu tutuma uygun bir güvenlik zihniyetine sahip olması gerekir.
Kullanıcının yapabileceği şeyleri sınırlamazsanız çevrimiçi oyun hilelerini nasıl engelleyebileceğinizi bilmiyorum.
Tony Hawk’ı savunmak gerekirse, o bir profesyonel kaykaycı; güvenlik analisti değil.
90’ların sonu ve 2000’lerin başında klavye başında geçirdiği sınırlı zaman, buffer overrun denetlemek için değil, yakında ikonikleşecek bir seride 900 McTwist’in doğal hissettirmesini sağlamak için harcanmış olmalı.
Çocukken duyduğum efsaneyi kontrol etme fırsatı buldum. 720’yi ilk başaran kişi Tony Hawk mıydı?
Muhtemelen “kayda geçen ilk” anlamındadır; ama biri bunu daha önce yapmış olsaydı büyük ihtimalle ortalıkta anlatırdı ve bunu yapabilecek kişi de zaten büyük olasılıkla profesyonel bir kaykaycı olurdu.