BSP Protection ve sızıntılar

GMod haritası güvenli mi? Sunucuna koymadan önce BSP'yi kontrol et

Bir GMod haritası sunucuna zarar verebilir mi? lua_run neler yapabilir, GMod neyi engeller, kurmadan önce BSP'nin entity'leri ve pakfile'ı nasıl kontrol edilir.

Evet, bir harita bir GMod sunucusuna zarar verebilir ve başlıca riskler önceden kontrol edilebilir. En önemli yol lua_run entity'sidir: haritanın entity verilerinde saklanan Lua kodunu sunucuda çalıştırır. Bunun dışında bir harita, hiç kod olmadan da bir sunucuyu aksatabilir, örneğin bir entity seliyle. İkisini de entity'leri ve pakfile'ı listeleyerek ve haritayı önce ayrı bir sunucuda yükleyerek fark edersin.

Bir BSP neleri içerebilir, neleri içeremez

Bir BSP program değil, lump adı verilen veri bloklarından oluşan bir koleksiyondur. Güvenlik açısından bunlardan ikisi önemlidir: tüm entity'lerin özellikleriyle birlikte yer aldığı bir metin listesi olan entity lump ve gömülü dosyalar içeren bir ZIP arşivi olan pakfile. Yapının tamamı BSP dosyası nedir? yazısında açıklanıyor. Bu durumda bir haritanın geometri göstermekten fazlasını yapması için iki yol kalır: bir şey çalıştıran entity'ler ve oyunun yükleme sırasında mount ettiği dosyalar.

Garry's Mod ikinci yolu sıkılaştırdı. Aralık 2023 güvenlik yamalarından beri oyun, gömülü dosyaları bir whitelist'e göre kontrol ediyor. Kontrolden geçemeyen dosya mount edilmez ve konsolda şu görünür:

BSP embedded file failed whitelist check - '<path of the file>'

Facepunch'ın yama notları whitelist'i adıyla anıyor ve materials/*.raw ile scripts/vehicles/*.txt gibi sonradan izin verilen girdileri sayıyor. Facepunch listenin tamamını belgelemedi. Güncel oyun sürümünün dosya sistemi kütüphanesi tam olarak bu biçimde bir kalıp listesi içeriyor; liste başka şeylerin yanı sıra modelleri, materyalleri, sesleri, particle'ları, navmesh'i, soundscape'leri ve maps/ ile data_static/ altındaki metin dosyalarını kapsıyor, ancak Lua dosyaları için bir kalıp içermiyor. Bu listenin whitelist olduğu, dosyaya dair bizim yorumumuzdur ve Facepunch tarafından doğrulanmamıştır; pakfile içindeki bir .lua dosyasının yüklenip yüklenmediğini de çalışan bir oyunda test etmedik. Bu yüzden pakfile içindeki Lua dosyalarını, haritayı yapanın açıklaması gereken bir anormallik olarak değerlendir.

lua_run: doğrudan haritadan gelen Lua kodu

garrysmod.fgd, lua_run entity'sini kısaca "Runs Lua Code" diye tanımlar. Entity'nin bir Code keyvalue'su, "Run code on spawn" spawnflag'i ve iki input'u vardır: RunCode saklanan kodu çalıştırır, RunPassedCode ise başka bir output'un parametre olarak gönderdiği kodu çalıştırır. Kod sunucuda çalışır ve orada kurulu bir addon'la aynı imkânlara sahiptir.

Bu meşru bir araçtır. Oyunla birlikte gelen gm_construct haritasının kendisi iki lua_run entity'si içerir ve bunlardan biri oyunculara bir ipucu gösterir (kısaltılmış):

{
"targetname" "ColorRoomHint"
"Code" "if ( TRIGGER_PLAYER ) then TRIGGER_PLAYER:SendHint( 'ColorRoom', 0 ) else Msg( 'No Player!!?/n' ) end"
"classname" "lua_run"
}

Yani önemli olan bir haritanın lua_run içerip içermediği değil, kodun ne dediğidir. Okurken şu uyarı işaretlerine dikkat et:

  • Ağ erişimi, örneğin http.Fetch ya da HTTP. Bir haritanın üçüncü taraf bir sunucuyla konuşmasına gerek yoktur.
  • Çalışma zamanında yüklenen kod, yani RunString ya da CompileString üzerinden gelen kod. Asıl kod o zaman başka bir yerde durur ve sen yalnızca kabuğu kontrol etmiş olursun.
  • Okunamayan string'ler, örneğin uzun sayı dizileri.
  • Konsol komutları ve rütbeler, yani RunConsoleCommand, game.ConsoleCommand ya da kullanıcı gruplarında yapılan değişiklikler.
  • Output'larda RunPassedCode. Kod o zaman lua_run içinde değil, başka bir entity'nin output'unda durur. Bu yüzden entity listesinin tamamında ara.

Haritaların Lua çalıştırmasını yasaklayan bir sunucu ayarı bulamadık; ne GMod wiki'sinde ne de convar listesinde. Garry's Mod yalnızca belirli konsol komutlarını Lua için engeller; rcon_password ve sv_cheats bunlar arasındadır. Bu, kodu okumanın yerini tutmaz.

Tek satır kod olmadan çıkan sorunlar

Komut entity'leri. Diğer Source oyunlarında point_servercommand ve point_clientcommand konsola komut gönderir. Garry's Mod'da ikisi de kapalıdır: oyunun base.fgd dosyası bunları, GMod'da devre dışı bırakıldıklarını belirten bir notla birlikte yorum satırına alınmış olarak listeler ve Facepunch, Garry's Mod'da çalışmadıkları için bunları Hammer'dan kaldırmıştır. Valve Developer Community wiki'si neden olarak kötüye kullanımı gösterir. Bunları bir haritada bulursan harita muhtemelen başka bir oyundan geliyordur.

Entity selleri. Bir harita çalışma zamanında entity oluşturabilir, örneğin env_entity_maker ile birlikte point_template üzerinden ya da npc_maker üzerinden; bunları çoğu zaman bir logic_timer sürer. Bu denetimsiz çalışırsa sonunda tüm edict'ler kullanılmış olur. GMod wiki'sine göre sınır yaklaşık 8176 ağ üzerinden eşitlenen entity'dir; sunucu önce Warning: free edicts below threshold bildirir ve en kötü durumda ED_Alloc: no free edicts ile kapanır. Sebep kasıt olabileceği gibi pekâlâ bir yapım hatası da olabilir. Edict'lerin nasıl sayılacağı edict limiti ve "no free edicts" yazısında anlatılıyor.

Özel hazırlanmış veriler. Facepunch oyunu, çökmelere yol açan haritalara karşı sağlamlaştırmayı sürdürüyor. Kasım 2025 güncellemesi başka şeylerin yanı sıra anlamsız fog controller değerlerine karşı, player_loadsaved üzerinden kurulan bir yeniden yükleme döngüsüne karşı korumayı ve statik prop sayısına getirilen sınırları sayıyor. Bu yüzden sunucuyu güncel tut: eski bir sürüm bu tür haritalara karşı daha savunmasızdır.

İçerik. Eksik texture'lar ve modeller ya da çok büyük bir indirme saldırı değildir, ama oyuncuları kaçırır.

Dosya nereden geliyor

Risk, dosya biçiminden çok kaynağa bağlıdır. Entity lump düz metindir ve basit araçlarla değiştirilebilir. Dolayısıyla bir haritayı internete yeniden yükleyen herkes, adını ya da görünüşünü değiştirmeden ona bir lua_run ekleyebilir. Sızdırılmış kopyalarda dosyaya en son kimin dokunduğunu bilemezsin.

BSP'nin kendisi dışında paket de sorun olabilir: harita, içinde bir lua klasörü ya da bir addon bulunan bir arşivle geliyorsa o kod hiçbir lua_run olmadan çalışır. Onu diğer her addon gibi oku. Satın alırken nelere bakman gerektiği GMod haritalarını güvenle satın alma yazısında anlatılıyor.

Kurulumdan önce kontrol

  1. Kaynağı netleştir. Haritayı yapımcısından ya da kimin yüklediğini gösteren bir platformdan al.
  2. Pakete bak. Beklenen bir .bsp dosyasıdır, belki bir navmesh ile birlikte. Paketteki Lua dosyalarını ve addon'ları baştan sona oku.
  3. Entity'leri listele. Entity lump düz metindir, bu yüzden BSP içinde bir metin araması yeterlidir. lua_run, RunPassedCode, point_servercommand ve point_clientcommand ara. Map Scanner, point_servercommand ya da lua_run gibi riskli entity'leri bulur ve bir spawnpoint olup olmadığını kontrol eder. Kodu değerlendirmek sana kalır.
  4. Pakfile'ı listele. Garry's Mod'un bin klasöründeki bspzip -dir, gömülü her dosyayı yoluyla birlikte yazdırır. Map Scanner da gömülü Lua ve asset dosyalarını listeler. materials/, models/, sound/ ve benzerlerini bekle.
  5. Yalıtılmış ortamda test et. Haritayı, gerçek oyuncu verisi bulunmayan ve veritabanına erişimi olmayan bir sunucuda başlat. Konsolu oku: whitelist mesajları, Lua hataları ve edict uyarıları orada görünür.
  6. Kontrol ettiğin dosyayı sakla. Her güncellemede 3 ila 5. adımları tekrarla.
bspzip -dir rp_example_v2.bsp
bspzip -repack copy_rp_example_v2.bsp

İkinci satıra yalnızca sıkıştırılmış haritalarda ihtiyacın olur. Bunların lump'ları sıkıştırılmıştır, bu yüzden dosyada yapılan düz bir metin araması hiçbir şey bulmaz, bspzip -dir de başarısız olur. Yardım metnine göre -compress olmadan -repack, dosyanın sıkıştırmasını yeniden açar. Ancak bizim testimizde güncel Garry's Mod sürümünün bspzip aracı sıkıştırılmış bir haritada hiçbir mesaj vermeden kapandı; Team Fortress 2'nin bspzip aracı ise aynı dosyanın sıkıştırmasını açtı. Bunu yaparken bir kopya üzerinde çalış.

Map Scanner ayrıca header'ı, magic byte'ları, lump tablosunu ve offset'leri tutarlılık açısından kontrol eder ve 50 MB'a kadar BSP dosyalarını kabul eder. Bir mapper'ın yayından önce nelerin üzerinden geçtiği yayın öncesi BSP kontrolü kontrol listesinde yer alıyor.

Sık sorulan sorular

sv_allowcslua 0, haritaların Lua çalıştırmasını engeller mi?

Hayır. GMod wiki'sine göre sv_allowcslua, istemcilerin lua_openscript_cl ve lua_run_cl kullanıp kullanamayacağını, yani kendi makinelerinde kendi script'lerini çalıştırıp çalıştıramayacaklarını belirler. Ayarın, sunucuda çalışan lua_run entity'siyle hiçbir ilgisi yoktur.

Bir haritada şüpheli kod bulursam ne yapmalıyım?

Haritayı kurma ve yapımcısına kodun ne işe yaradığını sor. Makul bir yanıt alamazsan dosyayı geldiği platforma bildir ve başka bir harita kullan.

Tarama yeterli mi, yoksa haritayı yine de test etmem gerekir mi?

Yine de test et. Tarama, BSP'nin içinde hangi entity'lerin ve dosyaların bulunduğunu gösterir. Bir mantık zincirinin çalışma zamanında ne yaptığı, örneğin kaç entity oluşturduğu, ancak çalışan bir sunucuda görünür hale gelir.