Een groep onderzoekers van de ETH Zürich heeft een nieuwe variant van een aanval op de speculatieve uitvoering van indirecte sprongen in CPU's geïdentificeerd, waarmee informatie uit de kernelruimte kan worden verkregen of een aanval op het host-systeem vanuit virtuele machines kan worden georganiseerd. De kwetsbaarheden hebben de codenaam Retbleed (CVE-2022-29900, CVE-2022-29901) en zijn qua aard vergelijkbaar met de Spectre-v2 aanvallen. Het verschil ligt in de organisatie van de speculatieve uitvoering van willekeurige code bij de verwerking van de 'ret' (return) instructie, die het adres voor de sprong uit de stack haalt, in plaats van de indirecte sprong met behulp van de 'jmp' instructie waarbij het adres uit het geheugen of de CPU-register wordt geladen.
Een aanvaller kan omstandigheden creëren voor een onjuiste sprongvoorspelling en een gerichte speculatieve sprong naar een blok code organiseren dat niet is voorzien door de programmaloogica. Uiteindelijk zal de processor vaststellen dat de takvoorspelling niet klopt en de operatie terugdraaien naar de oorspronkelijke staat, maar de gegevens die tijdens de speculatieve uitvoering zijn verwerkt, blijven in de cache en microarchitecturale buffers hangen. Als het onjuist uitgevoerde blok geheugen aanroept, zal zijn speculatieve uitvoering resulteren in gegevens in de algemene cache die uit het geheugen zijn gelezen.
Om de gegevens te bepalen die na de speculatieve uitvoering van operaties in de cache zijn achtergebleven, kan de aanvaller technieken gebruiken om residuele gegevens via zijkanalen te detecteren, bijvoorbeeld door de toegangstijd tot gecachete en niet-gecachete gegevens te analyseren. Voor gerichte extractie van informatie uit gebieden met een ander privilege-niveau (bijvoorbeeld uit de kernelruimte) worden 'gadgets' gebruikt — bestaande reeks instructies in de kernel die geschikt zijn voor speculatieve lezing van gegevens uit het geheugen, afhankelijk van externe omstandigheden die door de aanvaller kunnen worden beïnvloed.
Om bescherming te bieden tegen klassieke Spectre-aanvallen, waarbij gebruik wordt gemaakt van instructies voor voorwaardelijke en indirecte sprongen, wordt in de meeste besturingssystemen de techniek "retpoline" toegepast. Hierbij worden de bewerkingen van indirecte sprongen vervangen door de instructie "ret", waarvoor in de processoren een aparte stapelvoorspellingseenheid wordt gebruikt, die geen gebruikmaakt van de sprongvoorspellingseenheid. Bij de introductie van retpoline in 2018 werd aangenomen dat vergelijkbare op Spectre lijkende manipulaties met adressen in de praktijk niet toepasbaar zijn voor speculatieve sprongen met behulp van de instructie "ret."
Onderzoekers die de Retbleed-aanvalsmethode hebben ontwikkeld, hebben aangetoond dat het mogelijk is om microarchitecturale voorwaarden te creëren voor het initiëren van speculatieve sprongen met behulp van de instructie "ret". Ze hebben ook een toolkit gepubliceerd voor het identificeren van geschikte exploiteerbare kwetsbaarheden in het Linux-kernel, waaronder sequenties van instructies (gadgets) waarin dergelijke voorwaarden zich voordoen.
Tijdens het onderzoek is een werkende exploit ontwikkeld die op systemen met Intel CPU's vanuit een niet-privilege proces in de gebruikersruimte willekeurige gegevens uit de kernelgeheugen kan extraheren met een snelheid van 219 bytes per seconde en een nauwkeurigheid van 98%. Op AMD-processoren is de effectiviteit van de exploit veel hoger — de lek-snelheid bedraagt 3,9 KB per seconde. Als praktisch voorbeeld is aangetoond hoe met behulp van de voorgestelde exploit de inhoud van het bestand /etc/shadow kan worden vastgesteld. Op systemen met Intel CPU's werd de aanval om de hash van het wachtwoord van de rootgebruiker te bepalen uitgevoerd in 28 minuten, terwijl dit op systemen met AMD CPU's 6 minuten duurde.

De mogelijkheid om de aanval uit te voeren is bevestigd voor de 6e tot 8e generatie Intel-processoren, die werden geproduceerd tot het derde kwartaal van 2019 (inclusief Skylake), en AMD-processoren op basis van de microarchitecturen Zen 1, Zen 1+ en Zen 2, die werden geproduceerd tot het tweede kwartaal van 2021. In nieuwere modellen, zoals de AMD Zen3 en Intel Alder Lake, evenals in ARM-processoren, wordt het probleem geblokkeerd door de bestaande beschermingsmechanismen. Bijvoorbeeld, het gebruik van de IBRS-instructies (Indirect Branch Restricted Speculation) helpt om zich te beschermen tegen de aanval.
Voor de Linux-kernel en de hypervisor Xen is een set wijzigingen voorbereid voor oudere CPU's die het probleem softwarematig blokkeren. De voorgestelde patch voor de Linux-kernel wijzigt 68 bestanden, voegt 1783 regels toe en verwijdert 387 regels. Helaas leidt de bescherming tot aanzienlijke overhead — in tests op AMD- en Intel-processors wordt de prestatiedaling geschat tussen de 14% en 39%. Een voorkeur heeft de bescherming gebaseerd op de IBRS-instructies, die beschikbaar zijn in nieuwe generaties Intel CPU's en ondersteund worden vanaf Linux-kernel 4.19.
Bij Intel-processors wordt het adressubstitutie voor speculatieve indirecte sprongen uitgevoerd dankzij een kenmerk dat zich manifesteert bij een onderloop in de retourstackbuffer (Return Stack Buffer). Bij dergelijke omstandigheden begint de logica voor adresselectie, voor de instructie 'ret', te werken zoals die bij gewone indirecte sprongen wordt gebruikt. In de Linux-kernel zijn meer dan duizend plaatsen gevonden die voorwaarden creëren voor het initiëren van dergelijke achterwaartse onderlopen en beschikbaar zijn via systeemoproepen.
Bij AMD-processors wordt de speculatieve uitvoering van de 'ret'-instructie uitgevoerd zonder afhankelijkheid van de specifieke retouradresstack (Return Address Stack) en beschouwt de sprongvoorspellingsbuffer de 'ret'-instructie niet als een terugkeer van controle, maar als een indirecte sprong, en gebruikt daarom bij de voorspelling gegevens voor indirecte sprongen. Onder dergelijke omstandigheden kan feitelijk elke 'ret'-operatie, bereikbaar via een systeemoproep, worden gebruikt voor exploitatie.
Daarnaast is er in AMD CPU's ook een ander probleem ontdekt (CVE-2022-23825, Branch Type Confusion), dat verband houdt met het uitvoeren van nep-sprongen — voorwaarden voor sprongvoorspelling kunnen optreden, zelfs zonder de benodigde vertakking instructies, wat invloed kan hebben op de sprongvoorspellingsbuffer zonder de 'ret'-instructie. Dit kenmerk maakt de implementatie van bescherming aanzienlijk complexer en vereist een meer actieve schoonmaak van de sprongvoorspellingsbuffer. Het wordt verwacht dat de toevoeging van volledige bescherming in de kernel zal leiden tot een toename van de overhead met 209%.
Bron: opennet.ru
