Probing the Armv8-A ISA for Hidden Instructions through Processor Fuzzing
Abstract
Samfunnets økende bruk av datamaskiner forsterker behovet for å kunne verifisere og kontrollere systemer som tas i bruk, som et tiltak for å forsikre seg om at systemene ikke inneholder sårbarheter eller bakdører. For programvare tilrettelegges dette i stor grad gjennom allerede tilgjengelige verktøy og en generell tendens mot bruk av programvare med åpen kildekode. Den underliggende prosessoren som faktisk eksekverer denne programvaren regnes derimot ofte som en svart boks med få muligheter for sluttbrukere til å kunne verifisere at den ikke inneholder hemmelig funksjonalitet. Videre, tilgjengelig forskning innenfor slik verifikasjon tar stort sett for seg x86 instruksjonssettarkitekturen. Som et svar til dette presenterer vi armshaker: en programvarebasert fuzzer som kan systematisk avdekke skjulte instruksjoner i den mye brukte Armv8-A instruksjonssettarkitekturen. Inspirert av tidligere verk fungerer armshaker ved å eksekvere instruksjoner som er udefinert i prosessorens referansemanual og deretter sjekke om resultatet av eksekveringen var som forventet, der avvikende resultater potensielt indikerer skjulte instruksjoner. Ved bruk av en slik fuzzing-basert metode avdekker vi flere programvarefeil i den mye brukte QEMU-emulatoren og i Linux-kjernen. Imidlertid kan ingen av de skjulte instruksjonene vi identifiserer attribueres til maskinvare, noe som indikerer at prosessorene vi testet ikke inneholder skjulte instruksjoner av den typen som kan avdekkes gjennom vår metode. Dette utelukker likevel ikke at slike instruksjoner finnes i visse prosessormodeller, ettersom det finnes et stort antall ulike modeller. Vi tilgjengeliggjør derfor fuzzeren vår med åpen kildekode slik at brukere kan teste egne systemer. The increasing societal dependence on computer systems strengthens the need for verification and auditing of the systems in use, as a measure to ensure the absence of security issues and unwanted features like backdoors. For software, this is largely enabled by a wide range of available verification tools and a general drive towards open-source software. However, the underlying processor executing said software is more often than not regarded as a trusted black box, with little to no possibility for end users to verify the absence of secret functionality. Moreover, what research is available on such black-box processor verification mostly concerns the x86 instruction set architecture. In response to this, we present armshaker: a software-based fuzzer that can systematically uncover hidden instructions in the widely used Armv8-A instruction set architecture. Inspired by previous work, armshaker works by executing instructions that are undefined in the processor's reference manual and subsequently checking whether the execution result is as expected, with deviating behavior potentially indicating hidden instructions. Using this fuzzing approach, we identify multiple hidden instructions resulting from bugs in the commonly used QEMU emulator and the Linux kernel. However, none of the hidden instructions identified can be attributed to hardware, indicating that the tested processors do not include hidden instructions of the type identified by our approach. Nevertheless, the diversity of Arm processors available makes the presence of hidden instructions in certain models still a possibility. Consequently, we make our fuzzer freely available as open-source software to enable users to audit their own systems.