Orijinal doküman:
https://rdist.root.org/
Türkçe tercüme:
PS3 Hypervisor’ının Nasıl Hacklendiği
27 Ocak 2010 ~ Nate Lawson
George Hotz, daha önce iPhone'u hacklemesiyle tanınan biri, Playstation 3'ü hacklediğini açıkladı ve ardından exploit detaylarını paylaştı. Bu konuda birçok makale yazıldı ancak hiçbirinde aslında kodun analizi yapılmadı. Çeşitli çelişkili raporlar nedeniyle, bu exploitin anlaşılmasına yardımcı olacak bazı ek analizler sunmak istiyorum.
PS3, Xbox 360 gibi güvenlik denetimi için bir hypervisor'a (sanallaştırma denetleyicisi) dayanıyor. Ancak, 360'tan farklı olarak, PS3 kullanıcıların dilerlerse Linux çalıştırmasına izin veriyor, fakat bu yine de hypervisor tarafından yönetiliyor. Hypervisor, Linux çekirdeğinin GPU gibi bazı donanımlara erişmesini engelliyor. Hypervisor’ın ele geçirilmesiyle donanıma doğrudan erişim sağlanabilir ve daha düşük yetkili kodlar izlenip kontrol edilebilir.
Hypervisor'ı hacklemek, korsan oyunlar çalıştırmak için gereken tek adım değil. Her oyunun, ROM Mark adı verilen bir diskte bulunan bir şifreleme anahtarı vardır. Sürücü yazılımı bu anahtarı okur ve oyunun yüklenmesi sırasında şifreyi çözmek için hypervisor’a iletir. Bu anahtarı ortaya çıkarmak için hypervisor’ın alt edilmesi gereklidir. Bir başka yaklaşım, Blu-ray sürücü yazılımını ele geçirmek veya anahtarları çıkarmadan şifre çözme kodunu köle olarak kullanıp her oyunun şifresini çözmektir. Bunun ardından, oyundaki yazılım koruma önlemleri devre dışı bırakılmalıdır. Şifrelemenin altındaki bazı kendi kendini koruma önlemlerinin olup olmadığı bilinmiyor. Bazı geliştiriciler sadece şifrelemeye güvenebilirken, diğerleri SecuROM gibi bir şey kullanabilir.
Hypervisor kodu, ana CPU (PPE) ve yedi Cell yardımcı işlemcisinden (SPE) biri üzerinde çalışır. SPE thread’inin izole modda başlatıldığı görülüyor; bu, özel koduna ve veri belleğine erişimin hypervisor’dan bile engellendiği anlamına gelir. Önyükleyici ve ardından hypervisor’ı şifre çözmek için kullanılan kök donanım anahtarları yalnızca donanımda bulunur, muhtemelen eFUSE'lar aracılığıyla. Bu aynı zamanda her Cell işlemcisinin bazı benzersiz anahtarlara sahip olabileceği ve şifre çözmenin tek bir global kök anahtara bağlı olmayabileceği anlamına gelir (bazı makalelerde global bir kök anahtar olduğu iddia edilse de).
George’un hack’i, “OtherOS” özelliği aracılığıyla Linux başlattıktan sonra hypervisor’ı etkisiz hale getirir. Bu exploit, keyfi okuma/yazma RAM erişim işlevleri eklemek ve hypervisor’ı dökümlemek için kullanılmıştır. Lv1'e erişim, sürücü yazılımına veya oyunlara karşı diğer saldırıları başlatmak için gerekli ilk adımdır.
Yaklaşımı zekice ve “glitching attack” (hata enjeksiyonu saldırısı) olarak bilinir. Bu tür bir donanım saldırısı, donanımın bir şekilde işe yarayacak şekilde yanlış davranmasına neden olmak için dikkatlice zamanlanmış bir voltaj darbesi göndermeyi içerir. Bu, akıllı kart korsanları tarafından uzun süredir kartları kilitsiz hale getirmek için kullanılan bir yöntemdir. Tipik olarak, korsanlar döngü bitirme koşulunu hedef alacak şekilde darbe zamanlamasını yapar, döngünün sonsuza kadar devam etmesine ve gizli ROM’un içeriğini erişilebilir bir veriyoluna dökmesine neden olur. Saat hattı genellikle hataya uğratılır ancak bazı veri hatları da kullanılabilir bir hedeftir. Darbe zamanlaması her zaman kesin olmak zorunda değildir, çünkü donanım, spesifikasyon dışı bazı koşullara tolerans gösterecek şekilde tasarlanmıştır ve saldırı genellikle birçok kez tekrarlanabilir ve sonunda başarıya ulaşır.
George, PS3’ünün bellek yoluna tek bir hat üzerinden bir FPGA bağladı. Çipe çok basit bir mantıkla programlama yaptı: tetiklendiğinde çıkış pinine 40 ns'lik bir darbe gönder. Bu, birkaç satır Verilog ile yapılabilir. Darbe süresi nispeten kısa olsa da (PS3’ün yaklaşık 100 bellek saat döngüsü kadar), tetikleme son derece belirsizdir. Ancak, RAM'i başarı olasılığını artırmak için yazılım kullandı.
Amacı, tüm belleği (hypervisor dahil) haritalayan ana segmenti okumak/yazmak için erişim sağlamak amacıyla, hashlenmiş sayfa tablosunu (HTAB) ele geçirmekti. Exploit, bellek yönetimiyle ilgili hypervisor’daki çeşitli sistem çağrılarını yapan bir Linux çekirdek modülüdür. Bir sanal segment için HTAB olarak kullanmak üzere tahsis eder, tahsisi iptal eder ve ardından tahsis edilen belleği kullanmaya çalışır. Glitch, hypervisor’ı RAM’in gerçek durumundan ayırmayı başarırsa, saldırganın etkin HTAB’yi üzerine yazmasına ve böylece herhangi bir bellek bölgesine erişimi kontrol etmesine izin verir. Bunu biraz daha açalım.
İlk adım bir tampon ayırmaktır. Exploit, ardından hypervisor’dan bu tamponu işaret eden birçok HTAB eşlemeleri oluşturmasını ister. Bu eşlemelerden herhangi biri, tamponu okumak veya yazmak için kullanılabilir, bu sorun değildir çünkü çekirdek buna sahiptir. Unix terimleriyle düşünürsek, bunlar tek bir geçici dosyaya sahip birden fazla dosya tanıtıcısı gibidir. Herhangi bir dosya tanıtıcısı kapatılabilir, ancak tek bir açık dosya tanıtıcısı kaldığı sürece dosyanın verilerine erişilebilir.
Sonraki adım, tüm eşlemeler serbest bırakılmadan tamponun tahsisinin iptal edilmesidir. Bu sorun değildir, çünkü hypervisor her bir eşlemeyi yok eder ve ardından geri döner. Lv1_release_memory() çağrıldıktan hemen sonra, exploit kullanıcıya hata tetikleme düğmesine basmasını söyler. Bu tampona bu kadar çok HTAB eşlemesi olduğundan, kullanıcı glitch tetiklemesini hypervisor bir eşlemeyi serbest bırakırken başarılı bir şekilde gerçekleştirme şansına sahiptir. Glitch, muhtemelen hypervisor’un bir veya daha fazla yazma döngüsünün belleğe ulaşmasını engeller. Bu yazmalar, her bir eşlemeyi serbest bırakmak için tasarlanmıştır, ancak başarısız olurlarsa eşlemeler bozulmadan kalır.
Bu noktada, hypervisor artık serbest bırakılmış bir tamponu işaret eden bir veya daha fazla okuma/yazma eşlemesi bulunan bir HTAB’ye sahiptir. Böylece, çekirdek artık bu tampona sahip değil ve onu yazamaması gerekir. Ancak, çekirdek hala bu tampona işaret eden bir veya daha fazla geçerli eşlemeye sahiptir ve aslında içeriğini değiştirebilir. Ancak bu henüz yararlı değildir, çünkü bu sadece boş bir bellektir.
Exploit daha sonra bir sanal segment oluşturur ve ilişkilendirilmiş HTAB'nin serbest bırakılan tamponun adresini kapsayan bir bölgede olup olmadığını kontrol eder. Değilse, biri bunu yapana kadar sanal segmentler oluşturmaya devam eder. Artık kullanıcı, hypervisor’ın bunu tek başına kontrol etmesi yerine, doğrudan bu HTAB’ye yazma yeteneğine sahiptir. Exploit, ana segmente tam erişim sağlayacak bazı HTAB girdilerini yazar ve bu, tüm belleği haritalar. Hypervisor bu sanal segmente geçtiğinde, saldırgan artık tüm belleği ve dolayısıyla hypervisor’ı kontrol eder. Exploit, herhangi bir bellek adresine doğrudan okuma/yazma erişimi sağlayan iki sistem çağrısı kurar ve ardından çekirdeğe geri döner.
Bu saldırının bir modçip içine paketlenmesi oldukça olasıdır, çünkü glitch, dar bir aralıkta olsa da, çok hassas bir şekilde zamanlanmak zorunda değildir. Bir mikrodenetleyici ve darbe için biraz analog devre ile bu oldukça güvenilir olabilir. Bununla birlikte, dump’lanan hypervisor’ın tersine mühendisliği yapıldıktan sonra bir yazılım hatası bulunmasının daha olası olduğu ve bunun kitleler tarafından kullanılmak üzere dağıtılacağı düşünülüyor.
Sony, PS3’ün güvenliği konusunda oldukça iyi bir iş çıkarmış görünüyor. Her şey oldukça uyumlu bir şekilde bir araya geliyor, belirgin zayıf noktalar yok. Ancak, konuk işletim sistemi çekirdeklerine verilen düşük seviyeli erişim, hypervisor’daki herhangi bir hatanın, sunduğu geniş API nedeniyle saldırgan kod tarafından erişilebilir olma olasılığını artırıyor. Basit bir çözüm, her bir eşlemeyi değiştirdikten sonra durumu tekrar okumak olabilir. Eğer yazma herhangi bir nedenle başarısız olursa, hypervisor bunu görür ve durur.
Sony'nin bu tür saldırıları önlemek için gelecekteki güncellemelerle nasıl yanıt vereceğini görmek ilginç olacak.
[Düzenleme: geohot'un yorumuna dayalı olarak sanal segment tahsisi tanımını düzelttim.]