A tervek szerint a zálogleválasztó mechanizmust Linuxra portolják

A Cosmopolitan C szabványkönyvtár és a Redbean platform szerzője nemrégiben bejelentette a pledge() izolációs mechanizmus Linuxra való megvalósítását.

Az eredetileg az OpenBSD projekt által fejlesztett pledge lehetővé teszi az alkalmazások szelektív letiltását a nem használt rendszerhívásokhoz való hozzáférésről (fehérlistát hoz létre az alkalmazás rendszerhívásairól, és tiltja a többi hívást). A Linuxban elérhető syscall hozzáférés-vezérlési mechanizmusokkal, például a seccomppal ellentétben a pledge-et a kezdetektől fogva a lehető legfelhasználóbarátabbra tervezték.

A sikertelen kezdeményezés az OpenBSD alapkörnyezetben lévő alkalmazásoknak a systrace mechanizmussal történő elkülönítésére azt mutatta, hogy az egyes rendszerhívások szintjén történő elkülönítés túl bonyolult és időigényes.

Alternatív megoldásként a betöltetlenséget javasolták, amely lehetővé tette az izolációs szabályok létrehozását a részletekbe bocsátkozás és az előkészített hozzáférési osztályok manipulálása nélkül.

Például a felajánlott osztályok a következők: stdio (bemenet/kimenet), rpath (csak olvasható fájlok), wpath (fájlok írása), cpath (fájlok létrehozása), tmppath (ideiglenes fájlokkal való munka), inet (sockets hálózat), unix (unix socket) ), dns (DNS felbontás), getpw (felhasználói adatbázis olvasási hozzáférése), ioctl (ioctl hívás), proc (folyamatvezérlés), exec (indítási folyamatok) és id (engedély-ellenőrzés).

A rendszerhívásokkal való munkavégzés szabályait annotációk formájában adják meg, amelyek tartalmazzák az engedélyezett rendszerhívási osztályok listáját és a hozzáférés engedélyezett fájlelérési utak tömbjét. A módosított alkalmazás fordítása és futtatása után a kernel átveszi a megadott szabályok betartásának ellenőrzését.

Külön fejlesztik a FreeBSD-hez a pledge implementációt, amely azzal jellemezhető, hogy az alkalmazások kódjának módosítása nélkül elkülöníthetők, míg az OpenBSD-ben a pledge hívás az alap környezettel való szoros integrációt és megjegyzések hozzáadását célozza a kódon. mindegyikről.

A fogadalom olyan, mint a tiltott gyümölcs, amire mindannyian vágyunk, amikor a főnök azt mondja, használjunk olyan dolgokat, mint a Linux. Miért számít ez? Ez azért van, mert a zálog() valójában érthetővé teszi a biztonságot. A Linux valójában soha nem rendelkezett olyan biztonsági réteggel, amelyet az egyszerű halandók is megértenek.

A Linux pledge port fejlesztői a FreeBSD példáját követve a kód módosítása helyett egy további segédprogramot készítettek a pledge.com oldalról, amely lehetővé teszi a korlátozások alkalmazását az alkalmazáskód módosítása nélkül. Például ahhoz, hogy a curl segédprogramot csak az stdio, rpath, inet és threadstdio rendszerhívási osztályokhoz férhessünk hozzá, egyszerűen futtassuk a `./pledge.com -p 'stdio rpath inet thread' curl http://example.com` parancsot.

A segédprogram az RHEL6-tól kezdődő összes Linux disztribúción működik , és nem igényel root hozzáférést. Ezenkívül a cosmopolitan könyvtár alapján egy API is rendelkezésre áll a C programkód korlátozásainak kezelésére, lehetővé téve többek között enklávék létrehozását, amelyek szelektíven korlátozzák az alkalmazás bizonyos funkcióinak elérését.

A múltban volt néhány fejlesztő, aki kipróbálta ezt. Nem fogok neveket mondani, mert ezeknek a projekteknek a többsége soha nem fejeződött be. Ami a SECOMP-t illeti, az online oktatóanyagok csak a rendszerhívások engedélyezőlistára helyezését ismertetik, így a legtöbb ember elveszti érdeklődését, mielőtt rájönne, hogyan szűrje ki az argumentumokat. Az előrehaladott projektek olyan hiányosságokat is tartalmaztak, mint például a setuid/setgid/sticky bitek megváltoztatása. Ezért a jelenlegi alternatívák egyikét sem szabad használni. Úgy gondolom, hogy ez az erőfeszítés sokkal közelebb visz a zálog() megszerzéséhez, mint valaha.

A megvalósítás nem igényel kernel módosítását: a segédprogramok megszorításait a rendszer SECCOMP BPF-szabályokká fordítja le, és a Linux natív rendszerhívás-elválasztó mechanizmusával dolgozza fel. Például a ígéret("stdio rpath", 0) meghívása BPF-szűrővé konvertálódik

Végül, ha további részletekre vagy kíváncsi, a következő linken megtalálod a részleteket.


Hozzáadás előnyben részesített forrásként a Google-ben