A kernel által sem olvasható, titkos memóriatartomány létrehozását lehetővé tevő rendszerhívás került beolvasztásra a Linux kernelbe

Címkék

A neve memfd_secret(). A fő célja:

[...] allow a user-space process to create a range of memory that is inaccessible to anybody else — kernel included. That memory can be used to store cryptographic keys or any other data that must not be exposed to others.
Az új syscall a kiadás előtt álló 5.14-es kernelbe került beolvasztásra. Részletek itt.

Hozzászólások

Szerkesztve: 2021. 08. 22., v – 11:09

Szerintem kicsit félrevezető. Ez nem jelenti azt, hogy a kernel egyáltalán nem tudja elérni az így allokált memóriát.

Csupán arról van szó, hogy ez a memóriaterület nem lesz folyamatosan bemappelve a laptáblába.

Alapból az egész kernel memória folyamatosan be van mappelve, függetlenül attól, hogy kernel vagy userspace-ben fut-e a processzor, ill. melyik folyamat van beütemezve. 64 bites rendszereken ez a komplett fizikai memóriának egy lineáris képét is tartalmazza, 32 bites rendszereken csak kb az első 900MB-ot, mert több nem fér be. Ez nagyon gyorsítja a kontextusváltásokat, mert nem kell a laptáblát piszkálni, nem kell a TLB-cache-t kiüríteni stb. A memóriát egyedül a read, write, execute lapjogosultság-bitek elvétele védi meg az aktuálisan futó alkalmazástól.

Ez utóbbi bukott meg a meltdown sebezhetőségnél, mikor kiderült, hogy a processzor a laptábla read jogosultság bitjének értékét spekulatívan feltételezi és csak utólag ellenőrzi. (Majd nem-tökéletesen görgeti vissza, ha kiderül, hogy nem volt read jog). Itt számított az, hogy a virtuális memóriába be van mappelve egy csomó minden amihez a futó alkalmazásnak semmi köze. A meltdown-ra workaround az volt, hogy a syscall belépés/kilépéskor a kernel folyamatosan ki-be mappelte a teljes kernel memóriát, ami szignifikáns teljesítményromlással járt (bár kicsit túl volt fújva).

A memfd_secret lényegében ennek egy finomhangolt változata, ahol az alkalmazás meg tudja mondani a kernelnek, hogy hol vannak az igazán szenzitív adatai, amiket semmiképp sem szabad bennfelejteni a virtuális memóriaképben, amikor nem az azt tulajdonoló alkalmazás van beütemezve. Természetesen a kernel ettől függetlenül továbbra is bemappelheti - hiszen máshogy nem tudná elérhetővé tenni az alkalmazás számára - ezáltal a kernel nem "zárta ki magát" erről a memóriaterületről. De a lényeg, hogy csak akkor mappeli be, amikor tényleg kell. Mivel nem a teljes memóriakép ki-be mappeléséről van szó, ezért a TLB flush költsége is csak ezt a memóriaterületet érinti, vagyis remélhetőleg nem jár olyan durva teljesítményvesztéssel, mint a teljes meltdown workaround.

Az elképzelés az, hogy ezt akkor is lehet alkalmazni, ha az adott rendszeren éppen nincsen ismert meltdown-jellegű sebezhetőség, mert ki tudja, hátha mégis.
Másrészt véd olyan kernel security bugoknál, amik lehetővé teszik tetszőleges (kernel virtuális) memóriacímen levő adat elolvasását, de kódvégrehajtást nem. (Ez utóbbi esetben a támadó visszamappelhetné a secret memóriát - ráadásul ad is némi támpontot a támadónak, hogy hol vannak az igazán érdekes részek.)
Harmadrészt - bár a leírások nem említik, de szerintem logikus hogy így legyen - a felszabadításkor ezt a memóriaterületet fizikai memóriában is garantáltan ki lehet nullázni, nem csak unmappelni a memórialapokat, ahogy normálisan történne.
Negyedrészt a jövőben elképzelhető, hogy memfd_secret-re valami hardveres memóriatitkosítást is rákötnek.

Régóta vágyok én, az androidok mezonkincsére már!

Kösz a részletes infót. Jó tudni. Bár szerintem ez nem valami hasznos, mert akinek ilyen szintű, ultraparanoiás überbiztonság kell, az használjon OpenBSD-t, abban elég durva security megoldások vannak, random újralinkelése binárisoknak, kernelnek, memóriaszegmens/stack randomizáció, stb.. Amik persze a teljesítményt és debugolhatóságot rontják, de hát a kényelem+teljesítmény és a biztonság mindig is ellentétes irányba hatottak. Persze tőlem a Linux kernelbe is elférnének ezek, ha nincs kötelezően rátolva a userre, így akinek kell használja, akinek nem, az kikapcsolja, nem aktiválja.

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

A cím alapján ez olyan, mint a szupertitkos üzenet: elolvasás előtt megsemmisítendő.

> Sol omnibus lucet.