Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Internet a sítě

Předběžné vydání Anubisu umí počítat kontrolu návštěvníků ve WebAssembly

Anubis je brána, kterou si před své weby staví projekty jako GNOME, Codeberg nebo Arch Linux, aby je nezahltili roboti sbírající text pro modely. Předběžné vydání 1.28.0-pre1 z 30. srpna přidalo výpočet kontroly ve WebAssembly, který je napsaný v Rustu a běží stejný na serveru i v prohlížeči. Zapnout si ho zatím musí správce sám.

· 110 zhlédnutí

Anubis pojmenovává potíž otevřených projektů hned na své odmítací stránce: firmy kolem umělé inteligence weby agresivně sklízejí, což podle toho textu „weby shodit může a taky shazuje, takže se jejich zdroje stanou nedostupné pro všechny“. Od 30. srpna má program v předběžném vydání 1.28.0-pre1 novou podobu kontroly – počítá se ve WebAssembly a je napsaná v Rustu.

Co Anubis dělá

Anubis stojí jako brána před webem a než požadavek pustí dál, nechá prohlížeč spočítat úlohu s ověřitelným výsledkem. Vlastní popis projektu na GitHubu zní „váží duši příchozích požadavků HTTP, aby zastavil crawlery AI“, což naráží na egyptského boha, po kterém se program jmenuje. Jádro je v Go, licence MIT, repozitář vznikl 17. března 2025 a 7. září 2026 měl 22 214 hvězd.

Metoda se jmenuje proof of work a Anubis ji odvozuje od Hashcashe, staršího návrhu proti spamu: pro jednoho návštěvníka je zátěž zanedbatelná, pro toho, kdo stahuje statisíce stránek, se sečte do částky vidět na účtu za výpočetní čas. Autor si o svém programu nedělá iluze a označuje ho za kompromis a za dočasné řešení, než bude čas na rozpoznávání bezhlavých prohlížečů podle jemnějších znaků.

Úlohu nedostane každý. Anubis ji podle dokumentace posílá jen požadavkům, jejichž hlavička User-Agent obsahuje řetězec Mozilla, a vynechává /robots.txt, /favicon.ico, adresář /.well-known a adresy končící na .rss, .xml nebo .atom. Klienti gitu a čtečky RSS tak projdou bez zdržení.

Odmítací stránka Anubisu s hláškou Oh noes a s číslem verze
Když jsme si článek o WebAssembly chtěli otevřít skriptovaným prohlížečem, Anubis nás odmítl. Dole na stránce stojí verze, na které web toho dne běžel. Foto: anubis.techaro.lol, vlastní snímek obrazovky (7. září 2026)

Kdo Anubise používá, vede projekt sám v dokumentaci. Jsou v tom seznamu mimo jiné gitlab.gnome.org, gitlab.freedesktop.org, codeberg.org, wiki Arch Linuxu, sestavovací služba Hydra projektu NixOS a bugzilla WineHQ.

Tři nové funkce místo jedné

Předběžné vydání 1.28.0-pre1 vyšlo 30. srpna 2026 pod kódovým jménem Wuk Lamat a přidává tři výpočty ve WebAssembly: argon2id, hashxsha256. Všechny jsou napsané v Rustu pro cíl wasm32-unknown-unknown bez standardní knihovny a v konfiguraci se volí u prahu nebo u pravidla:

thresholds:
  - name: moderate-suspicion
    expression:
      all:
        - weight >= 10
        - weight < 20
    action: CHALLENGE
    challenge:
      algorithm: argon2id
      difficulty: 6

Rozdíl proti dosavadní úloze není jen v jazyce. argon2id si vyžádá velkou souvislou oblast paměti, takže se u něj hrubá síla prodraží; hashx dokumentace popisuje jako odolný proti řešení na grafické kartě i na jednoúčelovém čipu. Autor Xe Iaso k tomu píše, že cesta „hele, Claude, zbastli mi řešič Anubise v CUDA“ je na dobré cestě k tomu být z principu mrtvá. sha256 zůstává jen jako záloha – dokumentace u něj rovnou uvádí, že na tuhle úlohu existují známé řešiče.

Druhá změna je organizační: klient i server nepoužívají stejný kód, ale týž binární soubor. Dosud měla rychlá úloha dvě implementace, v JavaScriptu a v Go, a každá oprava se musela udělat dvakrát.

Ve výchozím nastavení jsou nové metody vypnuté. Autor to v poznámkách k vydání zdůvodňuje tím, že si není jistý chováním v okrajových případech; zapnout je jako výchozí chce ve verzi 1.29.0.

Obtížnost rostla po šestnáctinásobcích

Při té příležitosti se opravila i vada, kterou dosavadní úloha vlekla od začátku. Porovnávala řetězce, a počítala tedy vedoucí nulové půlbajty, ne vedoucí nulové bity. Zvýšení obtížnosti o jedničku proto v nejhorším případě znamenalo šestnáctkrát víc práce. Nové výpočty počítají bity a dokumentace k tomu dává převodní tabulku: obtížnosti 4 u staré úlohy odpovídá 4 u argon2id, ale 16 u sha256 a 15 u hashx.

Proč to trvalo rok

Sám autor píše, že první verze byla hotová za pár dní a zbytek roku spolykaly podrobnosti. Anubis podporuje Chrome 75 a novější, protože na téhle verzi uvázla spousta telefonů, televizí a dalších přístrojů s Androidem bez možnosti aktualizace; JavaScript se pro jistotu překládá pro Chrome 66. Instrukce SIMD, které na telefonech znamenají velký rozdíl, ale prohlížeče umějí až od Chromu 91, takže se WebAssembly staví dvakrát a vybírá se podle toho, co zrovna běží.

Klienti, kteří mají WebAssembly vypnuté zásadou – autor jmenuje režim Lockdown v iOS a výchozí nastavení prohlížeče Vanadium v GrapheneOS –, dostanou nouzovou cestu. Hotový modul se nástrojem wasm2js z projektu Binaryen převede zpátky na JavaScript. Výsledek je objemný a běží bez překladače za běhu, takže je pomalý, a ukazatel průběhu se u něj nehýbe; projekt to vede jako známou vadu.

Aby se sestavení nerozcházela mezi vývojářským strojem, CI a distribucemi, přeložil autor sám wasm-optwasm2js z Binaryenu verze 128 do WebAssembly a výsledné soubory uložil rovnou do repozitáře. Vlastní věta o tom zní, že vaše nástroje se od jeho nemůžou lišit, když vám je pošle s sebou.

Právě tenhle krok vynesl na světlo chybu v překladači. Každé sestavení se lišilo asi o 29 bajtů a autor to 19. června 2026 nahlásil projektu LLVM jako hlášení číslo 204883. Že nejde o jeho vstupy, poznal podle toho, že vypnutí náhodného rozmisťování paměti (setarch --addr-no-randomize) dalo na jednom stroji pokaždé týž výsledek. Příčinou byly ukazatele použité jako klíče do slovníku ve WebAssembly části překladače, takže pořadí průchodu záviselo na tom, kam se struktury zrovna uložily. Opravu poslal Derek Schuff z týmu LLVM a 27. června 2026 se dostala do hlavní větve.

Zbývala poslední překážka: Chrome 75 modul odmítl s chybou o indexu tabulky. Standardní knihovna Rustu se totiž v rustup stahuje přeložená předem, takže se na ni volby vlastností nevztahují, a jedna její funkce používala referenční typy, které tak starý prohlížeč nezná. Pomohl až průchod přes wasm-opt s přepínačem -mvp, který z modulu vyhodí všechno nad rámec původní definice WebAssembly; zpátky se povolí jen to, co Chrome 75 umí.

Aby to nemusel zkoušet ručně v padesáti prohlížečích, postavil si zkušebnu jménem chromesweep: spouští v ní najednou mnoho verzí Chromu, každou v mikrovirtuálním stroji a se síťovým pravidlem, které jí dovolí jen dotaz na DNS a spojení s testovanou instancí Anubise. Sbírku prohlížečů zveřejnil v červenci 2026 jako repozitář TecharoHQ/gubal.

Co zůstává otevřené

Autor sám vypisuje, co ještě není hotové. Ukazatel průběhu u nouzové cesty se nehýbe. Nové výpočty jsou tak rychlé, že si správci budou muset obtížnost přenastavit. Rozpoznávání telefonů, které by jim podle pověsti adresy a otisku TLS dalo úlevu, je zatím prototyp. A programy s úlohami by chtěl vyměňovat za běhu, ne až při překladu Anubise.

K vlastnímu zápisu autor přiložil odkaz na dokument s historií psaní a poznámku, že se na textu žádný model nepodílel a použil ho jen na vykreslení jednoho diagramu. U programu, který vznikl kvůli robotům sbírajícím text pro modely, to sotva bude náhoda.

Zdroje

Internet a sítě

Rust WebAssembly Anubis LLVM proof of work

← zpět na výpis