Tors proof-of-work-verdediging: denial-of-service tegen onion services duur maken
Een onion service onder een flood-aanval kan niet doen wat een normale website doet: er zijn geen IP-adressen te ratelimiteren, want noch bezoekers noch aanvallers onthullen er een. Tors antwoord, geleverd in Tor 0.4.8 en in augustus 2023 aangekondigd op de projectblog, is de introductiestap in processortijd prijzen. Het ontwerp stamt af van voorstel 327, in april 2020 geschreven door George Kadianakis, Mike Perry, David Goulet en tevador, dat de kern kaal benoemde: rendezvous-circuits bouwen is duur voor de dienst én voor het netwerk, en rate limiting alleen veranderde daaraan nooit iets.
Een puzzel die alleen onder last verschijnt
Het schema is transparant in protocolzin: er is geen extra challenge-roundtrip. De puzzelparameters zitten in de onion-service-descriptor die clients toch al ophalen - een versietag, een 32-bytes seed, een voorgesteld inspanningsniveau en een vervaldatum. Zolang de voorgestelde inspanning op nul blijft, slaapt de verdediging en verlopen introductions precies zoals voorheen. Ziet de dienst overbelasting, dan verhoogt hij de voorgestelde inspanning. Clients lossen dan Equi-X op, de in het voorstel gespecificeerde puzzelfunctie, over een challenge opgebouwd uit een personalisatiestring, de geblindeerde service-ID, de seed, een willekeurige 16-bytes nonce en de gekozen inspanning. De oplossing van zo'n 43 bytes reist als extensie mee in de INTRODUCE1-cel. Volgens de Tor-blog kost een eerste oplossing zo'n 5 milliseconden op een snelle machine en tot ongeveer 30 op langzamere hardware; onder aanhoudende aanval kan de benodigde arbeid richting een minuut rekenwerk klimmen.De wachtrij betaalt per inspanning
Een oplossing controleren is bewust goedkoop; het dure deel - het rendezvous-circuit bouwen - wordt uitgesteld. Gecontroleerde verzoeken komen in een prioriteitswachtrij gesorteerd op geclaimde inspanning, oudere items winnen gelijke standen, en een scheduler leegt haar in getemd tempo. De moeilijkheid volgt een add-increase-/multiply-decrease-cyclus over vensters van 300 seconden: blijft de wachtrij verzadigd, dan verhoogt de dienst de inspanning naar de vorige waarde plus één of naar de gemiddelde inspanning van behandelde introductions - wat het hoogste is; zakt de druk, dan krimpt de inspanning met ongeveer een derde. Clients proberen het opnieuw met oplopende inspanning - verdubbelen onder 1.000, daarna keer 1,5 - tussen de grenzen die de spec op 8 en 10.000 zet. Seeds rouleren ongeveer elke twee uur; de vorige seed blijft kort geldig om racecondities te vermijden.Waarom gewone gebruikers er weinig van merken
Omdat de puzzel alleen bestaat zolang de dienst onder stress staat, betaalt gewoon verkeer bij lage last niets. Iemand die tijdens een aanval een paar pagina's opent, spendeert milliseconden - een ervaring die de blog vergelijkt met wachten op een trage verbinding - terwijl een aanvaller die miljoenen introductions stuurt voor elke enkele betaalt. De samenvatting van het Tor Project:"Blocks attackers while giving real users a chance to reach their destination" - Tor Project-blog, augustus 2023
Hoe diensten zich aansluiten
Operators sturen de verdediging via torrc. De schakelaars, gedocumenteerd in de onion-service-DoS-gids van het project:- HiddenServicePoWDefensesEnabled - publiceert de puzzel in de descriptor en schakelt de op inspanning gesorteerde wachtrij in
- HiddenServicePoWQueueRate en HiddenServicePoWQueueBurst - hoe snel geverifieerde verzoeken de wachtrij verlaten
- CompiledProofOfWorkHash - een globale optie die de hashfunctie voor puzzels kiest










