W^X-es lett az OpenBSD amd64 kernele

Címkék

A W^X (vagy: "W xor X") egy biztonsági feature, ami az OpenBSD 3.3-ban mutatkozott be először még 2003-ban. A W^X egy memóriavédelmi irányelv, amely által az adott folyamat címterében levő minden lap vagy írható, vagy végrehajtható, de nem lehet mindkettő egy időben (erre utal a XOR logikai operátor a névben). Vagyis, biztosítja, hogy az alkalmazások által írható memória nem lehet ugyanakkor végrehajtható és fordítva. Ez megnehezíti a puffer túlcsordulások és más típusú támadások dolgát.

Theo de Raadt a napokban bejelentette, hogy Mike Larkin munkájának köszönhetően az OpenBSD amd64 kernele immár követi az W^X alapelvet.

Hozzászólások

jo otletnek tunik...

--
"Pont attól akartam megkímélni magam, hogy gondolkodni kelljen ;)" (lajos22)

Nem is értem, ez miért egy "biztonsági feature" 2003-ból. Ez valahol olyan alapvetőnek tűnt kezdetektől fogva, hiszen ezért vannak W és X lapok, vagy nem?(gondolom naivan) Egyszerű mint a bot, és mai programok 99%-át elvileg nem kéne hogy érintse.

Azt nem mondtam, hogy nincs olyan helyzet amikor szükség lehet a program kód adatként való kezelésére, de ha már e lehetőség adott erre a védelemre, akkor a naiv logika szerint az következne hogy az oprendszer ezt csak speciális folyamatoknak engedélyezze. Egy átlag szolgáltatás esetén erre mi szükség van?

Alkalmazás szinten valóban ritka, esetleg bizonyos virtualizáció gyorsító technikáknál, ahol egyébként a hardware-es gyorsítás nem adott(ezek egyébként sem a biztonságról híresek). Meg ugye a futásidőben történő linkelések, de ezekhez természetesen az oprendszer közreműködését kell kérni. Szóval semmi olyasmi ami a biztonságos, user szintű használathoz kapcsolódna.

Szerk:
"futásidőben történő linkelések"

Ebbe az is beletartozik mikor egy program pointereket tárol függvények meghívásához. Ez viszont eléggé sokat használt gyakorlat, úgyhogy nem tudnám kapásból a megoldást.

Abban megegyezhetünk hogy nem kell(normál userlandban). Én viszont kicsit tovább gondoltam a dolgot, hogy mi van, ha a program az adat szegmensből vesz egy pointert egy függvény meghívásához. Elég sokat látni ilyet. Egy ilyen pointer eltérítésével is lehet csúnyaságokat csinálni. Persze ha a kódszegmensbe eleve sehogyan sem kerülhet nem oda való dolog, akkor nincsen gond. Nem tudom ezt lehet-e garantálni.

Töltse be nyugodtan a memóriába a régi kód helyére, de ezt gondolom az oprendszertől kell kérni - attól még nincs szükség szerintem arra, hogy a memóriában futó kód a saját kód részének memória területét megváltoztassa vagy felülírja - ez legyen csak a kernel joga.

Csak tipp: a harvard architektúra lényege nem a security, hanem a komplexitás csökkentése a cpu-ban azáltal, hogy a program memóriát folyamatosan lehet olvasni, az adatmemóriától függetlenül. Ez főleg RISC architektúrán érdekes, így lehet garantálni hogy az utasítások fix órajel alatt lefutnak, nem kell cachelni hogy mindig ki legyen szolgálva a pipeline, stb.

Amiért szerintem általánosabb eszközökön nem terjedt el: egyrészt amikor nagyon kevés memória állt rendelkezésre, azt jobban ki lehetett használni neumann architektúrát használva, másrészt sokkal egyszerűbb volt a programbetöltés.

Ezúttal fenntartom a jogot hogy hülyeségeket beszélek. :)