Projekt za prenos mehanizma izolacije zastave v Linux

Avtor standardne knjižnice Cosmopolitan C in platforme Redbean je napovedal implementacijo izolacijskega mehanizma pledge() za Linux. Zastavo je prvotno razvil projekt OpenBSD in vam omogoča, da aplikacijam selektivno prepoveste dostop do neuporabljenih sistemskih klicev (za aplikacijo se oblikuje nekakšen beli seznam sistemskih klicev, drugi klici pa so prepovedani). Za razliko od mehanizmov za nadzor dostopa syscall, ki so na voljo v Linuxu, kot je seccomp, je mehanizem zastave že od samega začetka zasnovan tako, da je kar se da enostaven za uporabo.

Neuspela pobuda izolacije aplikacij v osnovnem okolju OpenBSD z uporabo mehanizma systrace je pokazala, da je izolacija na ravni posameznih sistemskih klicev preveč zapletena in dolgotrajna. Kot alternativa je bila predlagana obljuba, ki je omogočila ustvarjanje izolacijskih pravil brez spuščanja v podrobnosti in manipulacije že pripravljenih razredov dostopa. Ponujeni razredi so na primer stdio (vhod/izhod), rpath (samo branje datotek), wpath (pisanje datotek), cpath (ustvarjanje datotek), tmpath (delo z začasnimi datotekami), inet (omrežne vtičnice), unix (unix sockets), dns (ločljivost DNS), getpw (dostop za branje do baze podatkov uporabnikov), ioctl (klic ioctl), proc (nadzor procesa), exec (zagon procesov) in id (nadzor dovoljenj).

Pravila za delo s sistemskimi klici so navedena v obliki opomb, ki vključujejo seznam dovoljenih razredov sistemskih klicev in niz poti datotek, kjer je dostop dovoljen. Po izgradnji in zagonu spremenjene aplikacije jedro prevzame nalogo spremljanja skladnosti z navedenimi pravili.

Ločeno se razvija pledge implementacija za FreeBSD, ki se odlikuje po zmožnosti izolacije aplikacij brez spreminjanja njihove kode, medtem ko je v OpenBSD pledge klic namenjen tesni integraciji z osnovnim okoljem in dodajanju opomb v kodo vsake aplikacija.

Razvijalci port of pledge za Linux so vzeli primer FreeBSD in namesto spreminjanja kode pripravili dodatek za pledge.com, ki omogoča uporabo omejitev brez spreminjanja kode aplikacije. Na primer, če želite zagnati pripomoček curl z dostopom samo do razredov sistemskega klica stdio, rpath, inet in threadstdio, samo zaženite "./pledge.com -p 'stdio rpath inet thread' curl http://example.com" .

Pripomoček pledge deluje na vseh distribucijah Linuxa od RHEL6 dalje in ne potrebuje korenskega dostopa. Dodatno je na osnovi svetovljanske knjižnice zagotovljen API za upravljanje omejitev v kodi programov v jeziku C, ki med drugim omogoča ustvarjanje enklav za selektivno omejevanje dostopa glede na določene funkcije aplikacije.

Implementacija ne zahteva sprememb v jedru – omejitve obljube so prevedene v pravila SECCOMP BPF in obdelane z izvornim mehanizmom izolacije sistemskih klicev Linux. Na primer, klic pledge("stdio rpath", 0) bo pretvorjen v filter BPF static const struct sock_filter kFilter[] = { /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 - 1), / * L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])), /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 4 - 3, 0), /* L3 */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 0, 13 - 4), /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])), /* L5*/ BPF_STMT(BPF_ALU | BPF_AND | BPF_K, ~0x80800), /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0), /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 0, 13 - 8 ), /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[2])), /* L9*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 12 - 10, 0), /*L10* / BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 12 - 11, 0), /*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 17, 0, 13 - 11), /*L12*/ BPF_STMT(BPF_RET | BPF_K , SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* naslednji filter */ };

Vir: opennet.ru

Dodaj komentar