retpoline

kami911 képe

Újabb teljesítménygyilkos sebezhetőségek: Retbleed

Négy évvel ezelőtt gyülekeztek a Baljós árnyak a modern processzorok felett a Meltdown és Spectre hibák képében, valamint annak variánsai után (Újra támad a Spectre és a Meltdown) továbbra is a számítógépbiztonság-kutatók célkeresztjében vannak a spekulatív végrehajtással összefüggő hibák kutatása és feltárása.

Most egy újabb hiba került biztonsági jelentések és kernel hibajavítások formájában a publikum elé: a Retbleed. A Retbleed, vagy más néven Spectre-BTI egy spekulatív végrehajtással összefüggő támadási forma x86-64 és ARM processzorok ellen, amely a nem túl régi Intel és AMD chipeket is veszélyezteti. Azok az ARM CPU-k, amelyek sebezhetőek a Spectre indirekt elágazásokat használó oldalcsatornás támadással szemben, szintén sebezhetőek a Retbleed sebezhetőséggel is.

A Spectre 2. változatához, azaz a branch target injection (CVE-2017-5715) és a Spectre-BHB-hez (CVE-2022-23960), amely javítható CPU mikrókód frissítéssel is, meglévő hardveres (FEAT_CSV2), valamint a Retpoline technikával szoftveres oldalon is. Az ETH Zurich kutatói azért nevezték el támadásukat RETBLEED sérülékenységnek (CVE-2022-29900 és CVE-2022-29901), mert az a retpoline néven ismert szoftveres védelmet használja ki, amelyet 2018-ban vezettek be a spekulatív végrehajtási támadások káros hatásainak csökkentésére.

Ahogy a kutatók írják:

„A Retbleed (CVE-2022-29900 és CVE-2022-29901) az általunk Spectre-BTI-nek nevezett spekulatív végrehajtási támadások családjának új tagja, amely az elágazási célpontok injektálását használja ki információk kiszivárgására. Testvéreivel ellentétben, amelyek a káros elágazási célpontok spekulációját közvetett ugrások vagy hívások kihasználásával váltják ki, a Retbleed a visszatérési utasításokat használja ki. Ezzel eléggé sok teendő lesz, mivel aláássa a jelenlegi Spectre-BTI védelmek egy részét.

Az egyik ilyen védekezés, amelyet ma sok operációs rendszer használ, az úgynevezett retpoline. A retpolinák úgy működnek, hogy a közvetett ugrásokat és hívásokat visszatérésekkel helyettesítik. Még 2018-ban találták ki a retpoline-t, hogy megakadályozzák, hogy az illetéktelen támadók a Spectre-BTI segítségével információkat lopjanak el a rendszer memóriájából. Bár egyesek aggódtak amiatt, hogy a (RET) visszatérések is érintettek lehetnek a Spectre-BTI támadásokra, a visszatéréseket nem tartották praktikusnak kihasználni, és az aggodalmakat csökkentették. Ennek elsődleges oka az volt, hogy a visszatérési célelőrejelzések normál mikroarchitektúra mellett nem indirekt elágazásokként jelennek meg.

Mint azonban kiderült, a Retbleed-et valóban praktikus kihasználni, köszönhetően a következő két felismerésnek:

  • Rájöttünk, hogy mind az AMD, mind az Intel CPU-kon kiválthatjuk azokat a mikroarchitekturális feltételeket, amelyek arra kényszerítik a visszatéréseket, hogy indirekt elágazásokként legyenek előre jelezve. Megépítettük a szükséges eszközöket is, hogy felfedezzük a Linux kernel azon helyeit, ahol ezek a feltételek teljesülnek.
  • Megállapítottuk, hogy a kernel címtartományán belül található elágazási célpontokat is be tudjuk injektálni, akár jogosulatlan felhasználóként is. Bár a kernel címtartományán belüli elágazási célpontokhoz nem férhetünk hozzá - az ilyen célpontra történő elágazás oldalhibát eredményez -, az elágazás-előrejelző egység frissíti magát egy elágazás észlelésekor, és feltételezi, hogy az elágazás jogszerűen végrehajtásra került, még akkor is, ha az egy kernel-címre történt.

A Retbleed kihasználásának mikroarchitekturális feltételei

Intel processzorokon a visszatérések akkor kezdenek közvetett ugrásokként viselkedni, amikor a visszatérési célelőrejelzéseket tároló Return Stack Buffer alulcsordul. Ez mély hívási verem végrehajtásakor történik. Kiértékelésünk során több mint ezer ilyen feltételt találtunk, amelyeket egy rendszerhívás kiválthat. Az Intel CPU-kra vonatkozó indirekt elágazásbecslést korábbi munkákban már tanulmányoztuk.

AMD processzorokon a visszatérések indirekt elágazásként viselkednek, függetlenül a Return Address Stack állapotától. Valójában a visszatérési utasítás indirekt ugrással történő megmérgezésével az AMD elágazás-előrejelzője feltételezi, hogy visszatérés helyett indirekt ugrással találkozik, és következésképpen indirekt elágazási célpontot jelez előre. Ez azt jelenti, hogy minden visszatérés, amelyet rendszerhíváson keresztül elérhetünk, kihasználható – és ezekből rengeteg van.

Feliratkozás RSS - retpoline csatornájára