CHC-based Automated Verification of WebAssembly Programs
Dit artikel stelt een geautomatiseerde statische verificatiemethode voor voor een deelverzameling van WebAssembly met behulp van constrained Horn-clausules, die indirecte functie-aanroepen effectief afhandelt door middel van typegebaseerde filtering en grote panic handlers beheert via samenvatting van de control-flow analyse.
Oorspronkelijk artikel gelicentieerd onder CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Dit is een AI-gegenereerde uitleg van het onderstaande artikel. Het is niet geschreven of goedgekeurd door de auteurs. Raadpleeg het oorspronkelijke artikel voor technische nauwkeurigheid. Lees de volledige disclaimer
Stel je het internet voor als een enorme, bruisende stad waar elk gebouw een website is. Jarenlang werden deze gebouwen gebouwd met een specifieke, zware set blauwdrukken die ze veilig maakten, maar soms traag in constructie. Toen kwam er een nieuwe, superefficiënte taal genaamd WebAssembly. Het is als een universeel, razendsnel bezorgdrone-systeem dat overal op het web kan vliegen en zware ladingen code kan vervoeren om games, tools en apps direct in je browser te draaien. Omdat deze drones zo snel en krachtig zijn, moeten we ervoor zorgen dat ze nooit tegen een gebouw botsen of hun lading op de verkeerde plek laten vallen. Dat is de taak van "verificatie"—een chic woord voor het wiskundig bewijzen dat een programma veilig is voordat het überhaupt wordt uitgevoerd.
Om dit te doen, gebruiken computerwetenschappers vaak een "Satisfiability Solver". Zie deze solver als een superintelligente detective die naar een set regels kan kijken en direct kan vertellen of een scenario mogelijk of onmogelijk is. Als de regels zeggen "De drone moet in de lucht zijn" en "De drone moet op de grond zijn" op hetzelfde moment, weet de detective dat dit een tegenstrijdigheid is en dat het plan onveilig is. Dit paper neemt die detective en leert hem hoe hij de specifieke, lastige regels van WebAssembly moet begrijpen, vooral de onderdelen die te maken hebben met het indirect aanroepen van andere functies en het afhandelen van enorme foutmeldingen.
Het Mysterie van de Vormveranderende Aanroep
De auteurs, Akihisa Yagi, Ken Sakayori en Naoki Kobayashi van de Universiteit van Tokio, stonden voor een lastige puzzel. WebAssembly-programma's zijn als een enorme bibliotheek waar boeken (functies) dynamisch uit de schappen kunnen worden getrokken. Soms zegt de code niet "Open Boek A"; in plaats daarvan zegt het "Open het boek op plank nummer 5". Dit wordt een indirecte functieaanroep genoemd.
Het probleem is dat als je probeert elk enkel boek in de bibliotheek te controleren om te zien wat er op plank nummer 5 zou kunnen liggen, de detective (de solver) overweldigd raakt. Het is alsochten elke mogelijke combinatie van een miljoen sloten te controleren om de juiste sleutel te vinden. De naïeve aanpak zou zijn om elke mogelijkheid op te sommen, maar dat creëert een berg papierwerk die geen enkele computer in een redelijke tijd kan oplossen.
De oplossing van de auteurs was om te handelen als een zeer strikte bibliothecaris. Ze realiseerden zich dat WebAssembly een regel heeft: je kunt alleen een boek uit het schap trekken als het overeenkomt met het specifieke genre (type) waar je naar op zoek bent. Dus in plaats van elk boek in de bibliotheek te controleren, kijkt hun methode naar het "genre" dat vereist is bij de aanroeplocatie en filtert alle boeken eruit die niet passen. Dit verkleint de lijst met kandidaten drastisch, waardoor de taak van de detective veel gemakkelijker wordt. Ze voegden ook een tweede truc toe: als de bibliotheekplanken vergrendeld zijn en nooit veranderen (read-only), kunnen ze vooraf precies berekenen welk boek waar staat, waardoor een complexe puzzel verandert in een eenvoudige lijst van "als dit, dan dat"-regels.
De Reusachtige Paniekknop
De tweede uitdaging was de "panic handler". Stel je een programma voor dat, wanneer het een fout maakt, niet alleen stopt; maar een enorme, 10.000-stappen tellende toespraak begint uit te leggen over precies wat er misging, compleet met diagnostische grafieken en foutcodes, voordat het uiteindelijk opgeeft. In WebAssembly zijn deze panic handlers enorme blokken code die worden geactiveerd wanneer er iets misgaat.
Voor de veiligheidscontroleur zijn deze enorme toespraken een afleiding. Het enige dat ertoe doet, is dat het programma uiteindelijk veilig stopt met draaien (een "unreachable" instructie bereikt). De lange, kronkelende weg van het construeren van de foutmelding verandert de feitelijke situatie niet dat het programma crasht. Echter, als de detective probeert elke stap van die 10.000-stappen tellende toespraak te volgen, raakt hij overbelast.
De auteurs introduceerden een "samenvattingstechniek" (summarization). Ze realiseerden zich dat als een blok code alleen maar leidt tot een crash, ze de tussenpersoon kunnen elimineren. Ze gebruikten een control-flow analyse om deze lange, kronkelende paden te identificeren en vervingen ze door een eenvoudige afkorting: "Als je deze kamer binnenkomt, zul je uiteindelijk crashen." Het is als tegen een gids zeggen: "Sla de 50 minuten durende geschiedenisles over de lobby over; vertel ons gewoon dat de uitgang geblokkeerd is." Dit houdt de verificatie gefocust op de kritieke veiligheidskwesties zonder verloren te gaan in de ruis van de foutmelding.
De Resultaten: Een Werk in Uitvoering
Om hun ideeën te testen, bouwde het team een prototype-tool genaamd WASMVERIFIER. Ze voerden het 90 verschillende programma's, waaronder enkele geschreven in Rust en C, en vroegen het om te bewijzen dat ze veilig waren.
De resultaten waren veelbelovend maar niet perfect. Door twee verschillende detective-solvers (Z3 Spacer en Eldarica) te gebruiken, slaagde de tool erin om de veiligheid van ongeveer 54 tot 56 programma's te verifiëren of te weerleggen. Het liep echter tegen een muur aan bij ongeveer 20 tot 22 programma's, waarbij het uit tijd (een "timeout") of geheugen tekortkwam. In ongeveer 11 tot 12 gevallen gaf het een "vals alarm", waarbij het dacht dat een programma onveilig was terwijl het eigenlijk prima was. De auteurs leggen uit dat deze valse alarmen gebeurden omdat hun tool enkele niet-ondersteunde instructies moest vervangen door een "crash"-placeholder, wat de veiligheidscontrole te voorzichtig maakte.
Het paper suggereert dat hoewel deze aanpak een sterke stap voorwaarts is voor volledig geautomatiseerde veiligheidscontroles, het nog geen toverstaf is. De auteurs merken op dat de methode nog steeds wordt verfijnd, met name in hoe het complexe wiskundige operaties op bits (bit-vectors) afhandelt en hoe het omgaat met instructies die het nog niet volledig begrijpt. Ze vermoeden dat de methode sound en complete is, maar ze hebben de formele wiskundige bewijzen hiervoor nog niet geschreven, wat dat als een taak voor de toekomst laat liggen.
Kortom, het paper laat zien dat door slimmer te zijn in hoe we indirecte aanroepen filteren en door de rommelige delen van foutafhandeling samen te vatten, we automatische veiligheidscontroles voor WebAssembly veel praktischer kunnen maken. Het is een solide fundament, maar de detective heeft nog meer training nodig om elke zaak op te lossen.
Verdrinkt u in papers in uw vakgebied?
Ontvang dagelijkse digests van de nieuwste papers die bij uw onderzoekswoorden passen — met technische samenvattingen, in uw taal.