Äskettäin Cosmopolitan C -standardikirjaston ja Redbean-alustan tekijä ilmoitti pledge()-eristysmekanismin käyttöönotosta Linuxissa.
Alun perin OpenBSD-projektin kehittämä pledge antaa sinun valikoivasti estää sovelluksia käyttämästä käyttämättömiä järjestelmäkutsuja (luomalla sovelluksen järjestelmäkutsujen valkoisen listan ja estämällä muut kutsut). Toisin kuin Linuxissa saatavilla olevat syscall-käyttöoikeuksien hallintamekanismit, kuten seccomp, pledge on suunniteltu alusta alkaen mahdollisimman käyttäjäystävälliseksi.
Epäonnistunut aloite eristää sovelluksia OpenBSD-perusympäristössä systrace-mekanismilla osoitti, että eristäminen yksittäisten järjestelmäkutsujen tasolla on liian monimutkaista ja aikaa vievää.
Vaihtoehtoisesti ehdotettiin pledge-periaatetta, joka mahdollisti eristyssääntöjen luomisen menemättä yksityiskohtiin ja manipuloimatta valmisteltuja käyttöoikeusluokkia.
Tarjotut luokat ovat esimerkiksi stdio (input/output), rpath (vain lukutiedostot), wpath (kirjoita tiedostot), cpath (luo tiedostoja), tmppath (työskentele väliaikaisten tiedostojen kanssa), inet (sockets network), unix (unix-socketit). ), dns (DNS-resoluutio), getpw (käyttäjätietokannan lukuoikeus), ioctl (ioctl-kutsu), proc (prosessinhallinta), exec (käynnistysprosessit) ja id (käyttöoikeuksien valvonta).
Järjestelmäkutsujen käsittelyä koskevat säännöt on määritelty merkintöjen muodossa, jotka sisältävät luettelon sallituista järjestelmäkutsujen luokista ja taulukon tiedostopoluista, joihin pääsy on sallittu. Kun muokattu sovellus on käännetty ja suoritettu, ydin ottaa hoitaakseen määriteltyjen sääntöjen noudattamisen valvonnan.
Erikseen kehitetään FreeBSD:n pledge-toteutusta, joka erottuu kyvystä eristää sovelluksia muuttamatta niiden koodia, kun taas OpenBSD:ssä pledge-kutsulla pyritään tiiviiseen integraatioon perusympäristön kanssa ja huomautusten lisäämiseen koodiin. jokaisesta.
Pantti on kuin kielletty hedelmä, jota me kaikki kaipaamme, kun pomo sanoo, että meidän pitäisi käyttää Linuxin kaltaisia ​​asioita. Miksi sillä on väliä? Se johtuu siitä, että pledge() tekee turvallisuudesta ymmärrettävän. Linuxilla ei ole koskaan ollut sellaista suojaustasoa, jonka pelkkä kuolevainen voisi ymmärtää.
Linuxin pledge-portin kehittäjät seurasivat FreeBSD:n esimerkkiä ja koodimuutosten tekemisen sijaan valmistivat pledge.com-sivustolta lisäapuohjelman, jonka avulla voit asettaa rajoituksia muuttamatta sovelluskoodiasi. Esimerkiksi jos haluat suorittaa curl-apuohjelman ja käyttää vain järjestelmäkutsuja stdio, rpath, inet ja threadstdio, suorita yksinkertaisesti komento `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.
Apuohjelma toimii kaikissa Linux-jakeluissa RHEL6:sta eteenpäin eikä vaadi pääkäyttäjän oikeuksia. Lisäksi Cosmopolitan-kirjastoon perustuva API tarjoaa rajoitusten hallinnan C-ohjelmakoodissa, mikä mahdollistaa muun muassa enklaavien luomisen tiettyjen sovellustoimintojen käytön valikoivaksi rajoittamiseksi.
Muutama kehittäjä on aiemmin kokeillut tätä. En aio nimetä nimiä, koska suurinta osaa näistä projekteista ei koskaan saatu päätökseen. Mitä tulee SECOMPiin, online-opetusohjelmat selittävät vain, kuinka järjestelmäkutsut lisätään sallittujen luetteloon, joten useimmat ihmiset menettävät kiinnostuksensa ennen kuin he keksivät, kuinka argumentit suodatetaan. Eteenpäin edenneissä projekteissa oli myös virheitä, kuten setuid/setgid/sticky-bittien vaihtaminen. Siksi mitään nykyisistä vaihtoehdoista ei tule käyttää. Luulen, että tämä pyrkimys tuo meidät paljon lähemmäksi lupausta() kuin koskaan ennen.
Käyttöönotto ei vaadi ytimen muutoksia: apuohjelman rajoitukset käännetään SECCOMP BPF -säännöiksi ja käsitellään Linuxin alkuperäisen järjestelmäkutsujen eristysmekanismin avulla. Esimerkiksi lupaus("stdio rpath", 0) kutsuminen muuntaa BPF-suodattimen
Lopuksi, jos olet kiinnostunut oppimaan lisää, löydät tiedot seuraavasta linkistä.