Proġett għall-port tal-mekkaniżmu ta 'iżolament tal-wegħda għal Linux

L-awtur tal-librerija C standard Cosmopolitan u l-pjattaforma Redbean ħabbar l-implimentazzjoni tal-mekkaniżmu ta 'iżolament ta' rahan () għal Linux. Pledge kien oriġinarjament żviluppat mill-proġett OpenBSD u jippermettilek tipprojbixxi b'mod selettiv applikazzjonijiet milli jaċċessaw sejħiet tas-sistema mhux użati (tip ta 'lista bajda ta' sejħiet tas-sistema hija ffurmata għall-applikazzjoni, u sejħiet oħra huma pprojbiti). B'differenza mill-mekkaniżmi ta 'restrizzjoni ta' aċċess għas-sejħa tas-sistema disponibbli fil-Linux, bħal seccomp, il-mekkaniżmu ta 'rahan kien oriġinarjament iddisinjat biex ikun sempliċi kemm jista' jkun.

L-inizjattiva falluta biex jiġu iżolati l-applikazzjonijiet fl-ambjent bażi OpenBSD bl-użu tal-mekkaniżmu systrace wriet li l-iżolament fil-livell ta 'sejħiet tas-sistema individwali kien kumpless wisq u jieħu ħafna ħin. Bħala alternattiva, ġie propost wegħda, li għamilha possibbli li jinħolqu regoli ta 'iżolament mingħajr ma jidħlu fid-dettalji u jiġu manipulati klassijiet ta' aċċess lesti. Pereżempju, il-klassijiet offruti huma stdio (input/output), rpath (fajls li jinqraw biss), wpath (kitba fajls), cpath (oħloq fajls), tmppath (ħidma b'fajls temporanji), inet (sokits tan-netwerk), unix ( sockets unix), dns (riżoluzzjoni DNS), getpw (aċċess għall-qari għad-database tal-utent), ioctl (sejħa ioctl), proc (ġestjoni tal-proċess), exec (tnedija tal-proċess) u id (ġestjoni tad-drittijiet tal-aċċess).

Ir-regoli biex taħdem mas-sejħiet tas-sistema huma speċifikati fil-forma ta' annotazzjonijiet, inkluża lista ta' klassijiet permessi ta' sejħiet tas-sistema u firxa ta' mogħdijiet tal-fajls fejn l-aċċess huwa permess. Wara li tibni u tniedi l-applikazzjoni modifikata, il-qalba tieħu f'idejha x-xogħol tal-monitoraġġ tal-konformità mar-regoli speċifikati.

Qed tiġi żviluppata implimentazzjoni separata tal-wegħda għal FreeBSD, li hija distinta mill-abbiltà li tiżola l-applikazzjonijiet mingħajr ma tagħmel bidliet fil-kodiċi tagħhom, filwaqt li f'OpenBSD is-sejħa tal-wegħda hija mmirata lejn integrazzjoni stretta mal-ambjent bażi u żżid annotazzjonijiet mal-kodiċi ta' kull wieħed. applikazzjoni.

L-iżviluppaturi tal-port ta 'rahan għal Linux ħadu l-eżempju ta' FreeBSD u, minflok għamlu bidliet fil-kodiċi, ħejjew utilità add-on pledge.com li tippermettilek tapplika restrizzjonijiet mingħajr ma tbiddel il-kodiċi tal-applikazzjoni. Pereżempju, biex tħaddem l-utilità curl b'aċċess biss għall-klassijiet tas-sejħiet tas-sistema stdio, rpath, inet u threadstdio, mexxi biss “./pledge.com -p 'stdio rpath inet thread' curl http://example.com”.

L-utilità tal-wegħda taħdem fuq id-distribuzzjonijiet kollha tal-Linux li jibdew b'RHEL6 u ma teħtieġx aċċess għall-għeruq. Barra minn hekk, ibbażata fuq il-librerija kożmopolitana, hija pprovduta API għall-ġestjoni tar-restrizzjonijiet fil-kodiċi tal-programm fil-lingwa C, li tippermetti, fost affarijiet oħra, li jinħolqu enklavi għar-restrizzjoni selettiva tal-aċċess fir-rigward ta 'ċerti funzjonijiet tal-applikazzjoni.

L-implimentazzjoni ma teħtieġx bidliet fil-qalba - ir-restrizzjonijiet tar-rahan huma tradotti f'regoli SECCOMP BPF u pproċessati bl-użu tal-mekkaniżmu nattiv ta 'iżolament tas-sejħa tas-sistema Linux. Pereżempju, ir-rahan tas-sejħa("stdio rpath", 0) se jiġi kkonvertit għal filtru 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_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_RETMT |(BPF_JMP | BPF_JEQ | BPF_K, 13, 14, XNUMX - XNUMX), /*LXNUMX*/ BPF_RET | SECCOMP_RET_ALLOW), /*LXNUMX*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*LXNUMX*/ /* filtru li jmiss */ };

Sors: opennet.ru

Żid kumment