Kde anticheat stojí
Ochrana Minecraft serveru má dvě poloviny, které se často pletou. První je vpuštění: zastavit floody, prověřit spojení, nechat ta nejistá prokázat účet nebo člověka. Tomu se věnují Bot útoky na Minecraft server a DDoS ochrana Minecraft serveru.
Druhá polovina začíná potom, co tohle všechno projde. Každá vstupní brána je ohraničená — mít skutečný účet, přečíst kód, jednou se znovu připojit — a každá je cenou, kterou odhodlaný člověk jednou zaplatí a pak na ni zapomene. Hráč se skutečným účtem, který prošel každým ověřením a jehož klient tiká přesně jako opravdový, může pořád přeletět mapu, praštit někoho skrz zeď nebo projít zamčenými dveřmi.
Anticheat je vrstva, která sleduje, co session dělá, paket po paketu, a ptá se, jestli to bylo možné.
Proč je měřítkem fyzika samotné hry
Pohyb v Minecraftu není vágní. Vertikální rychlost hráče ve vzduchu klesá v každém ticku podle přesného pravidla, ať dělá cokoli. Skok je ta křivka začínající na pevné počáteční rychlosti, trvá zhruba sekundu a dostane hráče o něco výš než o blok. Pád je ta samá křivka do záporu. Vanilla klient posílá jeden pohybový paket za tick, dvacetkrát za sekundu, protože to dělá jeho tick smyčka. Ruka hráče dosáhne asi tři bloky.
Tohle nejsou prahy, které někdo naladil. Tohle je ta hra — a právě proto je detekce cheatů vůbec řešitelná: neptáte se „vypadá to podezřele", ptáte se „je to v souladu s jedinou fyzikou, jakou klient smí mít".
Jemnost je v tom, že vlastní pozici hlásí ten samý klient a každá hodnota v té zprávě je něco, o čem cheat může lhát. Nejzneužívanějším příkladem je příznak „na zemi": fly modul ho prostě nastaví na true a tvrdí, že stojí. Kontrola, která tomu příznaku věří, nekontroluje nic. Řešením je zrekonstruovat, co hráče drží, z bloků kolem něj — ze světa, který poslal server a který klient nenapsal.
A ta rekonstrukce musí být upřímná ohledně vlastní nejistoty. Půlblok, žebřík, loďka, nenačtený chunk nebo blok, na který daná verze nemá názor, znamenají totéž: žádný důkaz ani jedním směrem. Správné chování je pak neříct nic, ne hádat. „Nic ho nedrží" musí být důkaz, ne výchozí hodnota, protože všechno, co se na tom staví, obviňuje hráče.
Úrovně porušení místo verdiktů
Druhá strukturální myšlenka je, že kontrola nemá vydávat verdikt nad jedním paketem. Vydává úroveň porušení.
Každá kontrola přispívá do průběžného skóre daného hráče a to skóre v čase plynule klesá. Hráč, který kontrolu spustí jednou za hodinu — výkyv latence, špatně predikované dopadnutí, plugin dělající něco neobvyklého — nikdy nic nenastřádá. Hráč s modulem spouští tu samou kontrolu nepřetržitě a stoupá. Na různých výškách toho skóre visí různé důsledky: nejdřív nic, pak korekční teleport, pak kick, pak dočasný ban.
Že skóre klesá plynule místo resetu na časovač, je důležitější, než to zní. Znamená to, že neexistuje hranice okna, za kterou by se cheat schoval, a že nic nemusí uklízet staré záznamy, aby systém zůstal poctivý.
Setback: korekce, která není trestem
Kick není správná první reakce na porušení v pohybu — a ignorovat ho taky ne. Správná reakce je způsobit, že se ten pohyb nestal.
Když se závadný pohybový paket zahodí, server se o něm nikdy nedozví — ale klient si dál predikuje lokálně a ti dva se rozejdou. Proto se hráč po zahození pošle zpět na poslední pozici, která přeposlána byla. Z pohledu cheatera je to rubber-banding, který každý zná: letí a cukne zpátky. Z pohledu serveru se nelegální pohyb prostě nestal. Nikdo není vyhozen, nic se neodvolává a cheat nepřinese žádnou výhodu — což je lepší výsledek než ban, protože nevyžaduje, aby si byl někdo jistý.
Kategorie cheatů
Různé cheaty zanechávají úplně jiné stopy, takže je pokrývají samostatné kontroly s vlastní logikou:
- Pohyb — fly, speed, no-clip, chození po vodě a timer hacky, které zrychlují celou tick smyčku klienta. Viz Fly, speed a timer hacky.
- Souboj — killaura, reach, aimboty, autoclickery a velocity moduly ignorující knockback. Viz Killaura a reach hacky.
- Svět — X-ray, nuker, scaffold a tower. Viz Detekce X-raye, nukeru a scaffoldu.
- Protokol — klienti, kteří prostě posílají víc, než klient poslat může. Flood paketů uvnitř session je vlastní kategorie a není totéž co rate limit na úrovni spojení: klient, který se legitimně připojil a pak pustí kohoutky, stojí server přesně tolik co flood spojení, a na úrovni spojení ho nikdo nepočítá.
Proč jsou falešné poplachy tím drahým selháním
Tohle je rozhodnutí, které tvaruje všechno ostatní. Cenou za přehlédnutý cheat je jeden naštvaný server na nějakou dobu. Cenou za falešný poplach je skutečný hráč platícího zákazníka vyhozený z vlastní hry, bez tušení proč a bez možnosti se ozvat. Ty dvě věci nejsou symetrické, takže ani výchozí nastavení symetrické být nemá.
V praxi to znamená: tolerance, které se rozšiřují s dobou odezvy session, protože vzdálený hráč opravdu švihá tam, kde cíl býval. Souvislé série místo jednotlivých událostí, protože jeden okamžik čehokoli má nevinné vysvětlení. Statistické kontroly držené záměrně slabé. A monitorovací režim, kde všechny kontroly běží a zapisují, ale nic nekonají, aby si provozovatel mohl prohlédnout, co by vynucování udělalo, než ho zapne.
Dobrým varovným příkladem je historie detekce aimbotů. Lákavé pravidlo říká, že skutečná myš hlásí celé jednotky škálované citlivostí, takže poctivé rozdíly natočení by měly sdílet společného dělitele, zatímco úhel spočítaný z pozice cíle ne. Je to elegantní a je to špatně: krok natočení v Minecraftu padne na úhlový kvantum protokolu čistě v podstatě u jediného nastavení citlivosti a u žádného jiného, takže se společný dělitel sesype a pravidlo označí skoro každého poctivého hráče. Pravidlo, které chytá cheatery i poctivé hráče stejně, není přísný anticheat — je to výpadek.
Proč je proxy dobré místo
Tradiční anticheat je plugin. Funguje to a má to jednu strukturální slabinu: žije uvnitř serveru, soupeří o stejný tick budget, který má chránit, a závisí na tom, jestli ho provozovatel udržuje aktuální napříč verzemi hry.
Provozovat kontroly v ochranné proxy před serverem mění tři věci. Vidí surový tok paketů oběma směry, takže může měřit, co klient poslal, proti tomu, co server klientovi řekl. Nespotřebovává tick budget serveru. A na stroji hráče není nic, co by cheat klient mohl vypnout, protože analýza na stroji hráče neběží.
Má to i skutečnou cenu, kterou je poctivé říct nahlas: aby proxy mohla číst pakety, musí mluvit herním protokolem verze daného klienta, ne jen přeposílat bajty — a číslování paketů herního stavu se posouvá skoro s každým vydáním Minecraftu. Proto je hloubková inspekce volitelná per server, ne výchozí, a proto verze, jejíž formát není ověřený, degraduje na žádnou inspekci místo na hádanou. Špatný odhad rozložení paketu je reach flag proti nevinnému hráči.
Jak vypadá dobrý důkaz z anticheatu
Když kontrola zabere, užitečný záznam není „hráč X byl označen". Je to která kontrola zabrala, jaká byla naměřená hodnota, jaká byla legální hodnota a kdy. To je to, co umožní provozovateli odpovědět na stížnost, a to je, co udělá z příliš přísné kontroly viditelný výkyv jednoho konkrétního důvodu místo mlhavého nárůstu nespokojenosti.
Text kicku má říkat opak: co nejmíň. Pojmenovat pravidlo, které zabralo, řekne autorovi cheatu přesně, kterou polovinu opravit příště. Důvod patří na záznam o porušení, pro provozovatele, který ho potřebuje — ne na obrazovku toho, kdo se ho snaží porazit.
Ochrana herních serverů od Itnetic provozuje tyto kontroly na edge před serverem, s režimy monitorování i vynucování a s konfigurací pro každou kontrolu zvlášť.