6.ábra: Kernel page table isolation
a 6. ábra a kernel page table isolation (kpti) nevű technikát mutatja be. Ez alapvetően csapódik le, hogy nem leképezése kernel memória egy programot, amikor fut a felhasználói térben. Ha nincs leképezés jelen, spekulatív végrehajtás már nem lehetséges, és azonnal hiba.
amellett, hogy az operációs rendszer virtuális memória kezelőjét (VMM) bonyolultabbá teszi, hardveres segítség nélkül ez a technika jelentősen lelassítja azokat a munkaterheléseket is, amelyek nagyszámú felhasználói módot váltanak át a kernel módra, mivel az oldaltáblákat minden átmenetnél módosítani kell, és a TLB-t ki kell öblíteni (tekintettel arra, hogy a TLB megtarthatja az elavult leképezéseket).
az újabb x86 CPU-knak van egy asid (address space ID) vagy pcid (process context ID) néven ismert funkciója, amely ezt a feladatot lényegesen olcsóbbá teheti (az ARM és más mikroarchitektúrák évek óta rendelkeznek ezzel a funkcióval). A PCID lehetővé teszi egy azonosító társítását egy TLB-bejegyzéshez, majd csak a TLB-bejegyzések öblítését ezzel az azonosítóval. A PCID használata olcsóbbá teszi a KPTI-t, de még mindig nem ingyenes.
összefoglalva, A Meltdown egy rendkívül súlyos és könnyen kihasználható sebezhetőség. Szerencsére viszonylag egyszerű enyhítéssel rendelkezik, amelyet az összes nagyobb operációs rendszer-gyártó már telepített, azzal a figyelmeztetéssel, hogy bizonyos munkaterhelések lassabban fognak futni, amíg a jövőbeni hardvert kifejezetten a leírt címtartomány-elválasztáshoz nem tervezik.
Spectre sebezhetőség
a Spectre A Meltdown néhány tulajdonságával rendelkezik, és két változatból áll. A Meltdown-tól eltérően a Spectre-t lényegesen nehezebb kihasználni, de szinte az összes, az elmúlt húsz évben gyártott modern processzort érinti. Lényegében a Spectre egy támadás a modern CPU és operációs rendszer kialakítása ellen, szemben egy speciális biztonsági réssel.
Bounds check bypass (Spectre variant 1)
az első Spectre variáns “bounds check bypass” néven ismert.”Ezt a következő kódrészlet mutatja be (amely ugyanaz a kódrészlet, amelyet a fenti spekulatív végrehajtás bevezetésére használtam).
if (x < array1_size) {
y = array2 * 256];
}
az előző példában tegyük fel a következő eseménysorozatot:
- a támadó irányítja
x
.
-
array1_size
nincs gyorsítótárban.
-
array1
gyorsítótárban van.
- a CPU azt hiszi, hogy
x
kisebb, mint array1_size
. (A CPU-k különböző szabadalmaztatott algoritmusokat és heurisztikákat alkalmaznak annak meghatározására, hogy spekuláljanak-e, ezért a Spectre támadási részletei eltérnek a processzorgyártók és a modellek között.)
- a CPU végrehajtja az if utasítás törzsét, miközben a
array1_size
betöltésére vár, a gyorsítótárat a Meltdownhoz hasonló módon befolyásolja.
- a támadó ezután különböző módszerek egyikével meghatározhatja a
array1
tényleges értékét. (A gyorsítótár-következtetési támadásokkal kapcsolatos további részletekért lásd a kutatási cikket.)
A Spectre-t lényegesen nehezebb kihasználni, mint a Meltdown-t, mivel ez a biztonsági rés nem függ a jogosultságok eszkalációjától. A támadónak meg kell győznie a kernelt, hogy futtassa a kódot, és helytelenül spekuláljon. Általában a támadónak meg kell mérgeznie a spekulációs motort, és becsapnia kell, hogy helytelenül tippeljen. Hogy az említett, a kutatók számos koncepcióbizonyító kihasználást mutattak be.
szeretném megismételni, milyen igazán hihetetlen megállapítás ez a kizsákmányolás. Én személy szerint nem úgy ez a CPU tervezési hiba, mint Meltdown önmagában. Úgy vélem, ez egy alapvető kinyilatkoztatás arról, hogyan működik együtt a modern hardver és szoftver. Az a tény, hogy a CPU gyorsítótárak közvetett módon felhasználhatók a hozzáférési minták megismerésére, már egy ideje ismert. Az a tény, hogy a CPU gyorsítótárak oldalsó csatornaként használhatók a számítógép memóriájának eldobására, meghökkentő, mind fogalmilag, mind annak következményeiben.
Branch target injection (Spectre variant 2)
emlékezzünk arra, hogy a közvetett elágazás nagyon gyakori a modern programokban. A Spectre 2. változata közvetett elágazási előrejelzést használ, hogy megmérgezze a CPU-t spekulatív módon egy olyan memóriahelyre, amelyet egyébként soha nem hajtott volna végre. Ha ezeknek az utasításoknak a végrehajtása a gyorsítótárban olyan állapotot hagyhat maga után, amely a gyorsítótár következtetési támadásaival észlelhető, akkor a támadó az összes kernel memóriát eldobhatja. Mint Spectre variant 1, Spectre variant 2 sokkal nehezebb kihasználni, mint Meltdown, azonban a kutatók bebizonyították működő proof-of-concept hasznosítja variáns 2.
kísértet-enyhítések
a Kísértet-enyhítések lényegesen érdekesebbek, mint az olvadás-enyhítés. Valójában, az academic Spectre papír azt írja, hogy jelenleg nincsenek ismert enyhítések. Úgy tűnik, hogy a színfalak mögött és az akadémiai munkával párhuzamosan az Intel (és valószínűleg más CPU-gyártók), valamint a főbb operációs rendszerek és felhő-gyártók hónapok óta dühösen dolgoznak az enyhítések kidolgozásán. Ebben a részben kitérek a különféle enyhítésekre, amelyeket kidolgoztak és alkalmaztak. Ez az a szakasz, amelyben a leginkább ködös vagyok, mivel hihetetlenül nehéz pontos információkat szerezni, ezért különféle forrásokból összerakom a dolgokat.
statikus elemzés és kerítés (1.változat enyhítése)
az egyetlen ismert 1. változat (bounds check bypass) enyhítés a kód statikus elemzése, amely meghatározza azokat a kódsorozatokat, amelyeket támadók irányíthatnak, hogy zavarják a spekulációt. A sebezhető kódsorozatoknak lehet egy sorosító utasításuk, például lfence
beillesztve, amely leállítja a spekulatív végrehajtást, amíg az összes utasítás a kerítésig nem kerül végrehajtásra. Óvatosan kell eljárni a kerítés utasításainak behelyezésekor, mivel a túl sok súlyos teljesítményhatásokkal járhat.
Retpoline (variant 2 enyhítés)
az első Spectre variant 2 (branch target injection) enyhítést a Google fejlesztette ki, és “retpoline” néven ismert.”Számomra nem világos, hogy a Google elszigetelten fejlesztette-e ki, vagy a Google az Intellel együttműködve. Feltételezem, hogy a Google kísérletileg fejlesztette ki, majd az Intel hardvermérnökei ellenőrizték, de nem vagyok biztos benne. A “retpoline” megközelítés részletei megtalálhatók a Google témában írt cikkében. Fogom összefoglalni őket itt (én glossing át néhány részletet, beleértve underflow, amelyek szerepelnek a papír).
a Retpoline arra a tényre támaszkodik, hogy a hívó és visszatérő funkciók és a kapcsolódó verem manipulációk annyira gyakoriak a számítógépes programokban, hogy a CPU-k erősen optimalizáltak azok végrehajtására. (Ha nem ismeri a verem működését a hívással és a funkciókból való visszatéréssel kapcsolatban, akkor ez a bejegyzés jó alapozó.) Dióhéjban, amikor egy” hívást ” hajtanak végre, a visszatérési cím a verembe kerül. a” ret ” kikapcsolja a visszatérési címet, és folytatja a végrehajtást. A spekulatív végrehajtási hardver emlékezni fog a tolt visszatérési címre, és spekulatív módon folytatja a végrehajtást ezen a ponton.
a retpoline konstrukció helyettesíti a regiszterben tárolt memória helyére történő közvetett ugrást r11
:
jmp *%r11
:
call set_up_target; (1)
capture_spec: (4)
pause;
jmp capture_spec;
set_up_target:
mov %r11, (%rsp); (2)
ret; (3)
nézzük meg, hogy az előző összeszerelési kód mit tesz egy lépésben, és hogyan enyhíti az elágazási cél befecskendezését.
- ebben a lépésben a kód egy fordítási időben ismert memóriahelyet hív meg, tehát egy kemény kódolt eltolás, nem pedig közvetett. Ez a
capture_spec
visszatérési címét helyezi a verembe.
- a hívás visszatérési címét felülírja a tényleges ugrási cél.
- a visszatérés a valós célponton történik.
- amikor a CPU spekulatív módon végrehajtja, visszatér egy végtelen hurokba! Ne feledje, hogy a CPU előre spekulál, amíg a memória betöltése befejeződik. Ebben az esetben a spekulációt manipulálták, hogy egy végtelen hurokba rögzítsék, amelynek nincsenek olyan mellékhatásai, amelyek megfigyelhetők a támadó számára. Amikor a CPU végül végrehajtja a reálhozamot, megszakítja a spekulatív végrehajtást, amelynek nincs hatása.
véleményem szerint ez egy igazán ötletes enyhítés. Dicséret azoknak a mérnököknek, akik kifejlesztették. Ennek az enyhítésnek az a hátránya, hogy minden szoftvert újra kell fordítani úgy, hogy a közvetett ágakat retpoline ágakká alakítsák át. Az olyan felhőszolgáltatások esetében, mint például a Google, amelyek a teljes verem tulajdonában vannak, az újrafordítás nem nagy ügy. Másoknak, lehet, hogy nagyon nagy ügy vagy lehetetlen.
IBRS, STIBP és IBPB (variant 2 enyhítés)
úgy tűnik, hogy a retpoline fejlesztésével párhuzamosan az Intel (és az AMD bizonyos mértékig) dühösen dolgozik a hardveres változtatásokon, hogy enyhítse az ág célinjekciós támadásokat. A CPU mikrokód frissítéseként szállított három új hardverfunkció a következő:
- közvetett elágazási Korlátozott spekuláció (IBRS)
- egyszálú közvetett elágazási prediktorok (STIBP)
- közvetett elágazási prediktor gát (IBPB)
az új mikrokód-funkciókkal kapcsolatos korlátozott információk az Intel itt érhetők el. Nagyjából össze tudtam rakni, hogy ezek az új funkciók mit tesznek a fenti dokumentáció elolvasásával, valamint a Linux kernel és a Xen hypervisor javítások áttekintésével. Elemzésem alapján minden funkciót potenciálisan a következőképpen használunk:
- az IBRS mind a jogosultsági szintek között (felhasználó a kernelhez) átöblíti az ág-előrejelzési gyorsítótárat, mind pedig letiltja az ág-előrejelzést a testvér CPU-szálon. Emlékezzünk arra, hogy minden CPU magnak általában két CPU-szála van. Úgy tűnik, hogy a modern CPU-kon az ág-előrejelző hardver meg van osztva a szálak között. Ez azt jelenti, hogy a felhasználói mód kódja nemcsak megmérgezheti az ág előrejelzőjét a kernel kód megadása előtt, hanem a testvér CPU szálon futó kód is megmérgezheti. Az IBRS engedélyezése kernel módban lényegében megakadályozza, hogy minden korábbi végrehajtás felhasználói módban, valamint a testvér CPU szálon történő végrehajtás befolyásolja az elágazások előrejelzését.
- úgy tűnik, hogy a STIBP az IBRS egy részhalmaza, amely csak letiltja az ág előrejelzését a testvér CPU szálon. Amennyire meg tudom mondani, ennek a funkciónak a fő felhasználási esete annak megakadályozása, hogy egy testvér CPU-szál megmérgezze az ág-előrejelzőt, ha két különböző felhasználói módú folyamatot (vagy virtuális gépet) futtat ugyanazon a CPU-magon egyszerre. Most őszintén nem teljesen világos számomra, hogy mikor kell használni a STIBP-t.úgy tűnik, hogy a
- IBPB átöblíti az ugyanazon jogosultsági szinten futó kód elágazási előrejelzési gyorsítótárát. Ez két felhasználói módú program vagy két virtuális gép közötti váltáskor használható annak biztosítására, hogy az előző kód ne zavarja a futtatni kívánt kódot (bár STIBP nélkül úgy gondolom, hogy a testvér CPU szálon futó kód még mindig megmérgezheti az ág előrejelzőjét).
az írás óta a fő enyhítések, amelyeket látok az ág célinjekció sebezhetőségének megvalósításában, mind a retpoline, mind az IBRS. Feltehetően ez a leggyorsabb módja annak, hogy megvédje a kernelt a felhasználói módú programoktól, vagy a hipervizort a virtuális gép vendégeitől. A jövőben azt várnám, hogy mind a STIBP, mind az IBPB telepítve legyen, attól függően, hogy a különböző felhasználói módú programok paranoia szintje zavarja egymást.
úgy tűnik, hogy az IBRS költsége rendkívül széles körben változik a CPU architektúrák között, az újabb Intel Skylake processzorok viszonylag olcsóak a régebbi processzorokhoz képest. A Lyft – nél körülbelül 20% – kal lassult bizonyos rendszerhívások nehéz munkaterhelése az AWS C4 példányokon, amikor az enyhítéseket bevezették. Feltételezem, hogy az Amazon bevezette az IBRS-t és potenciálisan a retpoline-t is, de nem vagyok biztos benne. Úgy tűnik, hogy a Google csak a retpoline-t dobta ki a felhőjében.
Idővel arra számítok, hogy a processzorok végül egy IBRS “always on” modellre költöznek, ahol a hardver csak alapértelmezés szerint tisztítja az ág-előrejelző elválasztását a CPU szálak között, és helyesen öblíti le az állapotot a privilege szintű változásokon. Az egyetlen ok, amiért ezt ma nem tennék meg, az a látszólagos teljesítményköltség, hogy ezt a funkciót mikrokód-frissítésekkel utólag felszerelik a már kiadott mikroarchitektúrákra.
következtetés
nagyon ritka, hogy egy kutatási eredmény alapvetően megváltoztatja a számítógépek felépítését és működését. A Meltdown és a Spectre pontosan ezt tette. Ezek a megállapítások jelentősen megváltoztatják a hardver-és szoftvertervezést a következő 7-10 évben (a következő CPU hardverciklus), mivel a tervezők figyelembe veszik a gyorsítótár-mellékcsatornákon keresztüli adatszivárgás lehetőségeinek új valóságát.időközben a Meltdown és a Spectre megállapításai és a kapcsolódó enyhítések jelentős következményekkel járnak a számítógép-felhasználók számára az elkövetkező években. Az enyhítések rövid távon a munkaterheléstől és az adott hardvertől függően jelentős teljesítményhatással járnak majd. Ez szükségessé teheti egyes infrastruktúrák működési változtatásait (például a Lyft-nél agresszíven mozgatunk néhány munkaterhelést az AWS C5 példányokra, mivel az IBRS lényegesen gyorsabban fut a Skylake processzorokon, és az új Nitro hypervisor megszakításokat biztosít közvetlenül a vendégeknek az SR-IOV és az APICv használatával, eltávolítva sok virtuális gép kijáratot az IO nehéz munkaterhelésekhez). Az asztali számítógép-felhasználók sem immunisak, mivel az operációs rendszer és a böngészőgyártók azon dolgoznak, hogy enyhítsék a Javascriptet használó proof-of-concept böngésző támadásokat. Ezenkívül a sebezhetőségek összetettsége miatt szinte biztos, hogy a biztonsági kutatók új kihasználásokat találnak, amelyekre nem vonatkoznak a jelenlegi enyhítések, amelyeket javítani kell.
bár szeretek a Lyft-nél dolgozni, és úgy érzem, hogy a microservice systems infrastructure térben végzett munka az iparág egyik leghatásosabb munkája, az ilyen események miatt hiányzik az operációs rendszereken és a hipervizorokon végzett munka. Rendkívül féltékeny vagyok arra a hősies munkára, amelyet az elmúlt hat hónapban rengeteg ember végzett a sebezhetőségek kutatásában és enyhítésében. Szerettem volna a részese lenni!
további olvasmányok
- Meltdown and Spectre akadémiai papírok: https://spectreattack.com/
- Google Project Zero blogbejegyzés: https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html
- Intel Spectre hardver enyhítések: https://software.intel.com/sites/default/files/managed/c5/63/336996-Speculative-Execution-Side-Channel-Mitigations.pdf
- retpoline blogbejegyzés: https://support.google.com/faqs/answer/7625886
- az ismert információk jó összefoglalása: https://github.com/marcan/speculation-bugs/blob/master/README.md