Az elágazás-előrejelző a modern CPU-architektúrák kritikus összetevője, amelyet úgy terveztek, hogy javítsa a teljesítményt az elágazási utasítások (pl. if-else utasítások) irányának spekulálásával, mielőtt azok feloldódnak. Ez a spekuláció lehetővé teszi, hogy a CPU előre lekérje és végrehajtsa az utasításokat az előre jelzett útvonalon, ezáltal csökkentve az észlelt késleltetést és javítva az általános átviteli sebességet. Ez a teljesítményoptimalizálás azonban potenciális sebezhetőségeket rejt magában, amelyek kihasználhatók a CPU-időzítési támadások során, különösen érzékeny információk kiszivárogtatása esetén.
Az elágazás előrejelzése úgy működik, hogy fenntartja az ágak kimeneteleinek előzményeit, és ezt az előzményt használja a jövőbeli ágak előrejelzésére. Amikor egy elágazási utasítással találkozik, a prediktor ezen előzményadatok alapján kitalálja, hogy az elágazás megtörténik-e vagy sem. Ha az előrejelzés helyes, a CPU megszakítás nélkül folytatja a végrehajtást. Ha helytelen, a CPU-nak vissza kell állítania, és a megfelelő útvonalat kell végrehajtania, ami teljesítménybüntetéssel jár. Ez a büntetés, bár kicsi, de mérhető és kihasználható a támadók számára.
A támadók manipulálhatják az elágazás-előrejelzőt, hogy mérhető időbeli különbséget hozzanak létre a helyesen és a helytelenül előrejelzett ágak között. Ez a különbség felhasználható egy program végrehajtási útvonalának megállapítására, amely viszont érzékeny információkat fedhet fel. Az ilyen támadások egyik legismertebb példája a Spectre sebezhetőség, amely spekulatív végrehajtást és elágazás-előrejelzést használ az illetéktelen memóriahelyek eléréséhez.
Egy tipikus Spectre támadásban a támadó először egy meghatározott minta követésére tanítja az elágazás előrejelzőjét. Ez a betanítási fázis magában foglalja az elágazási utasítások sorozatának végrehajtását, amelyek a prediktort egy adott előrejelzés elkészítésére kényszerítik. Az előrejelző betanítása után a támadó végrehajt egy áldozati kódszegmenst, amely titkos adatoktól függő ágat tartalmaz. Ha az előrejelző helytelen előrejelzést ad a támadó képzése alapján, a CPU spekulatív módon olyan utasításokat hajt végre, amelyek a titkos adatok alapján hozzáférnek a memóriához. Bár ezeket a spekulatív utasításokat végül elvetik, nyomokat hagynak a CPU gyorsítótárában.
A támadó ezután mérheti a különböző memóriahelyek elérési idejét, hogy megállapítsa, mely adatokhoz fértek hozzá spekulatívan. Ez a gyorsítótár-időzítési támadásként ismert technika lehetővé teszi a támadó számára, hogy a megfigyelt időbeli különbségek alapján következtessen a titkos adatokra. Egy ilyen támadás legfontosabb lépései a következők:
1. A Branch Predictor képzése: A támadó irányított utasítássorozatot futtat, amely befolyásolja az ág előrejelző állapotát. Például egy konzisztens kimenetelű (pl. mindig vett) elágazási utasítás ismételt végrehajtása azt feltételezi, hogy a prediktor ezt az eredményt várja a jövőbeli végrehajtások során.
2. Spekulatív végrehajtás kiváltása: A támadó titkos adatoktól függő elágazási utasítással futtatja az áldozatkódot. A támadó előzetes képzettsége miatt az elágazás-előrejelző spekulatív módon rossz utat hajt végre, ami magában foglalja a memória elérését a titkos adatok alapján.
3. A gyorsítótár hozzáférési idejének mérése: A spekulatív végrehajtás után a támadó méri, hogy mennyi időbe telik bizonyos memóriahelyek eléréséhez. A gyorsabb hozzáférési idők azt jelzik, hogy az adatok jelen vannak a gyorsítótárban, ami azt jelenti, hogy spekulatív módon hozzáfértek hozzá. Ezen időzítések elemzésével a támadó következtethet a titkos adatokra.
Ennek egy konkrét példával való szemléltetéséhez vegyünk egy forgatókönyvet, ahol a titkos adatok határozzák meg egy tömbhozzáférés indexét egy ágon belül. A támadó először megtanítja az elágazás-előrejelzőt egy bizonyos elágazás irányának felvételére. Amikor az áldozat kód fut, az elágazás előrejelző spekulatív módon végrehajtja a tömb hozzáférését a betanított irány alapján. Ha a spekuláció egy adott tömbelem elérését foglalja magában, a megfelelő gyorsítótár-sor betöltődik. A támadó ezután egy sor időzített memória-hozzáférést hajthat végre, hogy megállapítsa, mely gyorsítótár-sorok vannak betöltve, és így következtethet a titkos indexre.
Az ilyen támadások mérséklése többféle stratégiát foglal magában. A hardver alapú megoldások közé tartozik a spekulatív és a nem spekulatív végrehajtási útvonalak elkülönítésének javítása, valamint annak biztosítása, hogy a spekulatív végrehajtás ne érintse a megosztott erőforrásokat, például a gyorsítótárat. A szoftver alapú megoldások olyan technikákat foglalnak magukban, mint a „fence” utasítások beszúrása, hogy megakadályozzák a spekulatív végrehajtást a kód bizonyos pontjain túl, vagy állandó idejű programozási gyakorlatok alkalmazása annak biztosítására, hogy a végrehajtási idő ne függjön a titkos adatoktól.
Az ág-előrejelző alapú időzítési támadások összetettsége és kifinomultsága aláhúzza a folyamatos kutatás és fejlesztés szükségességét mind a hardver-, mind a szoftverbiztonság területén. Ahogy a CPU-architektúrák folyamatosan fejlődnek, az ilyen és az oldalsó csatornás támadások egyéb formái elleni védekezési stratégiáknak is ki kell terjedniük.
További friss kérdések és válaszok ezzel kapcsolatban CPU-időzítési támadások:
- Milyen kihívásokkal és kompromisszumokkal jár az időzítési támadások elleni hardveres és szoftveres csökkentés végrehajtása a rendszer teljesítményének megőrzése mellett?
- Hogyan segíthet az állandó idejű programozás csökkenteni az időzítési támadások kockázatát a kriptográfiai algoritmusokban?
- Mi az a spekulatív végrehajtás, és hogyan járul hozzá a modern processzorok sebezhetőségéhez az olyan időzítési támadásokkal szemben, mint a Spectre?
- Hogyan használják ki az időzítési támadások a végrehajtási idő változásait, hogy érzékeny információkat vonjanak ki a rendszerből?
- Mi az időzített támadás?