Projekt prijenosa mehanizma izolacije obećanja na Linux

Autor standardne C biblioteke Cosmopolitan i platforme Redbean najavio je implementaciju mehanizma izolacije pledge() za Linux. Pledge je izvorno razvijen od strane projekta OpenBSD i omogućuje vam da selektivno zabranite aplikacijama pristup neiskorištenim pozivima sustava (za aplikaciju se formira neka vrsta bijele liste poziva sustava, a drugi pozivi su zabranjeni). Za razliku od mehanizama ograničenja poziva sustava koji su dostupni u Linuxu, kao što je seccomp, mehanizam obećanja je izvorno dizajniran da bude što je moguće jednostavniji.

Neuspjela inicijativa izolacije aplikacija u osnovnom okruženju OpenBSD pomoću mehanizma systrace pokazala je da je izolacija na razini pojedinačnih sistemskih poziva bila previše složena i dugotrajna. Kao alternativa, predložen je zalog, koji je omogućio stvaranje pravila izolacije bez ulaženja u detalje i manipuliranja gotovim klasama pristupa. Na primjer, ponuđene klase su stdio (ulaz/izlaz), rpath (datoteke samo za čitanje), wpath (pisanje datoteka), cpath (stvaranje datoteka), tmppath (rad s privremenim datotekama), inet (mrežne utičnice), unix ( unix sockets), dns (DNS rezolucija), getpw (pristup čitanja korisničkoj bazi podataka), ioctl (ioctl poziv), proc (upravljanje procesom), exec (pokretanje procesa) i id (upravljanje pravima pristupa).

Pravila za rad sa sistemskim pozivima navedena su u obliku komentara, uključujući popis dopuštenih klasa sistemskih poziva i niz staza datoteka kojima je pristup dopušten. Nakon izgradnje i pokretanja modificirane aplikacije, kernel preuzima posao nadzora poštivanja navedenih pravila.

Za FreeBSD se razvija zasebna implementacija pledgea, koja se ističe sposobnošću izolacije aplikacija bez mijenjanja njihovog koda, dok je u OpenBSD-u pledge call usmjeren na tijesnu integraciju s osnovnim okruženjem i dodavanje primjedbi kodu svake primjena.

Programeri pledge porta za Linux uzeli su primjer FreeBSD-a i, umjesto izmjena koda, pripremili pomoćni program pledge.com koji vam omogućuje primjenu ograničenja bez mijenjanja koda aplikacije. Na primjer, da pokrenete uslužni program curl s pristupom samo klasama sistemskog poziva stdio, rpath, inet i threadstdio, samo pokrenite “./pledge.com -p 'stdio rpath inet thread' curl http://example.com”.

Uslužni program pledge radi na svim distribucijama Linuxa počevši od RHEL6 i ne zahtijeva root pristup. Dodatno, na temelju kozmopolitske biblioteke, osiguran je API za upravljanje ograničenjima u programskom kodu u jeziku C, koji omogućuje, između ostalog, stvaranje enklava za selektivno ograničavanje pristupa u odnosu na određene funkcije aplikacije.

Implementacija ne zahtijeva promjene u kernelu - ograničenja obećanja su prevedena u SECCOMP BPF pravila i obrađena korištenjem izvornog mehanizma izolacije poziva sustava Linux. Na primjer, poziv pledge("stdio rpath", 0) će se pretvoriti u BPF filter 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*/ /* sljedeći filtar */ };

Izvor: opennet.ru

Dodajte komentar