RustGo: Fairly Directed Greybox Fuzzing for Enforcing Rust Memory Safety
RustGo is een nieuwe directed greybox fuzzer die gebruikmaakt van Rust-specifieke statische analyse om potentieel geheugenfoutdoelwitten automatisch te identificeren en irrelevante executiepaden te elimineren, waardoor de fuzzing-efficiëntie aanzienlijk wordt verbeterd en onbekende kwetsbaarheden in unsafe Rust-code worden ontdekt vergeleken met bestaande benaderingen.
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 voor dat je een detective bent die probeert een enkele, minuscule fout te vinden in een enorme, bruisende stad. In de wereld van computersoftware is deze stad een programma, en de fout is een "memory bug" – een fout waarbij het programma probeert gegevens te pakken, te gebruiken of weg te gooien die het niet zou mogen aanraken, wat ervoor zorgt dat het crasht of gehackt wordt. Decennialang was de populairste manier om deze bugs te vinden "fuzzing". Denk aan fuzzing als het gooien van miljoenen willekeurige, chaotische sneeuwballen tegen de stadsmuren om te zien of er een raam breekt. Meestal werkt dit goed voor oudere talen, maar er is een addertje onder het gras: het is ongelooflijk inefficiënt. Je gooit misschien 99 sneeuwballen tegen de stevige, onverwoestbare voordeur, om vervolgens pas de ene zwakke plek in de achterste steeg te vinden.
Maak kennis met Rust, een moderne programmeertaal die fungeert als een superstrenge beveiligingsbeambte. De regels van Rust zijn zo goed dat 90% van de stad die het bouwt, praktisch onkwetsbaar is; de bewaker zorgt ervoor dat de meeste "ramen" (geheugengebieden) standaard stevig op slot zitten. Echter, om bepaalde complexe dingen te bouwen, staat Rust ontwikkelaars toe om een kleine, speciale poort te openen die "unsafe code" wordt genoemd. Dit is de enige plek waar de strikte regels worden versoepeld, en het is de enige plek waar een memory bug zich kan verschuilen. Het probleem is dat bestaande "sneeuwbal-gooiende" tools dit niet weten. Ze blijven sneeuwballen gooien naar de 90% van de stad die al veilig is, waardoor ze tijd en energie verspillen, terwijl ze de paar gevaarlijke plekken achter de speciale poort missen. Dit artikel introduceert een nieuw detectietool genaamd RustGo die het spel verandert door precies te weten waar de sneeuwballen gegooid moeten worden.
De Slimme Detective: RustGo
De onderzoekers achter dit artikel, een team van Korea University en andere instellingen, realiseerden zich dat het willekeurig gooien van sneeuwballen naar een Rust-programma is als het proberen te vinden van een naald in een hooistak door de hele hooistak in brand te steken. Omdat Rust veiligheid garandeert voor het grootste deel van de code, vroegen zij zich af: Waarom zouden we de veilige delen überhaupt testen? Ze bouwden RustGo, een "directed greybox fuzzer" die werkt als een detective met een kaart en een vergrootglas, in plaats van een geblinddoekte persoon die met stenen smijt.
RustGo werkt in drie slimme stappen om bugs efficiënt op te sporen:
1. De juiste doelwitten vinden (De Kaart)
Eerst scant RustGo de code om de "unsafe" zones te vinden waar bugs zich kunnen verschuilen. Maar het gokt niet zomaar. Het gebruikt een speciaal soort analyse om te kijken hoe data door het programma stroomt. Stel je voor dat de stad veel steegjes heeft, maar sommige leiden naar doodlopende wegen of lussen die in de werkelijkheid nooit voorkomen. RustGo filtert deze eruit. Het identificeert de specifieke plekken waar een memory bug getriggerd zou kunnen worden en voegt vergelijkbare plekken samen. Als twee verschillende paden in de code tot exact dezelfde gevaarlijke uitkomst leiden, behandelt RustGo ze als één doelwit, zodat het niet twee keer hetzelfde controleert. In hun tests hielp deze stap hen om het aantal doelwitten dat ze moesten controleren met ongeveer 84% te verminderen, door zich alleen te concentreren op de echt verdachte gebieden.
2. De doodlopende wegen afsluiten (Het Vergrootglas)
Zodra RustGo weet waar het moet kijken, moet het de rest van de stad negeren. In oudere fuzzing-tools bevatte de "kaart" van de stad vaak de standaardbibliotheek (de vooraf gebouwde tools die Rust gebruikt), die enorm is en vol paden zit die weliswać bereikbaar lijken, maar dat in werkelijkheid niet zijn. Dit verwarde de tools, waardoor ze nutteloze gebieden verkenden. RustGo introduceerde een nieuwe truc genaamd "target-specific path pruning". Het is als het hebben van een magische omheining die paden die niet leiden naar het specifieke doelwit dat je momenteel onderzoekt, direct doet verdwijnen. Als de detective op zoek is naar een bug in de bakkerij, blokkeert de omheining de paden naar de bibliotheek of het park, zelfs als die paden technisch gezien wel bestaan in de stad. Dit stelde RustGo in staat om 78,49% van de irrelevante paden weg te snijden die andere tools tijd zou kosten met verkennen.
3. Eerlijk spelen (De Round-Robin Strategie)
Hier komt de laatste, cruciale wending. Wanneer een detective meerdere verdachten (doelwitten) heeft om te controleren, raken oudere tools vaak geobsedeerd door de makkelijkst te bereiken, waardoor de moeilijkere worden genegeerd. RustGo gebruikt een systeem van "dynamic fair toggling". Stel je een scheidsrechter voor die de aandacht van de detective in een perfecte rotatie wisselt tussen de verdachten. Als de detective te veel tijd aan Verdachte A besteedt, schakelt de scheidsrechter hem onmiddellijk over naar Verdachte B, om ervoor te zorgen dat elke verdachte een eerlijk deel van de aandacht krijgt. RustGo doet dit door elk doelwit zijn eigen "wachtrij" van sneeuwballen en zijn eigen "scorekaart" te geven om de voortgang bij te houden. Dit zorgt ervoor dat geen enkel gevaarlijk punt ongetest blijft omdat het iets moeilijker te bereiken is.
De Resultaten: Sneller en Slimmer
Het team testte RustGo op 13 echte Rust-applicaties, variërend van webservers tot tools voor gegevensverwerking. Ze vergeleken het met de beste bestaande tools, inclusclusief de beroemde AFL++ en verschillende gespecialiseerde "directed" fuzzers. De resultaten waren opmerkelijk.
Omdat RustGo stopte met het verspillen van tijd aan de veilige 90% van de code en zich puur concentreerde op de gevaarlijke 10%, vond het kwetsbaarheden 2,09 tot 5,08 keer sneller dan de andere tools. In sommige gevallen, zoals bij de gimli-applicatie, was het meer dan 10 keer sneller. Om dit in perspectief te plaatsen: als een oude tool 10 uur nodig had om een bug te vinden, vond RustGo het in minder dan een uur.
Maar snelheid is niet de enige overwinning. Het team gebruikte RustGo om bugs in het wild op te sporen, niet alleen in hun testlab. Ze ontdekten 13 voorheen onbekende memory bugs in echte software. Hiervan werden er 10 bevestigd door de softwareontwikkelaars, en 8 zijn al gerepareerd. Nog indrukwekkender is dat 6 van deze bugs officiële security-ID's (RUSTSEC) hebben gekregen, en één kreeg zelfs een CVE-ID, de wereldwijde standaard voor het bijhouden van ernstige beveiligingsfouten. Dit bewijst dat RustGo niet alleen een theoretisch idee is, maar een praktisch hulpmiddel dat de software al veiliger maakt.
Waarom dit ertoe doet
Dit artikel suggereert niet alleen dat RustGo een goed idee is; het meet het, bewijst dat het werkt en laat zien dat het echte bugs vindt die anderen hebben gemist. Het voert expliciet een argument aan tegen de oude manier van denken: dat we elke enkele regel code moeten testen om veilig te zijn. In plaats daarvan laat het zien dat we, door de unieke regels van Rust te begrijpen, slimmer, sneller en effectiever kunnen zijn.
De onderzoekers adresseerden ook een veelvoorkomende zorg: "Wat als we een bug missen door de veilige delen te negeren?" Ze leggen uit dat de veiligheidsregels van Rust zo strikt zijn dat ruimtelijke geheugenfouten (zoals het benaderen van het verkeerde geheugenadres) simpelweg niet kunnen voorkomen in de veilige delen van de code. Daarom creëert het negeren hiervan geen blind vlek; het verwijdert alleen de ruis. Voor temporele bugs (het gebruiken van geheugen nadat het is vrijgegeven) is RustGo voorzichtig om ervoor te zorgen dat het niet per ongels een pad wegfiltert dat zou kunnen leiden tot een bug, door een "conservatieve" aanpak te hanteren die het vangnet breed genoeg houdt om alles te vangen.
Uiteindelijk is RustGo een bewijs van de kracht van specialisatie. Net zoals een meesterkok geen hamer gebruikt om een noot te kraken, zou een moderne fuzzer geen bot instrument moeten gebruiken op een taal die zo geavanceerd is als Rust. Door de aanpak af te stemmen op de unieke sterktes en zwaktes van de taal, hebben de auteurs een tool gecreëerd die niet alleen sneller is, maar ook eerlijker, waardoor elke potentiële gevaar in de code de aandacht krijgt die het verdient.
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.