1 puan yazan GN⁺ 2024-04-19 | 1 yorum | WhatsApp'ta paylaş
  • Randar, Minecraft Beta 1.8~1.12.2 sürümlerinde blok kırıldığında oluşan item drop koordinatlarını kullanarak sunucunun java.util.Random durumunu geri kuran ve diğer oyuncuların konumunu geriye doğru izleyen bir exploittir
  • Temel neden, arazi/yapı üretimi ile madencilik olaylarının aynı rastgele sayı üretecini paylaşması olan RNG yeniden kullanımıdır; gözlemlenebilir drop konumları da iç durum için ipucu olur
  • Item drop'ların X/Y/Z ofsetleri art arda üç World.rand.nextFloat() çıktısı olduğundan, 48 bit seed'in üst 24 bitleri açığa çıkar ve LLL kafes indirgeme ile seed hızlıca geri kurulabilir
  • Geri kurulan seed, Woodland Mansion kontrolünden çıkan değer olup olmadığını doğrulamak için geriye sarılır; eşleşirse en son yüklenen 1280×1280 blokluk Woodland region belirlenir
  • ReplayMod gibi geçmiş paket kayıtlarında drop verisi kalmışsa, sunucu yamalandıktan sonra bile Beta 1.8~1.12.2 dönemindeki faaliyet konumları sonradan açığa çıkabilir

Randar'ın hedeflediği bilgi

  • Hedef, aynı dünyadaki diğer oyuncuların oyun içi koordinatlarını bulmaktır
  • Ana örnek olarak 2b2t kullanılır
    • 2b2t, kuralsız bir Minecraft “anarchy” sunucusudur
    • Sunucu haritası 3.6 quadrillion square tiles ölçeğinde olduğu için, konum gizliliği item'ları korumanın temel şartı haline gelir
  • Randar'dan önce de 2b2t'de 2018~2021 arasında kullanılan Nocom adlı bir koordinat exploiti vardı

Etkilenen sürümler ve koddaki hata

  • Sorun, Minecraft Beta 1.8'in 2011 sürümünden 1.12.2'nin 2017 sürümüne kadar mevcuttu
    • 2b2t, 14 Ağustos 2023'e kadar 1.12.2'de kaldı
  • Temel hata, java.util.Random örneğinin birden çok kod yolunda dikkatsizce yeniden kullanılmasıydı
    • Arazi üretimi ile madencilik gibi oyun davranışları arasında RNG paylaşılıyordu
    • java.util.Random'ın kendisi de güvenlik amaçlı bir RNG değildir
  • Minecraft, aynı world seed ve aynı konumda aynı arazinin çıkmasını sağlamak için deterministik üretim kullanır
    • Bu amaç için java.util.Random kullanılması doğaldır
    • Sorun, öngörülebilir olması gereken world generation RNG işlemlerinin, öngörülemez olması gereken olayları da etkilemesiydi

Woodland Mansion kontrolü ve global World.rand

  • Woodland Mansion oluşturma konumunu kontrol etme sürecinde World.rand sıfırlanır
    • Woodland region, 80×80 chunk birimiyle hesaplanır
    • O region içinde Mansion'ın oluşacağı chunk'ı seçmek için random.nextInt(60) dört kez çağrılır
  • Zafiyetli akışta World.setRandomSeed(seedX, seedY, seedZ), global this.rand üzerinde yeni bir seed ayarlar ve aynı nesneyi geri döndürür
  • 2b2t'ye özel formül şöyledir
seed = x * 341873128712 + z * 132897987541 - 4172144997891902323 mod 2^48
  • setRandomSeed, yalnızca gerçek bir Woodland Mansion yakınındayken değil, her chunk load sırasında kontrol amacıyla da çağrılır
  • Boyutlara göre etki farklıdır
    • Ana etki alanı Overworld'dür
    • Nether, yapı üretiminde her zaman güvenli bir RNG kullandığı için güvenlidir
    • The End, end city nedeniyle ilk üretim sırasında etkilenir ama aynı chunk sonradan her yeniden yüklendiğinde tekrar etkilenmez; bu yüzden görece daha güvenlidir

Item drop koordinatlarının RNG'yi açığa çıkarma biçimi

  • Bir blok kazıldığında, item blok içindeki rastgele bir konuma drop olur
    • Örneğin blok koordinatı (10, 20, 30) ise item (10.25, 20.25, 30.25) ile (10.75, 20.75, 30.75) arasında belirir
  • Bu konum, X, Y ve Z ofsetlerini belirlemek için üç world.rand.nextFloat() çağrısıyla üretilir
  • Drop koordinatından orijinal nextFloat() değerine geri dönülebilir
    • Float'a 0.5 çarpılması sürecinde yalnızca üs küçülür, bilgi kaybı oluşmaz
    • Sonrasında double'a çevrilip blok koordinatı eklenir ve ağ üzerinden full precision ile gönderilir
  • java.util.Random.nextFloat(), 48 bit seed'i güncelledikten sonra üst 24 biti integer olarak alıp 2^24'e böler
    • LCG denklemi newSeed = oldSeed * 25214903917 + 11 mod 2^48 şeklindedir
    • Art arda üç float, art arda üç seed'in üst 24 bitini verir

LLL kafes indirgeme ile seed geri kurma

  • Basit yöntem, ilk ölçüme uyan 2^24 adet alt 24 bit adayını tek tek denemektir
    • Bu yöntem çalışır ama yavaş olduğu için kafes yaklaşımı kullanılır
  • Üç ölçüm şu üç değerin aralığını verir
    • seed
    • nextSeed(seed)
    • nextSeed(nextSeed(seed))
  • Bu üç değer, (seed, nextSeed(seed), nextSeed(nextSeed(seed))) biçiminde 3 boyutlu bir nokta olarak görülürse, tüm olası seed'ler bir kafes yapısı oluşturur
  • Temel vektörler şu şekilde alınır
    • (1, a, a^2)
    • (0, c, 0)
    • (0, 0, c)
    • burada a = 25214903917, c = 2^48
  • LLL basis reduction, aynı kafesi üreten ama daha kısa ve neredeyse dik bir baz bulur
    • Mathematica örneği LatticeReduce[{{1, a, a^2}, {0, c, 0}, {0, 0, c}}]
    • Ortaya çıkan baz (1270789291, -2446815537, 2154219555), (-2355713969, 1026597795, 4110294631), (-3756485696, -2345310016, -2015749696) olur
  • Ölçüm küpünün merkezi indirgenmiş baz uzayına dönüştürüldükten sonra her katsayı en yakın integer'a yuvarlanırsa geçerli bir kafes noktası elde edilir; ilk koordinat geri kurulan iç seed olur
  • Optimize edilmiş Java kodu örneğinde üç ölçümden seed yaklaşık 10ns seviyesinde geri kurulabilir

Seed'i geriye sarıp konum bulma süreci

  • java.util.Random'ın LCG'si hem ileri hem geri yönde çalıştırılabilir
    • İleri yön: newSeed = oldSeed * 25214903917 + 11 mod 2^48
    • Geri yön: oldSeed = (newSeed - 11) * 246154705703781 mod 2^48
  • Geri kurulan seed geriye sarılırken, her seed'in Woodland Mansion kontrolünden gelmiş olup olamayacağı doğrulanır
  • Minecraft world sınırı -30 million ile +30 million blok arasındadır
    • Uygulama, her eksende Woodland region aralığını -23440 ile +23440 olarak alır
    • Olası Woodland region sayısı (23440*2+1)^2, yani 2,197,828,161'dir
  • Tüm 2.2 milyar adayı tek tek karşılaştırmak yavaştır; büyük bir HashSet de çok bellek tüketir
  • Z katsayısı 132897987541 tek sayı olduğundan mod 2^48 altında terslenebilir
    • Ters değer 211541297333629'dur
    • Bununla tüm Z adaylarını gezmek yerine yalnızca 46,881 adet X adayı üzerinden gidip Z hesaplanarak aday region bulunabilir

GPU ve lookup table optimizasyonu

  • Yalnızca X üzerinden gezinmek tek bir seed için makuldü; ancak çok sayıda bot saniyede birden fazla blok kazıyor ve her ölçüm için binlerce RNG step'i inceleniyorsa, düşük donanımlı bir VPS üzerinde gerçek zamanlı işleme zorlaşıyordu
  • Sonraki uygulama CUDA batch job ve lookup table kullanacak şekilde değişti
    • Lookup table anahtarı mansion seed'in alt 32 bitidir
    • Değer ise Woodland region'ın X koordinatıdır
    • Alt 32 bit anahtarlarında çakışma olmadığı belirtiliyor, fakat nedeninin anlaşılmadığı da ekleniyor
  • Tablo, 2^32 giriş ve giriş başına 2 byte kullanarak yaklaşık 9GB VRAM gerektirir
  • RTX 3090 üzerinde saniyede yaklaşık 10 milyon seed kırılabiliyordu
  • Geri kurulan sonuç, en son chunk load'un gerçekleştiği 1280×1280 blokluk Woodland region'ı verir; bu da birkaç dakikalık aramayla konumu bulmaya yetecek kadar dardır

Gerçek sunucuda gözlenen step dağılımı

  • Teoride Woodland seed'leri arasındaki ortalama mesafe yaklaşık 128,000 RNG step'tir
  • 2b2t'de çoğu durumda Woodland seed birkaç onlarca step içinde bulunuyordu
    • Ölçüm, paket işleme zamanlaması nedeniyle tick'in çok erken bir anında alınıyordu
    • Genellikle chunk'lar bir önceki tick'te yüklenmiş oluyordu
  • Güvenilir ölçüm alt sınırı en az 4 RNG step'ten başlar
    • Çünkü Woodland Mansion kodu, gözlemden önce dört rand.nextInt çağrısı yapar
  • Büyük sıçramalar 1354 step katlarında görülüyordu
    • Olası neden olarak end crystal patlaması veya wither skull öne sürülüyordu
    • End crystal patlamasında blok hasarı hesabı 16^3-14^3=1352 ve buna iki ses efekti daha eklendiğinde 1354 step elde edilir

ReplayMod ve sonradan açığa çıkma riski

  • Sunucu daha yeni sürüme geçmiş ya da RNG manipülasyonu için yama almış olsa bile, eski veri kalmışsa Randar riski sürer
  • Bazı Minecraft oyuncuları ReplayMod gibi mod'larla paketleri kaydeder
    • Kayıt dosyasında item drop'ları varsa, o anki sunucu RNG durumu geri kurulabilir
    • Blok kırma çok yaygın bir eylem olduğundan kayıtlarda bulunma ihtimali yüksektir
  • Beta 1.8~1.12.2 döneminde aktif olan tüm konumlar, sunucu çok önce güncellenmiş olsa bile açığa çıkmış sayılmalıdır
  • Randar'ı doğrudan denemeye yarayan istemci taraflı bir web aracı da sunuluyor
    • hobune.stream/randar adresinde 1.12.2 ReplayMod dosyasını sürükleyip bırakarak koordinatlar görülebilir
    • Kayıt dosyası tarayıcı dışına çıkmaz

Randar operasyonu ve heatmap'ler

  • SpawnMasons, zaten başka projeler için 7/24 stone/cobblestone kazan hesaplarda item drop koordinatlarını kaydetmeye başladı
  • Nocom'da kullanılan headless Minecraft sistemi yeniden kullanıldı ve ölçüm değerlerini saklamak için bir Postgres veritabanı eklendi
  • RNG ölçümlerini kıran yazılım birkaç kez geliştirildi ve sonunda async CUDA batch job yapısında karar kılındı
  • Kırılan ölçümler veritabanına eklendiğinde heatmap analiz tablosu da güncelleniyordu
    • Tüm dönem, günlük ve saatlik hit count değerleri saklanıyordu
    • Plotly Dash arayüzüyle belirli zaman aralıkları ve granularity seçilip tarayıcıdan görüntülenebiliyordu
  • Elytra stash hunting kaynaklı chunk load spam'i, yalnızca birden fazla distinct hour boyunca yüklenmiş koordinatları dikkate alma yöntemiyle ayıklandı
  • Bulunan hotspot'ları takip etmek için basit bir ortak annotation sistemi de eklendi
  • Nocom'dan alınan Baritone bot ile item stash çalma ve temizleme süreci AFK şekilde otomatikleştirildi

Koruma amaçlı decoy Woodland region

  • Randar her zaman en son chunk'ı doğru biçimde bulmaz
    • RNG geriye sarılırken daha yeni bir decoy Woodland region önce gelirse, ilk eşleşmeyi döndüren exploit yanlış pozitif üretebilir
  • Woodland seed genel olarak yaklaşık her 130,000 RNG seed'den birine denk gelir, ancak dağılımda outlier'lar vardır
  • 2b2t'de yaklaşık 20 bin Woodland region'dan biri, sonraki 4 RNG step içinde başka bir Woodland region'a sahip olan özel bir gizlenme özelliği taşıyordu
  • SpawnMasons bu tür region'larda stash kurdu
    • Render distance nedeniyle koruma region'ı dışındaki chunk'lar yüklenmesin diye yapıları kompakt inşa ettiler
    • Decoy konuma AFK hesap ve küçük bir base koyarak diğer Randar kullanıcılarının decoy konumu görmesini hedeflediler
  • Kendi Randar log'larına göre bu stash'ler, tüm dönem boyunca komşu Woodland region'ı yanlışlıkla yüklememiş “clean” durumdaydı
  • Açıklama yapıldığı tarihte bu stash'lerin zaten taşındığı belirtiliyor

Tam örnek ve sürüme göre kısıtlar

  • SPacketSpawnObject içinde mining drop gibi görünen item'lar tespit edilip, drop koordinatları üç float ölçümüne geri çevrildikten sonra LLL tabanlı kırma ve Woodland region geriye izleme yapan bir Java örneği sunuluyor
  • 2b2t'den gerçek ölçüm örneği şu sonucu veriyor
    • item drop: 0.41882818937301636, 0.6833633482456207, 0.46088552474975586
    • RNG measurements: 5664934 14541261 7076144
    • iç seed: 95041827771683
    • Woodland region: -12008 0
    • konum aralığı: -15370368,-128 ile -15369089,1151
  • Diyagram örneği Woodland Region 123,456'yı bulur
    • Nihai konum aralığı 157312,583552 ile 158591,584831 olur
    • Bu aralık, orijinal giriş koordinatı x=157440 z=583680 değerini içerir
  • 1.11 öncesi sürümlerde exploitable structure Woodland Mansion değil başka bir yapıdır; bu yüzden farklı kod gerekir
  • 1.9 öncesinde item konumu double değil, fractional part'ı 5 bit fixed-point olarak iletilir; bu nedenle tek bir item'dan RNG durumunu kırmak pratik değildir ve başka ölçüm stratejileri gerekir

Yama yöntemi

  • Kolay yöntem, RNG manipulation'ı devre dışı bırakan bir yama veya ayar bulmaktır
  • Zafiyetli uygulamada World.setRandomSeed, global this.rand üzerinde seed ayarlayıp onu geri döndürür
public Random setRandomSeed(int seedX, int seedY, int seedZ) {
    this.rand.setSeed(seedX * 341873128712L + seedY * 132897987541L + seedZ + this.getWorldInfo().getSeed());
    return this.rand;
}
  • Tam koruma isteniyorsa, her çağrıda yeni bir Random döndürecek şekilde değiştirilebilir
public Random setRandomSeed(int seedX, int seedY, int seedZ) {
    return new Random(seedX * 341873128712L + seedY * 132897987541L + seedZ + this.getWorldInfo().getSeed());
}

n0pf0x eki: diğer koordinat arama yöntemleri ve The End

  • n0pf0x, Mason tarafındaki GPU tabanlı büyük lookup table yerine cache tabanlı koordinat arama kullandı
    • Bir hit oluştuğunda ilgili koordinat ve çevresindeki radius içindeki koordinatlar HashMap içine alınır
    • İlk pass, RNG'yi geriye sararken cache hit veya bir önce işlenen seed ile tekrarları hızlıca kontrol eder
    • İkinci pass ise yalnızca ilk pass başarısız olursa çalışır ve daha önce anlatılan pahalı koordinat bulma algoritmasını kullanır
  • Bu cache yaklaşımı, daha az olası geçerli konumları atlama etkisi yarattığı için false positive azaltımına yardımcı olabilir
  • The End'de RNG yalnızca chunk ilk kez üretildiğinde etkilenir; bu nedenle Overworld'deki gibi base chunk load'larını tekrar tekrar gözlemek zordur
  • The End'de güvenilebilecek iki durum vardır
    • Base'de bulunan bir oyuncunun dolaşıp henüz üretilmemiş chunk'lar oluşturması
    • Base'e giden bir oyuncunun yol boyunca yeni chunk trail oluşturması
  • Trail için otomatik tanımlama sistemi yapılabilir, ancak n0pf0x bunu uygulamadı ve görsel olarak elle takip etti
  • Oyuncu tanımlamada End Occupancy Tracker (EOT) fikri kullanıldı
    • Tick başına RNG çağrısı sayısının, yüklenen chunk sayısıyla belli ölçüde ilişkili olduğu ve bunun da o boyuttaki oyuncu sayısına bağlanabileceği varsayımına dayanır
    • Oyuncu join/leave sonrasında RNG çağrılarında ani artış veya düşüş olup olmadığına bakılarak The End'deki oyuncular tahmin edilir
  • EOT yalnızca 9b9t'de test edildi; 2b2t gibi farklı sunucu koşullarında geçerli olmayabilir
    • Her tick'te kararlı biçimde RNG örneklenebilmesi gerekir
    • The End'deki oyuncu etkinliği çok daha yoğunsa bu iş daha da zor olabilir

1 yorum

 
GN⁺ 2024-04-19
Hacker News yorumları
  • 1999~2000 yıllarında International RoShamBo Programming Competition adlı, bilgisayar taş-kağıt-makas botlarının yarıştığı bir etkinlik vardı [1]
    Referans bot, teorik olarak yenilemeyen bir strateji olan rastgele seçim yapıyordu; ancak şaka amaçlı katılımlardan biri, rastgele oyuncunun hangi hamleyi yapacağını %100 doğrulukla tahmin etmek için rastgele sayı üretecinin durumunu tersine hesaplayacak şekilde tasarlanmıştı
    Düzeltme: O bot Tim Dierks’in “Nostradamus”uydu ve ilk yarışmada “supermodified” kategorisinin kazananı ilan edildi [2]
    [1] https://web.archive.org/web/20180719050311/http://webdocs.cs...
    [2] https://groups.google.com/g/comp.ai.games/c/qvJqOLOg-oc

    • O bendim. Yıllar önceki bu alıntıyı yeniden görmek hoş oldu: “üstün teknik becerisi ve ‘erken hile yap, sık hile yap’ tavrıyla Tim, bilgisayar oyunları sektöründe AI programcısı olarak umut verici bir kariyere sahip olabilir :)”
      Gerçekte ise güvenlik alanına geçtim, TLS RFC’leri yazdım ve Google güvenlik biriminde baş mühendis oldum. Bu anıyı canlandırdığın için teşekkürler
    • İlk yıl, en kötü anlamda optimal katılım olan cheesebot’u göndermiştim
      https://web.archive.org/web/20180719050236/http://webdocs.cs...
    • “supermodified” kategorisindeki tüm katılımcı açıklamaları aşırı komik
      Nostradamus, kriptografi konusunda ciddi uzmanlığa sahip Certicom’un mühendislikten sorumlu başkan yardımcısı Tim Dierks tarafından yazıldı ve random() üretecinin iç durumunu tersine mühendislikle çıkararak optimal oyuncuyu yendi. Kendi ifadesiyle “beklediğimden hem daha kolay hem daha zordu.” Yine de sportmenlik adına diğer tüm rakiplere karşı optimal oynadı
      Fork Bot, Dan Egnor’un yarışmadan bahsedildiğini duyduktan birkaç dakika sonra aklına gelen bir fikirden çıktı; “kütüphane rutini serbest” kuralını kullanarak fork() ile üç süreç başlatıyor, her birine farklı bir hamle yaptırıyor ve kaybeden ikisini öldürüyordu. Andreas Junghanns bunu yaklaşık 10 satır kodla uyguladı, ancak ilk turdan sonra üç hamlenin tamamı da Psychic Friends Network’e kaybedince program sonlandı ve kalan maçlar hükmen kaybedildi
      Psychic Friends Network, Michael Schatz ve RST Corporation ekibinin yazdığı gerçekten komik, obfuscation dolu bir C koduydu; iyi karma arayan yardımcı fonksiyonlar, burç yorumu, spagetti ve gizemli pizza tarifleri, #define ile Demokratları komüniste çevirme ve tanrıyı undef etme gibi şeyler yapıyordu. Yığın çerçeveleriyle tam olarak ne yaptığı hâlâ çözülmeye çalışılıyor, ama meta-meta-hileciyle karşılaşmadığı sürece bir maçta +998’in altına inmiyor
      The Matrix, “Student for Life” gibi prestijli bir unvana sahip Darse Billings tarafından yazıldı ve “kaşık diye bir şey yok” gibi basit bir ilkeyle tüm rakipleri mükemmel skorla yendi
      The Matrix aynı zamanda turnuva programının kendisiydi; yani diğer tüm algoritmalara, veri yapılarına ve çıktı rutinlerine tam erişimi vardı, bu yüzden gelecekte de geçilmesi pek olası değildi. Bu nedenle bu kategori çözülmüş ilan edildi ve sonraki yarışmalarda kaldırıldı
    • Şeffaflığı artırmaya yönelik övgüye değer bir girişim olarak sözde rastgele sayı üretecini belgeleyen bir çevrimiçi poker sitesine birinin aynı şeyi yaptığını hatırlıyorum
      Sonuçta bu şeffaflık sayesinde güvenlik iyileşmişti
    • Demek ki sözde rastgele sayı üreteci kullanıyorlarmış?
  • LLL kafes indirgeme, birkaç gün önceki bir CVE’de önyargılı nonce’lar üzerinden PuTTY anahtarlarını kırmak için de kullanılan algoritmanın ta kendisi
    tptacek saldırıyı biraz açıkladı ve gözlerinizi kısarsanız neredeyse anlıyormuş gibi yapabileceğiniz bir cryptopals sorusuna da bağlantı verdi https://news.ycombinator.com/item?id=40045377
    Benzer şekilde, SciCraft Minecraft sunucusunda bir tür kara büyü cihazıyla rastgele sayı üretecinin durumu deterministik biçimde manipüle edilerek her karede belirli bloklara “rastgele” yıldırım düşüren ve böylece creeper drop’larını iyileştiren bir creeper çiftliği de vardı https://youtu.be/TM7SutJyDCk

    • Sean ve Kelby, LLL’nin ne olduğunu çok daha iyi açıklıyor, ama LLL’nin neden var olduğuna dair şimdiye kadar gördüğüm en iyi yazılardan biri buna çok yakın
      Üç durumda da gereken şey temel lineer cebir kadar; hatta o kadar bile değil. Kelby, Gram-Schmidt’i anlamanızı bekliyor; bu da lisans düzeyi lineer cebire giriş dersinde ara sınavdan hemen önce görülen bir konu
      Bu yazının ne kadar harika olduğunu anlatacak söz bulamıyorum. Haftamı güzelleştirdi
      Daha sonra Python’da adım adım takip edilebilecek, aynı sürecin çok kısa bir açıklaması:
      https://crypto.stackexchange.com/questions/37836/problem-wit...
    • Blokların her zaman maksimum miktarda düşmesini sağlayan bir rastgelelik manipülasyonu da var; burada anlatılıyor
      https://youtu.be/ZcdN1wCJPqM?t=390
    • “kara büyü cihazı”, “gözlerinizi kısarsanız neredeyse anlıyormuş gibi yapabilirsiniz” kriptografiye bakarken tam benim hâlim :D
  • Sabah uyandığında, önceki gece orada olmayan blokların gökyüzünde süzüldüğünü görmek; ilk başta hayalet gibi sis sanıp sonra bunların redstone, observer ve slime blokları olduğunu fark etmek ve sonsuz TNT yağmurunu görmek gibi bir durum hayal et.
    Bunun tek sebebi sunucunun benim konumumu sızdırmış olması. Yine de hâlâ kaçabilirsin; belki sandıktan alacaklarını birkaç saniye içinde kapıp kaçmaya ya da bir obsidyen sığınağı inşa etmeye vaktin olur. Ama hepsi bu kadar.
    Hassas nişan alan bir top yapmaya zaman yetmez, zaten yüksekliği de tutturamazsın. Elytra ve roketin varsa engellemeye gitmeyi deneyebilirsin ama tam 16 chunk ötede devasa bir world eater çukuru var. Yakındaki her Nether portalına lav tuzağı kurmuşlar mıdır acaba?

  • Bir sürü ilginç ve komik rastgele sayı üreteci problemi gördüm ama bu, karşılığında elde edilene kıyasla gördüğüm en sofistike istismarlardan biri. Adeta harika bir sanat eseri gibi.

    • Eğer bunu satsalardı biraz para kazanmış olabilirlerdi; belki birkaç bin dolar seviyesinde. Tabii harcanan emeği düşününce yine de küçük bir ödül.
    • Mojang geliştiricilerinin görünüşte zararsız kararlarının burada istismar ediliş biçimine bayıldım. İnanılmaz havalı
  • Oldukça havalı bir exploit.
    Bug exploit'lerinin serbest olduğu sunucu fikri de güzel; oyunun tamamen farklı bir aşaması gibi görünüyor.
    Metaverse gerçekten gerçekleşirse, sadece oyun içi savaş mekaniklerini kullanmak yerine “gerçekten savaşmak” herhalde böyle görünürdü.

    • 2b2t savaşı da normal Minecraft gibi görünmüyor.
      Eskiden beri çoğaltılmış çok sayıda pahalı eşya olduğu için PvP, kırıldığında devasa hasar veren end crystal'ları durmadan spam'lemeye dönüştü; savunma ise ölümcül hasarı emen “totem of undying”den ne kadar çok taşıdığına bağlı.
      Doğal olarak hack client'lar end crystal yerleştirmeyi, totem yeniden doldurmayı, zayıf ve güçlü pozisyonları belirlemeyi otomatikleştiriyor; oyuncu da onların yönlendirmesiyle sürekli hasar veriyor.
      Ondan biraz önce de, sunucuda yama gelene kadar anında öldüren +32.767 hasarlı hack kılıçlar vardı.
    • Dengenin bug ve exploit etrafında yakınsaması, sunucuda izin verilmese bile yoğun PvP sandbox oyunlarında oldukça tipik.
      ARK: Survival Evolved ve Eve Online, binlerce kişilik dev klanların metagame ve bug istismarını aşırı uçlara taşımasıyla ünlü.
      Her zaman romantik değil. ARK'ta oyuncuları ve onların çok sayıdaki Steam hesabını dox'lamaya yarayan mekanikler vardı; ayrıca Great War sırasında oyun içi ilişkilerin kısmen gerçek hayata da taştığı anlaşılıyor.
      Bazen çok temel yöntemler de oluyor. Örneğin baskın yerken devasa bir kule inşa edip onu yıkarak sunucuda hizmet engelleme yaratıp çökertirsen, sunucu 10-20 dakika önceki yedeğe geri dönerdi; bu da aktif oyuncusu olan üsleri basmayı çok zorlaştırıyordu. Çok eski bir yöntemdi ve yıllar önce düzeltildi.
      Rust'ın da bug ve exploit'leri YouTube'da yaymayı ve kamuya açık hâle getirmeyi teşvik eden bir politikası vardı ama amaç farklıydı. Geliştiricilerin daha hızlı fark edip yamalamasını sağlamaktı. Sonuçta, gerçek harici hile kullanmadan istismar etmesi çok zor olan epey sağlam bir oyuna dönüştü.
    • Orta noktada Super Smash Bros Melee var. Turnuvalarda izin verilen birçok oyun içi taktik bug'lara dayanıyor.
      Ama bunlar sadece normal kontrolcüyle manuel olarak uygulanabilen şeyler; gerçek hack değil. Wobbling adlı bir exploit ise 2019'da yasaklandı; oyununsa çıkış yılı 2001.
    • Oynanış açısından gerçekten anarşik bir sunucu fikrini epey sevmiştim ama gerçek 2b2t'de chatte çok fazla n-word geçince bıraktım.
    • “Bug exploit'inin serbest olduğu sunucu” dediğin şey, aslında VAC'siz CS 1.6 sunucularının tamamı değil mi?
  • Bu konudaki videoyu az önce izledim. Rastgelelik kaynaklarının birbiriyle etkileşime girmesi durumunda ortaya çıkan riske dair çok net bir uyarı örneği; üstelik önemli sistemlerin çoğuna da uygulanabilir.
    Performans yüzünden kodda sık sık rastgele sayı üreteci paylaşılıyor; böyle şeyleri görünce insan gerçekten durup düşünüyor.

    • Ciddi yazılımlarda sözde rastgele sayı üreteci kullandığımı sanmıyorum ama sezgisel olarak, aynı rastgele sayı üretecini olabildiğince çok yerde kullanmanın bu tür saldırıları zorlaştıracağını düşünmüştüm.
      Çünkü güncellenen noktaları yeterince gözlemlemek zor olur gibi geliyordu. Ama bu örnek, o sezginin yanlış olduğunu oldukça etkileyici ve eğlenceli bir şekilde gösteriyor.
  • Bu video gerçekten şaşırtıcı: https://www.youtube.com/watch?v=maMpMOnIJDE
    Topluluğun bu kadar sofistike olduğunu bilmiyordum.

  • Daha da ötesi, bu tür rastgele sayı üreteci kırma yöntemleri oyunun içinde de uygulanmıştı.
    https://youtu.be/FPmQ0rnJjNc?si=tTFObcfZ-ILanL_A

  • Şaşırtıcı biçimde, doğrudan Minecraft'ın içinde yapılmış Mess Detector adlı bir makine var. Blok düşmeleri yerine ateşlenmiş TNT'nin konumunu kullanarak rastgele sayı üretecinin iç durumunu tahmin ediyor.
    https://www.youtube.com/watch?v=FPmQ0rnJjNc

  • Bu, state compromise extension attack gibi görünüyor (https://en.wikipedia.org/wiki/Random_number_generator_attack).
    Kriptografik olarak güvenli sözde rastgele sayı üreteci (CSPRNG) olmayan PRNG'lerin maruz kalabildiği bir saldırı türü.
    Artık kütüphanelerin varsayılan olarak PRNG sunması bile pek güvenli gelmiyor. 2024'te TLSv1.0 ya da blowfish'i varsayılan olarak etkin bırakmaya benziyor.