Projekt om it meganisme foar belofte-isolaasje nei Linux te portearjen

De skriuwer fan 'e Cosmopolitan standert C-bibleteek en it Redbean-platfoarm hat de ymplemintaasje oankundige fan it pledge () isolaasjemeganisme foar Linux. Pledge waard oarspronklik ûntwikkele troch it OpenBSD-projekt en lit jo applikaasjes selektyf ferbiede tagong te krijen ta net brûkte systeemoproppen (in soarte fan wite list mei systeemoproppen wurdt foarme foar de applikaasje, en oare oproppen binne ferbean). Oars as de meganismen foar beheining fan systeemoprop beskikber yn Linux, lykas seccomp, waard it beloftemeganisme oarspronklik ûntworpen om sa ienfâldich mooglik te wêzen.

It mislearre inisjatyf om applikaasjes te isolearjen yn 'e OpenBSD-basisomjouwing mei it systrace-meganisme liet sjen dat isolaasje op it nivo fan yndividuele systeemoproppen te kompleks en tiidslinend wie. As alternatyf waard in tasizzing foarsteld, dy't it mooglik makke om isolaasjeregels te meitsjen sûnder yn details te gean en klearmakke tagongsklassen te manipulearjen. Bygelyks, de oanbeane klassen binne stdio (ynfier / útfier), rpath (allinnich-lêzen bestannen), wpath (triemmen skriuwe), cpath (triemmen oanmeitsje), tmppath (wurkje mei tydlike bestannen), inet (netwurk sockets), unix ( unix-sockets), dns (DNS-resolúsje), getpw (lês tagong ta de brûkersdatabase), ioctl (ioctl-oprop), proc (prosesbehear), exec (prosesstart) en id (behear fan tagongsrjochten).

Regels foar it wurkjen mei systeemoproppen wurde oanjûn yn 'e foarm fan annotaasjes, ynklusyf in list mei tastiene klassen fan systeemoproppen en in array fan triempaden wêr't tagong is tastien. Nei it bouwen en starten fan 'e oanpaste applikaasje, nimt de kernel it wurk oer fan it kontrolearjen fan neilibjen fan' e oantsjutte regels.

In aparte ymplemintaasje fan pledge wurdt ûntwikkele foar FreeBSD, dy't ûnderskiedt troch de mooglikheid om applikaasjes te isolearjen sûnder feroaringen oan har koade te meitsjen, wylst yn OpenBSD de pledge-oprop rjochte is op strakke yntegraasje mei de basisomjouwing en it tafoegjen fan annotaasjes oan 'e koade fan elk oanfraach.

De ûntwikkelders fan 'e pledge-poarte foar Linux namen it foarbyld fan FreeBSD en, ynstee fan wizigingen oan' e koade, tarieden in add-on-nutsbedriuw pledge.com wêrmei jo beheiningen kinne tapasse sûnder de applikaasjekoade te feroarjen. Bygelyks, om it curl-hulpprogramma út te fieren mei allinich tagong ta de opropklassen stdio, rpath, inet en threadstdio systeem, rinne gewoan "./pledge.com -p 'stdio rpath inet thread' curl http://example.com".

It pledge-hulpprogramma wurket op alle Linux-distribúsjes begjinnend mei RHEL6 en hat gjin root-tagong nedich. Derneist, basearre op 'e kosmopolityske bibleteek, wurdt in API levere foar it behearen fan beheiningen yn programmakoade yn' e C-taal, wêrmei't ûnder oare enklaves kinne meitsje foar selektyf beheine tagong yn relaasje ta bepaalde applikaasjefunksjes.

De ymplemintaasje fereasket gjin feroarings oan 'e kernel - beloftebeperkingen wurde oerset yn SECCOMP BPF-regels en ferwurke mei it native Linux-systeemoprop-isolaasjemeganisme. Bygelyks, de oprop pledge ("stdio rpath", 0) sil wurde omboud ta in 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_ANDALU | BPF_ALU | | 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_KRE, BPF_KRE, | SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* folgjende filter */ };

Boarne: opennet.ru

Add a comment