Projektas, perkeliantis įkeitimo atskyrimo mechanizmą į Linux

„Cosmopolitan C“ standartinės bibliotekos ir „Redbean“ platformos autorius paskelbė apie „Linux“ izoliacijos mechanizmo įdiegimą. Įkeitimas iš pradžių buvo sukurtas OpenBSD projekto ir leidžia pasirinktinai uždrausti programoms pasiekti nepanaudotus sistemos iškvietimus (programai susidaro savotiškas baltasis sistemos iškvietimų sąrašas, o kiti skambučiai draudžiami). Skirtingai nuo „Syscall“ prieigos kontrolės mechanizmų, prieinamų „Linux“, pvz., „seccomp“, įkeitimo mechanizmas sukurtas taip, kad juo būtų kuo lengviau naudotis.

Nepavykusi iniciatyva izoliuoti programas OpenBSD bazinėje aplinkoje naudojant systrace mechanizmą parodė, kad atskirų sistemos iškvietimų izoliavimas yra per sudėtingas ir atimantis daug laiko. Kaip alternatyva buvo pasiūlytas įkeitimas, kuris leido sukurti izoliavimo taisykles nesigilinant į detales ir nemanipuliuojant paruoštomis prieigos klasėmis. Pavyzdžiui, siūlomos klasės yra stdio (įvestis / išvestis), rpath (tik failų skaitymas), wpath (failų rašymas), cpath (failų kūrimas), tmppath (darbas su laikinais failais), inet (tinklo lizdai), unix (unix). lizdai), dns (DNS skiriamoji geba), getpw (skaitymo prieiga prie vartotojų duomenų bazės), ioctl (ioctl skambutis), proc (procesų valdymas), exec (procesų paleidimas) ir id (leidimų kontrolė).

Darbo su sistemos iškvietimais taisyklės nurodytos anotacijų pavidalu, kuriose yra leistinų sistemos skambučių klasių sąrašas ir failų kelių masyvas, kur leidžiama prieiga. Sukūrus ir paleidus pakeistą programą, branduolys perima užduotis stebėti, kaip laikomasi nurodytų taisyklių.

Atskirai kuriamas „FreeBSD“ įkeitimo diegimas, kuris išsiskiria galimybe izoliuoti programas nekeičiant jų kodo, o OpenBSD „pledge“ iškvietimas yra skirtas glaudžiai integruoti su bazine aplinka ir pridėti komentarų prie kiekvieno kodo. taikymas.

Linux port of pledge kūrėjai ėmėsi FreeBSD pavyzdžio ir, užuot keitę kodą, parengė pledge.com priedą, leidžiantį taikyti apribojimus nekeičiant programos kodo. Pavyzdžiui, norėdami paleisti curl paslaugų programą su prieiga tik prie stdio, rpath, inet ir threadstdio sistemos skambučių klasių, tiesiog paleiskite "./pledge.com -p 'stdio rpath inet thread' curl http://example.com" .

Įkeitimo programa veikia visuose Linux platinimuose nuo RHEL6 ir nereikalauja root prieigos. Be to, remiantis kosmopolitiška biblioteka, yra numatyta API, skirta valdyti programų kodo apribojimus C kalba, kuri, be kita ko, leidžia sukurti anklavus, skirtus pasirinktinai apriboti prieigą prie tam tikrų programų funkcijų.

Diegimui nereikia keisti branduolio – įsipareigojimų apribojimai paverčiami SECCOMP BPF taisyklėmis ir apdorojami naudojant vietinį Linux sistemos skambučių izoliavimo mechanizmą. Pavyzdžiui, iškvietimas pledge("stdio rpath", 0) bus konvertuotas į BPF filtrą 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_RETOWALL, |BCOMPF_RETOWALL, | ), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* kitas filtras */ };

Šaltinis: opennet.ru

Добавить комментарий