Een groep academici van VUSec en Scuola Superiore Sant'Anna heeft een nieuwe variant van de Spectre CPU-kwetsbaarheid bekendgemaakt die Just-In-Time (JIT) engines in webbrowsers, taalruntimes en de kernel van besturingssystemen treft, ongeacht de CPU-fabrikant. Deze nieuwe Spectre-v2 variant is gedoopt tot Branch Target Reuse (BTR).

De onderzoekers leggen uit dat moderne CPU's weliswaar architecturale codecoherentie herstellen na zelfmodificatie, maar niet altijd verouderde indirecte branch prediction entries ongeldig maken. In JIT-engines kunnen deze verouderde targets langer blijven bestaan dan de originele code en later opnieuw worden gebruikt wanneer de codecache wordt gevuld. Dit creëert een transient execute-after-free mogelijkheid waarmee aanvallers de controle over de tijdelijke besturing kunnen overnemen en zo softwarehardening kunnen omzeilen of misaligned gadgets kunnen bereiken.

BTR is getest op onder andere SpiderMonkey (de JIT-engine van Mozilla Firefox), GraalVM en de cBPF JIT van de Linux-kernel. Alle bleken kwetsbaar, hoewel met verschillende mate van exploitatiegemak en lekratio's. Als proof-of-concept zijn er twee end-to-end exploits ontwikkeld die op een volledig gepatcht Intel-systeem met standaardbeveiligingen binnen enkele minuten de root-wachtwoordhash kunnen lekken.

Spectre is een klasse van CPU-kwetsbaarheden die in 2017 werd ontdekt en gebruikmaakt van speculative execution, een techniek waarbij processors instructies vooruit voorspellen en uitvoeren voor betere prestaties. Spectre v2 misbruikt indirecte branch prediction om een slachtofferprogramma indirecte branches te laten uitvoeren die de CPU verkeerd voorspelt, waardoor aanvallers speculatief code kunnen laten uitvoeren die zij beheersen. Hoewel de resultaten van deze misvoorspelling worden weggegooid, kunnen aanvallers via cache timing side channels gevoelige gegevens afleiden.

De BTR-aanval richt zich specifiek op JIT-engines en ontstaat door de interactie tussen zelfmodificerende code en indirecte branch prediction. De aanval vereist dat een aanvaller ongeprivilegieerde code kan uitvoeren binnen een JIT-engine en vertrouwelijke gegevens uit de hostomgeving wil achterhalen. De aanval verloopt via het manipuleren van de branch target buffer (BTB) door een trainingschunk te alloceren en vrij te geven, waarna een nieuwe chunk gedeeltelijk hetzelfde adres gebruikt. Hierdoor springt de CPU speculatief naar een verouderde BTB-entry, wat leidt tot controle-overname en datalekken.

Door de besturing te herleiden naar een architecturaal ongeldig punt kan de aanvaller bestaande Spectre-mitigaties omzeilen en misaligned instructies uitvoeren, wat uiteindelijk tot het lekken van geheime data leidt. Een cruciaal onderdeel van BTR is dat de verouderde BTB-entry niet ongeldig wordt gemaakt of vervangen nadat de JIT-engine de trainingschunk vrijgeeft.