SoK: ARCUS: On the Efficiency and Efficacy of Hardware Fuzzing
Dit artikel presenteert een uitgebreide analyse van hardware-fuzzingtechnieken over de abstractielagen van ISA, microarchitectuur en RTL, waarbij de belangrijkste uitdagingen en onvervulde behoeften worden geïdentificeerd en toekomstige onderzoeksrichtingen worden voorgesteld om efficiëntere en betrouwbaardere verificatieoplossingen te ontwikkelen.
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
Moderne computers zijn gebouwd op een fundament van complexe instructies die de hardware precies vertellen wat het moet doen. Deze instructies vormen een contract tussen de software die wij schrijven en de fysieke chips die deze uitvoeren. Decennialang hebben ingenieurs vertrouwd op zorgvuldig testen om te waarborgen dat dit contract wordt nageleefd, waarbij wordt gecontroleerd of een processor zich precies gedraagt zoals de ontwerpers bedoeld hebben. Echter, naarmate deze chips complexer zijn geworden, zijn de oude methoden om ze te controleren moeite genoeg gaan krijgen. De enorme omvang van de mogbare combinaties van acties die een chip kan ondernemen, is te groot geworden voor mensen om ze één voor één te controleren. Als reactie hierop hebben onderzoekers een techniek genaamd 'fuzzing' gebruikt. Oorspronkelijk ontwikkeld voor software, houdt deze methode in dat een systeem wordt gevoed met een enorme stroom willekeurige of licht gewijzigde inputs om te zien of het breekt. In de hardwarewereld betekent dit het versturen van miljoenen vreemde instructiesequenties naar een processor om te zien of hij crasht, zich onverwacht gedraagt of een verborgen beveiligingslek onthult.
Een nieuwe studie brengt de verspreide inspanningen samen van onderzoekers die deze techniek hebben toegepast op hardware op drie verschillende niveaus van complexiteit. De onderzoekers, werkend bij universiteiten in de Verenigde Staten, analyseerden hoe fuzzing momenteel wordt gebruikt om alles te testen, van de hoogwaardige regels die het gedrag van een processor beheersen tot de laagwaardige bedrading die de chip laat functioneren. Ze ontdekten dat hoewel het basisidee om willekeurige gegevens op een machine te gooien werkt, de specifiend gereedschappen en strategieën die nodig zijn om bugs te vinden drastisch veranderen afhankelijk van welk laag van de hardware wordt getest. Hun werk onthult dat het veld momenteel gefragmenteerd is, waarbij verschillende groepen verschillende methoden gebruiken die moeilijk met elkaar te vergelijken zijn, en het wijst naar een toekomst waarin kunstmatige intelligentie en betere coördinatie tussen deze lagen de hardwareverificatie veel effectiever kunnen maken.
De onderzoekers organiseerden het landschap van hardware-fuzzing in drie duidelijke lagen, elk met zijn eigen uitdagingen. De eerste laag is de instruction set architecture (instructieset-architectuur), wat de set commando's is die een processor begrijpt. Tools op dit niveau behandelen de processor als een 'black box', wat betekent dat ze niet in de chip kunnen kijken; ze kunnen alleen commando's sturen en de resultaten bekijken. Het doel hier is om instructies te vinden die de processor uitvoert maar nooit officieel gedocumenteerd waren, of om gevallen te vinden waarin de processor anders reageert dan zijn handleiding aangeeft. Omdat de testers de interne werking niet kunnen zien, vertrouwen ze op het vergelijken van de output van de processor met een betrouwbaar referentiemodel, een apart programma dat simuleert wat de processor zou moeten doen. Als de echte chip en de simulatie van mening verschillen, wordt een bug gemeld. De studie vond dat hoewel willekeurig testen enkele fouten kan vinden, de meest effectieve tools een mix gebruiken van willekeurige generatie en gestructureerde regels om nutteloze gegevens over te slaan en zich te concentreren op de gebieden waar fouten het meest waarschijnlijk verborgen liggen.
De tweede laag is de microarchitectuur, die gaat over de interne, verborgen mechanica van hoe de processor die instructies uitvoert. Dit is waar de chip razendsnelle beslissingen neemt om zaken te versnellen, zoals het raden welke instructie volgt of het tijdelijk opslaan van gegevens in een cache. Deze interne gedragingen maken meestal geen deel uit van het officiële contract met de software, maar kunnen beveiligingslekken creëren. Een processor kan bijvoorbeeld per ongelere de geheime gegevens onthullen via de timing van zijn operaties. Het testen van deze laag is moeilijk omdat de bugs meestal niet bestaan uit crashes of fouten, maar uit subtiele lekken van informatie. De studie toonde aan dat tools die zich op deze laag richten, vaak vertrouwen op specifieke patronen van gedrag die bekend staan als gevaarlijk, in plaats op pure willekeur. Ze construeren testsequenties die ontworpen zijn om deze specifieke interne mechanismen te triggeren en meten vervolgens minuscule tijdsverschillen om te zien of er een geheim is gelekt. De onderzoekers merkten op dat het vinden van deze bugs een diep begrip van het interne ontwerp van de chip vereist, en dat tools die simpelweg willekeurig gokken hier vaak ineffectief zijn.
De derde laag is het register-transfer level, wat de werkelijke code is die wordt gebruikt om de chip te ontwerpen voordat deze wordt geproduceerd. Op dit stadium bestaat de chip alleen als een digitale blauwdruk, en kunnen ingenieurs elke enkele draad en schakelaar zien. Dit biedt de meeste zichtbaarheid, waardoor testers exact kunnen meten hoeveel van het ontwerp is verkend. Tools op dit niveau kunnen de inputdata muteren op basis van realtime feedback van de simulatie, zoals hoeveel nieuwe staten van de chip zijn bezocht. De studie vond dat hoewel deze laag de meest precieze testing mogelijk maakt, de tools die hier worden gebruikt vaak traag zijn omdat het simuleren van een chip veel tijd kost. Bovendien ontdekten de onderzoekers een aanzienlijk probleem in de manier waarop deze tools hun succes rapporteren. Verschillende tools gebruiken verschillende manieren om 'coverage' (dekking) te meten, waardoor het bijna onmogelijk is om ze direct te vergelijken. De ene tool kan beweren een bug te hebben gevonden na een miljoen tests, terwijl een andere hetzelfde resultaat vindt met slechts tienduizend, maar zonder een standaard manier om te meten wat "coverage" betekent, zijn deze getallen moeilijk te interpreteren.
Het artikel identificeert verschillende kritieke hiaten in de huidige stand van de techniek. Een groot probleem is de afhankelijkheid van "golden reference models", de betrouwbare simulaties die worden gebruikt om te controleren of de echte chip correct handelt. Als het referentiemodel zelf gebrekkig is, kan de fuzzing-tool echte bugs missen of valse alarmen geven. Dit is bijzonder problematisch voor de microarchitectuurlayer, waar geen perfect referentiemodel bestaat omdat de interne gedragingen vaak niet volledig gedocumenteerd zijn. De onderzoekers benadrukten ook dat het veld een gemeenschappelijke taal mist voor het rapporteren van resultaten. Zonder gestandaardiseerde benchmarks en metrieken is het moeilijk te weten of een nieuwe tool echt beter is dan een oude, of dat hij gewoon iets anders meet. Ze merkten ook op dat de meeste tools nog steeds beperkt zijn tot het testen van één laag tegelijk, waarbij de complexe interacties worden gemist die optreden wanneer de hoogwaardige instructies de laagwaardige hardwaremechanica ontmoeten.
Vooruitblikkend suggereren de auteurs dat de volgende generatie hardware-fuzzing slimmer en meer verbonden moet zijn. Ze stellen het gebruik van kunstmatige intelligentie voor om betere testinputs te generen, waarbij men verder gaat dan eenvoudige willekeur om sequenties te creëren die meer waarschijnlijk het systeem op interessante manieren onder druk zetten. Ze pleiten ook voor de ontwikkeling van schaalbare referentiemodellen die de complexiteit van moderne chips kunnen aanpakken zonder dat daarvoor onmogelijke hoeveelheden handmatig werk nodig is. Misschien het belangrijkste nog: ze zien een hybride aanpak voor ogen waarbij fuzzing-tools op verschillende lagen met elkaar communiceren. Een tool op instructieniveau zou een verdachte opdracht kunnen doorgeven aan een microarchitectuur-tool, die vervolgens een specifiek timingpatroon kan doorgeven aan een laagwaardige tool, waardoor een continue keten van onderzoek ontstaat die het hele systeem bestrijkt. De onderzoekers geloven dat door de manier waarop resultaten worden gemeten te standaardiseren en door deze verschillende lagen te integreren, de gemeenschap kan bewegen van een gefragmenteerde verzameling tools naar een verenigde, systematische aanpak die onze steeds complexere computers veilig en betrouwbaar houdt.
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.