RE:NODE

Zabezpečení11 min čtení

Exploity a pády herních serverů

Jak se na herní servery dostanou crash exploity, dupe a vzdálené spuštění kódu, co Log4Shell naučil majitele Minecraftu a jaké patche, limity a nastavení je zmírní.

4 čtenáři

Exploit herního serveru je skoro vždy chyba ve hře, v jejím modovacím frameworku nebo v pluginu, kterou spustí vstup, jejž hráč smí poslat: speciálně upravený paket, přerostlý předmět, zpráva v chatu, síťová zpráva, kterou plugin nikdy neověřil. Hru sám neopravíš, takže obrana je krátký seznam věcí, které ovládáš: provozuj aktuální, záplatovaný build i framework, používej serverový software s limity vstupu (na Minecraftu je standardním příkladem Paper), odstraň pluginy, které důvěřují klientovi, nevystavuj nic kromě herního portu a drž zálohy dost čerstvé, aby dupe nebo rollback po zneužitém pádu stál minuty, ne dny.

Tento článek popisuje druhy exploitů, se kterými se majitelé serverů skutečně setkávají, případy, které stojí za to znát jménem, nastavení, která je zmírní, a jak reagovat, když někdo server shazuje schválně. Cheatování klientským softwarem je jiný problém, popsaný v řešení cheaterů a ban listy.

Druhy exploitů a které z nich máš opravit ty#

DruhCo se staneKdo to opraví
Crash exploitSpeciální vstup zabije nebo zamrzí serverVývojář hry nebo fork serveru
Lag machineLegitimní mechaniky postavené k přetížení tickuTy: limity a pravidla
DuplikacePředměty se zkopírují přes chybu v časování nebo logiceVývojář; škody omezuješ ty
Logický exploit pluginuPlugin důvěřuje vstupu, který měl ověřitAutor pluginu, nebo ho odstraníš
Vzdálené spuštění kóduVstup spustí kód na serveruVývojář, urgentně
Obejití autentizace nebo proxyNěkdo se připojí jako někdo jinýTy: konfigurace
Vystavený admin povrchRCON, webové panely nebo databáze dosažitelné zvenkuTy: konfigurace

Poslední tři řádky jsou místa, kde vzniká většina skutečných škod, a zároveň ta, která můžeš opravit hned dnes, aniž bys na někoho čekal. Horní řádky závisí na tom, jak rychle vývojář vydá patch a jak rychle aktualizuješ ty.

Log4Shell: případ, který by měl znát každý majitel serveru#

V prosinci 2021 se ukázalo, že zranitelnost v javové logovací knihovně Log4j, vedená jako CVE-2021-44228 a přezdívaná Log4Shell, jde zneužít přes chat v Minecraftu. Hráč poslal zprávu se speciálně utvořeným řetězcem; server zprávu zapsal do logu; Log4j řetězec vyložil jako pokyn stáhnout a spustit kód ze vzdálené adresy. Každý zranitelný server, který logoval chat, mohl převzít kdokoli, kdo se k němu dokázal připojit, a stejně tak zranitelní klienti, kteří zprávu zobrazili.

Mojang vydal 1.18.1 s opravou a zveřejnil mitigace pro starší verze: přepínač JVM pro 1.17 a náhradní konfigurační soubory logování pro 1.7 až 1.16.5. Paper a další serverový software záplatovaly své buildy během několika dní.

Trvalá ponaučení:

  • Staré verze nejsou bezpečné jen proto, že jsou staré. Server, který stále běží na verzi Minecraftu z doby před opravou, na nezáplatovaném buildu a bez zveřejněné mitigace, je zranitelný dodnes. Pokud kvůli modpacku provozuješ starou verzi, ujisti se, že build serverového softwaru byl vydán po prosinci 2021 nebo že je mitigace nasazená.
  • Logování je zpracování vstupu. Zranitelný kód nebyl vůbec v herní logice. Byl v knihovně, kterou hra používala k zápisu textových souborů.
  • Rychlost rozhoduje. Zneužívání začalo během hodin po zveřejnění. Servery, které se aktualizovaly ten samý den, byly v pořádku; servery, jejichž majitelé byli na dovolené, ne.

Přechod na záplatovanou verzi bez ztráty světa popisují upgrady verzí Minecraftu.

Minecraft: limity paketů, přerostlé předměty a obejití proxy#

Minecraft je nejvíc zneužívaný herní server z prostého důvodu, že je nejrozšířenější, a vanilla důvěřuje klientům víc, než by měla. Paper částečně existuje právě proto, aby to opravil.

Limity paketů. Upravený klient může posílat tisíce paketů za sekundu, což na vanille dokáže server zastavit. Paper má limiter paketů v config/paper-global.yml:

config/paper-global.yml
packet-limiter:  all-packets:    action: KICK    interval: 7.0    max-packet-rate: 500.0

Výchozí nastavení vyhodí klienta, který v průměru za sedm sekund pošle víc než 500 paketů za sekundu, což žádný legitimní klient nedělá. Pro typy paketů, které byly cíleně zneužívány, existují výjimky pro jednotlivé pakety. Struktura se mezi verzemi Paperu měnila, proto se řiď souborem, který tvůj server vygeneroval, a ne starým návodem.

Přerostlé předměty a book bany. Předměty s obrovským množstvím dat - klasickým případem byly knihy plné dlouhých stran - šlo umístit do truhly tak, že načtení chunku odpojilo každého hráče v okolí, nebo nafouknout data hráče tak, že se nemohl přihlásit. Paper kontroluje data předmětů a velikosti knih přes nastavení ve stejném souboru. Nech tyto limity ve výchozích hodnotách, pokud konkrétní plugin nepotřebuje víc.

Obejití proxy. Nejškodlivější „exploit“ v Minecraftu vůbec není chyba. Za proxy Velocity nebo BungeeCord běží backendové servery s online-mode=false a spoléhají na to, že hráče ověřuje proxy. Pokud je port backendu dosažitelný přímo, může se k němu připojit kdokoli, tvrdit, že je libovolný hráč, včetně operátora, a backend mu uvěří. Řešením je konfigurace:

  1. Použij Velocity s player-info-forwarding-mode = "modern" a stejným forwarding secretem na backendech, aby backend odmítl spojení, která nešla přes proxy.
  2. U BungeeCordu, který nic takového nemá, použij plugin jako BungeeGuard, který přidá sdílený token.
  3. Dbej na to, aby backendy, kde to jde, nebyly dosažitelné z internetu.

Celé nastavení najdeš v síť Minecraft serverů s proxy Velocity.

Lag machiny. Redstonové hodiny, farmy na předměty a hromady entit, které jsou legitimními mechanikami, ale jsou postaveny právě proto, aby srazily tick rate. Pomáhají limity entit a nastavení redstonu v Paperu, stejně jako pluginy omezující entity na chunk a pravidla určující, co se smí stavět. Diagnostiku pomocí profileru popisuje proč klesá TPS a co s tím.

Hry na Source a Garry's Mod: důvěřované zprávy#

U her na enginu Source engine záplatuje Valve samo a reálný povrch pro exploity je v doplňcích serveru.

V Garry's Modu je klasickým exploitem handler net.Receive, který důvěřuje klientovi. Addony posílají zprávy z klienta na server přes knihovnu net a serverový handler, který udělá cokoli, co zpráva říká - přidá peníze, vytvoří entitu, změní hráči rank - může zavolat jakýkoli klient pár řádky Lua. Exploit menu pro Garry's Mod jsou většinou sbírky známých zranitelných handlerů v populárních addonech. Bezpečný handler ověřuje vše, o čem by klient mohl lhát:

lua/autorun/server/shop.lua
util.AddNetworkString("shop_buy")net.Receive("shop_buy", function(len, ply)    if not IsValid(ply) or not ply:Alive() then return end    if (ply.nextShopBuy or 0) > CurTime() then return end    ply.nextShopBuy = CurTime() + 1    local id = net.ReadUInt(16)    local item = SHOP_ITEMS[id]    if not item then return end    -- check price, distance to the shop NPC and permissions here,    -- on the server, never trusting a value the client sentend)

Každý addon, který nainstaluješ, auditovat nebudeš, ale handlery můžeš vyhledat a podívat se na ty v méně známých addonech: grep -rn "net.Receive" garrysmod/addons. Obávat se je třeba handlerů, které ze zprávy přečtou částku, hráče nebo entitu a jednají podle toho bez kontrol. Související ladění popisuje výkon serveru Garry's Mod a chyby Lua.

U her na Source obecně:

  • Udržuj server aktuální. Aktualizace přes SteamCMD jsou způsob, jak se k tobě dostanou opravy enginu, a neaktuální server klienti často stejně odmítnou.
  • Vypni, co nepoužíváš. sv_allowupload 0 zabrání klientům nahrávat spreje a vlastní soubory, což byla historicky cesta pro upravené soubory shazující klienty. sv_allowdownload 0, pokud obsah servíruješ přes FastDL.
  • Drž SourceMod a Metamod aktuální. Po aktualizacích se rozbíjí gamedata a staré buildy rozšíření jsou místem, kde žijí chyby v nativním kódu.

Valve také koncem roku 2020 změnilo protokol dotazů na server a přidalo do A2S_INFO výzvu (challenge), aby se servery už nedaly zneužívat jako zesilovače v reflexních útocích. Servery na aktuálních buildech to mají automaticky; je to další důvod, proč nepouštět prastaré buildy. Protokol vysvětluje query porty a A2S.

Survival hry: dupe a rollbacky načasované pádem#

Survival a sandbox hry sdílejí jeden vzorec exploitů, který stojí za pochopení, protože ho jde otupit i bez patche.

Většina z těchto her ukládá na časovač. Pokud hráč předá předmět kamarádovi a pak server shodí před dalším uložením, svět se vrátí do stavu před výměnou - ale pokud se data hráče ukládají zvlášť nebo v jiném okamžiku, jedna strana může skončit s předmětem, zatímco druhá ho stále má. Jakýkoli spolehlivý způsob, jak server shodit, se stává duplikačním strojem.

Co můžeš udělat:

  • Zkrať interval ukládání, kde to hra dovoluje. Valheim má -saveinterval, Minecraft autosave, Palworld a další také. Kratší interval zužuje okno.
  • Opakované pády v okolí stejných hráčů ber jako vzorec, ne jako smůlu. V logu si přečti, co dělali těsně před každým pádem.
  • Drž obnovitelné zálohy v takové frekvenci, aby šlo svět vrátit před vlnu dupe, kdyby na to došlo.
  • Sleduj ekonomiku. Náhlý příval vzácného předmětu je způsob, jakým se dupe obvykle odhalí.

Kompromis mezi četností ukládání a sekáním při ukládání u jednotlivých her popisují intervaly autosave na herních serverech.

Vystavené povrchy, které ovládáš#

Mnoho incidentů popisovaných jako „server nám hackli“ vůbec nejsou exploity hry. Jsou to služby nechané dosažitelné se slabými nebo výchozími přihlašovacími údaji.

PovrchTypický portCo dělat
RCON Source a Minecraftu27015 TCP, 25575 TCPVypni, pokud se nepoužívá, jinak dlouhé heslo
BattlEye RConNastaveno v BEServer_x64.cfgStejně jako RCON
Webový panel txAdmin40120 TCPSilné admin účty s dvoufaktorovým ověřením
Webové panely a mapy pluginůRůznéVážej jen na to, co je třeba, vyžaduj přihlášení
Databáze pro pluginyRůznéNikdy veřejně se slabými údaji

Každé z toho jsou dveře, které na žádné chybě hry nezávisí. RCON bezpečně je dlouhá verze pro vzdálené konzole; k čemu který port slouží, popisují porty herních serverů vysvětlené. Na RE:NODE každý tarif uvádí své přidělené porty a porty přidáváš nebo odebíráš v záložce Network, takže port, který jsi nikdy neotevřel, není dosažitelný - a „otevírej jen to, co používáš“ je výchozí stav, ne povinnost.

Záplatování bez rozbití serveru#

Být aktuální je nejúčinnější obrana proti známým exploitům a důvod, proč to lidé nedělají, je, že aktualizace věci rozbíjejí. Postup, který se vyhne obojímu:

  1. Odebírej poznámky k vydání své hry, serverového softwaru (Paper, SourceMod, txAdmin, Oxide nebo Carbon) a největších pluginů. Bezpečnostní opravy bývají označené.
  2. Odděluj bezpečnostní aktualizace od funkčních. První nasazuj rychle. Druhé mohou počkat, až je dohoní pluginy.
  3. Testuj na kopii. Druhý malý server s týmiž soubory zachytí většinu rozbití - nastavení popisuje testovací server vedle produkčního.
  4. Zálohuj před každou aktualizací a tu zálohu zamkni, aby ji rotace neodstranila, než zkontroluješ výsledek.
  5. Verze připínej záměrně. Pokud musíš zůstat na staré verzi, vědz, které opravy ti chybí, a použij zveřejněné mitigace. Jak to dělat záměrně, ne z nedbalosti, popisuje připínání verzí a rollbacky.

Když ti někdo shazuje server#

  1. Najdi vzorec. Přečti si poslední řádky logu před každým pádem a crash report, pokud ho hra zapisuje. Stejné jméno hráče, stejný příkaz, stejné místo nebo stejný předmět před každým pádem je stopa. Pomůže čtení konzole.
  2. Odstraň spouštěč. Pokud je to záměr, zabanuj hráče. Pokud je spouštěčem předmět nebo chunk, odstraň ho editorem nebo vrať tu část světa zpět.
  3. Zavři okno. Dočasně zapni whitelist, pokud osobu zatím nedokážeš určit.
  4. Aktualizuj nebo odstraň zranitelnou komponentu - aktualizace pluginu, aktualizace frameworku nebo úplné odstranění addonu.
  5. Nahlas to soukromě vývojáři nebo autorovi pluginu, s řádky z logu, aby se to opravilo pro všechny. Metodu nezveřejňuj.

FAQ#

Mohu crash bug hry opravit sám?

Obvykle ne v samotné hře. V Minecraftu serverový software jako Paper opravuje mnoho vanilla chyb a na modovaných platformách může plugin někdy zablokovat vstup, který chybu spouští. Jinak to nahlásíš, omezíš dopad a aktualizuješ, až přijde oprava.

Je můj starý Minecraft server stále zranitelný vůči Log4Shellu?

Pokud běží na verzi z doby před prosincem 2021 na serverovém softwaru sestaveném před tímto datem a bez zveřejněné mitigace, ano. Použij build serveru vydaný po opravě nebo aplikuj přepínač JVM či konfiguraci logování od Mojangu pro svou verzi.

Jsou opravy exploitů totéž co anti-cheat?

Ne. Anti-cheat hledá cheatovací software na počítači hráče. Exploity používají legitimní klienty, které posílají vstup, jejž server špatně zpracuje, takže anti-cheat nevidí nic neobvyklého. Opravy přicházejí z patchů, limitů vstupu a konfigurace.

Jak hráči nacházejí exploity v pluginech?

Stejně jako byste to dělali vy: čtením kódu populárních pluginů, zvlášť na skriptovaných platformách jako Garry's Mod a FiveM, kde je kód v čitelné podobě, a sdílením toho, co najdou. Cílem bývají populární, neudržované addony.

Mám hráčům říct o exploitu, který jsme opravili?

Řekni jim, že byl problém opraven a co se pro ně změnilo, například rollback. Metodu vynech, zejména pokud mohou být jiné servery stále zranitelné.


Komentáře

Zcela anonymně: žádný účet, žádný e-mail, žádné cookie. Ukládáme jen jméno, které napíšeš, text a čas - nic dalšího. Počet odkazů je omezený a značkování se nevykresluje.

0/2000