When Random Isn't
- Yaklaşık 10 yıl öncesine ait bir anı; gerçek kodu kaybettiğim için bazı kısımları tam hatırlamıyor olabileceğimi anlayışla karşılayın.
- Bilgisayar güvenliğini seven herkesin keyif alabilmesi için bazı ayrıntılar basitleştirildi.
- 14 yaşındayken World of Warcraft'ı keşfettim ve bağımlısı oldum.
- Oyunun kullanıcı arayüzünü değiştirebilen eklentileri keşfettim ve kendim yapmaya başladım.
- Lua programlama diliyle yazılan bu eklentiler birkaç
.lua kaynak dosyasından oluşuyordu.
- Oyunun kendi yazdığım kaynak kodu yükleyip çalıştırması beni büyülemişti.
Add-on security
- Kullanıcıların programlanabilir eklentilere sahip olması, botlara yol açabileceği için kötü bir fikir gibi görünebilir.
- Blizzard'ın kurduğu sistem, keyfi programlama davranışlarını engellemek için oldukça zekiceydi.
- Kullanıcı arayüzü öğelerinin çoğu dekoratifti ya da bilgi amaçlıydı ve tamamen serbestti.
- Karakterin canını gösteren API çağrısı gibi bilgi toplama API'leri kısıtlanmamıştı.
- Ancak bazı API çağrıları, yalnızca resmi Blizzard kodu tarafından çağrılabilecek şekilde korunuyordu.
- Oyunda gerçekten eylem gerçekleştirmeyle ilgili API'lerin çoğu korunuyordu.
- Dünya konumu ve kamera yönünü alan API de bir noktada koruma altına alınmıştı.
- Belirli bir büyüyü yapan bir düğme oluşturmak istediğinizde, tıklandığında güvenli ortamda kod çalıştıran özel bir düğme oluşturabiliyordunuz.
- Bu düğmeler savaş sırasında oluşturulamıyor, yok edilemiyor veya taşınamıyordu; böylece savaş içi otomasyon engelleniyordu.
- Güvenli ortam, hangi büyünün yapılacağını programatik olarak ayarlayabiliyordu, ancak keyfi otomasyon için gereken bilgi toplamaya izin vermiyordu.
A backdoor channel
- Birkaç yıl sonra daha "ciddi" programlamaya ilgi duymaya başlayınca World of Warcraft'ı neredeyse tamamen bıraktım.
- Yine de güvenli ortamı etkisiz hale getirme fikri aklımdan çıkmıyordu.
- Üçüncü taraf yazılım kullanmak yerine, teknik olarak izin verilen araçlarla bu meydan okumayı çözmek istedim.
random fonksiyonunun güvenli ortamda izin verilen işlevler listesinde olduğunu fark ettim ve bununla bilgi sızdırmanın bir yolunu tasarladım.
Random number generator woes
random'ın aslında C'deki rand fonksiyonuna basit bir sarmalayıcı olduğu ortaya çıktı.
rand implementasyonu basit ve zayıf bir doğrusal eşlenik üreteçti.
- RNG'nin iç durumunu tersine mühendislikle çıkarıp onun üzerinden bilgi aktarmanın bir yolunu geliştirdim.
Putting it together
- RNG'nin iç durumunu tersine mühendislikle çıkarabilir hale gelince, güvenli ortamda keyfi otomasyon kararları verebilir oldum.
- Güvensiz ortamda bilgiye erişip kararı veriyor, ardından güvenli ortamda "rastgele" seçilmiş eylemleri gerçekleştiriyordum.
Conclusion
- Blizzard'ın zayıf ve paylaşılan RNG durumu sorununu ne zaman düzelttiğini ya da bunun bir sorun olduğunun farkında olup olmadığını bilmiyorum.
- Birkaç yıl sonra kodu tekrar denediğimde artık çalışmıyordu.
- Gerçekte kullanmak istemediğim bir video oyunundaki küçük bir boşluktan yararlanmış olsam da, rastgele görünen şeyleri manipüle etmenin büyüleyici, neredeyse sihirli bir cazibesi vardı.
GN⁺ görüşü
- Bu yazı, bilgisayar güvenliği ve programlama hakkında ilgi çekici bir örnek sunuyor.
- Oyun içinde güvenliği aşmanın yaratıcı yollarını keşfetme süreci, programlama becerilerinin önemini ve olası zafiyetlere dair farkındalığı artırıyor.
- RNG zayıflığından yararlanma hikâyesi, yazılım geliştiricilere güvenlik ve algoritmaların önemini hatırlatan öğretici bir örnek niteliğinde.
1 yorum
Hacker News görüşleri
Bir kullanıcı, birkaç ay önce StackOverflow'da "RNG (rastgele sayı üreteci) tersine çevirme" hakkında bir soruyu yanıtladığını belirtiyor. Bu kullanıcı Java RNG'ye saldırmış; MSVC RNG'ye benzer bir LCG (doğrusal eşlenik üreteç) tasarımı kullandığı ve iç durumun kırpılmış halini çıktı olarak verdiği için saldırı yöntemi de çok benzer olmuş.
Başka bir kullanıcı, sunucu aynı RNG'yi kullanıyorsa; düşük trafikli bir sunucu, düşük ping, RNG'nin mevcut durumuna dair isabetli bir pencere elde edebilme yeteneği ve ekonomik oynaklığı yüksek başka olayları hızlıca tetikleyebilme imkanı varsa, bunun teorik olarak istismar edilebileceğini tahmin ediyor.
Bir başka kullanıcı, verilen doğrusal eşlenik RNG'nin yalnızca 12445 farklı sayı ürettikten sonra tekrar etmeye başladığını belirtiyor ve bu algoritma için daha iyi parametreler kullanmanın mantıklı olacağını söylüyor.
Bir kullanıcı, World of Warcraft (WoW)'ın programlamaya olan ilgisinin başlangıcı olduğunu söylüyor; oyun 6 yaşındayken çıkmış ve özel sunucular ortaya çıkınca kendi NPC'lerini nasıl yapacağını merak etmeye başlamış. Bu sayede Lua öğrendiğini, özel sunucu çekirdeğini nasıl derleyeceğini, SVN'i ve patch uygulamayı öğrendiğini anlatıyor.
John von Neumann'dan bir alıntı paylaşan bir kullanıcı, tüm rastgele sayı üretme yöntemlerinin günah olduğunu; katı aritmetik prosedürlerin rastgele sayı üretmenin bir yolu olmadığını savunuyor.
Bir kullanıcı, WoW için açık artırma evi script'i yazdığını söylüyor; bu script tüm açık artırmaları tarayıp düşük fiyatlanmış eşyaları satın alıyor ve yeniden listeliyordu. Biri fiyatı düşürdüğünde script iptal edip ondan biraz daha düşük fiyata tekrar açık artırma açabiliyordu.
Hacker News'in zayıf rastgelelik nedeniyle hacklendiği bir vakadan bahseden bir kullanıcı var. İlgili bağlantıyı paylaşıyor.
Bir kullanıcı, "değişken değişmediğinde ve sabit sabit olmadığında" ifadesini kullanıyor.
WoW oynamamış olsa da, birçok eklentinin özel sohbeti bir iletişim aracı olarak kullandığını duyduğunu söyleyen bir kullanıcı var. Bir yol varsa, insanların eninde sonunda onu bulup kullanacağını belirtiyor.
RNG'nin ekonomik teşvikleriyle ilgili olarak, ortada gerçekten bir şeyin olmadığı durumlarda (örneğin oyunlarda) kusurlu bir RNG'nin de yeterli olduğunu söyleyen bir kullanıcı var. Ancak işin içinde para olduğunda veya güvenlik kritik olduğunda (örneğin kripto para cüzdanları ya da çevrimiçi casinolar) RNG'nin kusursuzluğu çok daha önemli hale geliyor.