Co join flood doopravdy dělá
Někdo si pronajme botnet nebo stresser, namíří ho na adresu vašeho serveru a začne se připojovat. Každé spojení provede skutečný handshake a skutečný pokus o přihlášení. Na serveru v online módu to znamená vygenerovat šifrovací výzvu, dešifrovat odpověď klienta a zeptat se session serverů Mojangu, jestli je účet pravý.
Ten poslední krok je zajímavý, protože je to síťový dotaz na třetí stranu. Server na něj neumí odpovědět lokálně ani rychle. Pod floodem se ty dotazy hromadí a thread pool, který je obsluhuje, přestane obsluhovat cokoli jiného. Tick rate se propadne. Formálně nikoho nevyhodí, ale svět je nehratelný a lidé odejdou.
Když server běží v offline módu („cracked"), kryptografie i dotaz zmizí — a útok se zjednoduší, protože každé spojení jde rovnou do světa s jménem, které si nárokovalo. Sto botů stojících ve spawnu není nenápadné selhání.
Podpisy a proč ten nejzřejmější přestává fungovat
Klasickým znakem jsou jména. Levné útočné nástroje je generují, takže vidíte zeď osmiznakových řetězců bez vzorce samohlásek, jaký by si člověk vybral. V logu se to snadno pozná a snadno filtruje — a přesně proto to vážné útoky dělat přestaly. Účty se dají koupit a flood poháněný skutečnými účty se skutečnými jmény projde jakýmkoli filtrem na jména.
Ostatní podpisy jsou strukturální, ne kosmetické:
- Rychlost. Hodně přihlášení za sekundu z hodně adres ve chvíli, kterou nic jiného nevysvětluje.
- Rozložení adres. Drtivě datacentra, VPN a proxy rozsahy místo rezidenčních — protože botnety jsou pronajatá infrastruktura. Je to indicie, ne verdikt: spousta skutečných hráčů se připojuje přes VPN.
- Opakování napříč oběťmi. Útoky na herní servery jsou z drtivé většiny pronajaté botnety a stejné adresy putují od jednoho serveru k druhému. Adresa, která se už jinde projevila nepřátelsky, by u vás neměla dostat čistý štít.
- Chování po připojení. Tohle je nejsilnější signál a věnuje se mu odstavec níž.
Vrstvy a co která omezuje
Neexistuje jedna kontrola, která by tohle pokryla, a produkt, který tvrdí opak, popisuje kontrolu, kterou útočníci porazí jako další. Funguje žebřík, kde každý příčel stojí útočníka víc než ten předchozí a skutečného hráče nestojí nic.
1. Limity souběhu a rychlosti na adresu. Nejlevnější možné síto. Distribuovaný útok nezastaví — od toho jsou další vrstvy — ale zabrání jednomu stroji stát vás neomezené množství práce a nic nestojí. Rozpočty na přihlášení a na pingy se drží odděleně: stavový ping je levný a je normální posílat ho často, přihlášení je drahé a je normální posílat ho zřídka. Jeden společný rozpočet by musel být volný dost pro pingy, čímž by pro přihlášení ztratil smysl.
2. Reputace. Adresa, která se už projevila nepřátelsky proti jinému serveru, si tu historii nese s sebou. Klíčové návrhové pravidlo je, že reputační skóre nesmí nikdy blokovat samo o sobě — nejhorší, co smí udělat, je zvednout úroveň vyžadovaného důkazu. Jinak se špatný den jednoho zákazníka stane blokací pro všechny ostatní a omyl se stane trvalým. Znamená to taky, že se do takového systému mají hlásit jen signály s vysokou jistotou: porušení protokolu si adresa způsobila sama, zatímco odmítnutí kvůli rate limitu vypovídá stejně tak o nastavených limitech serveru jako o adrese.
3. Prokázání účtu. Vyžádat si po spojení skutečný, aktuálně přihlášený Minecraft účet je zeď, kterou botnet nepředstírá a levně ve velkém nekoupí. Je to zároveň nejdražší kontrola, takže musí mít rozpočet na adresu — flood nesmí z vaší ochrany udělat generátor zátěže proti Mojangu — a musí selhávat směrem k propuštění. Výpadek session serverů, který se stane vaším výpadkem, je horší selhání než krátkodobé vpuštění neověřeného hráče.
4. Prokázání člověka. Účty se dají nakoupit ve velkém, takže vlastnictví účtu není konec žebříku. Vrstva nad ním chce po člověku přečíst krátký kód z obrazovky a napsat ho zpátky — pro hráče sekundy, pro útočníka OCR pipeline nebo živý člověk na každý účet a každé připojení. Viz CAPTCHA a ověřování hráčů v Minecraftu.
5. Chovat se jako klient. Každá brána výše je ohraničená cena: zaplaťte jednou a jste uvnitř. Jediné, co žádný bot nezaplatí, je průběžná cena za to chovat se jako Minecraft klient celou dobu, co je připojený.
Vrstva, kterou boti zaplatit neumí
Skutečný Minecraft klient běží v tick smyčce dvacetkrát za sekundu a všechno, co dělá, má tvar té smyčky. Na keep-alive odpovídá až v dalším ticku, ne v okamžiku, kdy ho přečte, takže se doby odezvy rozprostřou po šířce ticku místo aby byly ploché. Posílá široký slovník typů paketů. Jeho pohled se hýbe, protože ruka na myši nikdy není dokonale klidná. Skriptovaný klient, který odpovídá hned po přečtení, mluví čtyřmi typy paketů a nikdy nepohne kamerou, nedělá nic z toho — a předstírat to znamená provozovat skutečnou tick smyčku, což je ta drahá polovina toho být klientem.
Zásadní návrhové pravidlo je, že žádný z těch signálů sám o sobě nic neblokuje, protože každý má poctivé vysvětlení. AFK hráč se nehýbe. Moddovaný klient mluví vlastním slovníkem. Hráč na LAN má ping tak plochý, že vypadá uměle. Jeden signál je náhoda; několik najednou je skript.
Spam v chatu je skupinový jev
Druhá věc, kterou boti po vstupu dělají, je reklama. Deset účtů posílajících jednu šablonu s náhodným tokenem na konci je neviditelných, když se díváte na jednu session — každá zpráva je unikátní, takže filtry na přesnou shodu nikdy nezaberou — a nezaměnitelných ve chvíli, kdy se podíváte na skupinu. Chytí je až to, že se zprávy sesypou na tvar, který sdílejí, a pak se zaznamená, že několik různých session vyrobilo stejný tvar v krátkém okně. Podstatný rozdíl: pět hráčů napíše „gg" během deseti sekund je normální konec kola, zatímco pět hráčů píšících stejnou větu s pokaždé jiným náhodným řetězcem je jeden program řídící všech pět.
Co dělat, když to právě probíhá
- Nepřepínejte do offline módu „kvůli zátěži". Odstraníte tím jedinou kontrolu, která útočníka něco skutečného stojí.
- Nezačínejte banovat uživatelská jména. Budete přejmenovávat proměnnou, kterou ovládá útočník, a nakonec zabanujete skutečného hráče.
- Dostaňte prověřování ze svého stroje. Každá obrana aplikovaná na serveru samotném se aplikuje až poté, co server zaplatil. Pokud nejste za filtrující proxy, tohle je změna, na které záleží.
- Zapněte trvalé ověřování, pokud ho máte. Ochrana, která čeká, až provoz začne vypadat jako útok, má většinou pravdu; když už víte, že přijdou potíže, zrušit tuhle podmínku a ověřovat rovnou všechny je levná pojistka.
- Nechte si logy. Které adresy, která jména, jaké důvody odmítnutí. Je to jediná věc, která z „byli jsme pod útokem" udělá něco, s čím se dá pracovat.
Obecný postup při incidentu na webu platí i tady — viz Jak zastavit DDoS útok — a architektonický pohled najdete v článku DDoS ochrana Minecraft serveru.