Mradi wa kuweka utaratibu wa kutengwa kwa ahadi kwa Linux

Mwandishi wa maktaba ya kiwango cha Cosmopolitan C na jukwaa la Redbean ametangaza utekelezaji wa utaratibu wa kutengwa wa ahadi() kwa ajili ya Linux. Ahadi ilianzishwa na mradi wa OpenBSD na hukuruhusu kwa kuchagua kuzuia programu kufikia simu zisizotumika za mfumo (aina ya orodha nyeupe ya simu za mfumo huundwa kwa programu, na simu zingine haziruhusiwi). Tofauti na mifumo ya kuzuia simu ya mfumo inayopatikana katika Linux, kama vile seccomp, utaratibu wa kuahidi uliundwa kuwa rahisi iwezekanavyo.

Mpango ulioshindwa wa kutenga programu katika mazingira ya msingi ya OpenBSD kwa kutumia utaratibu wa systrace ulionyesha kuwa utengaji katika kiwango cha simu za mfumo mahususi ulikuwa changamano na unatumia muda mwingi. Kama mbadala, ahadi ilipendekezwa, ambayo ilifanya iwezekane kuunda sheria za kutengwa bila kuingia katika maelezo na kudhibiti madarasa ya ufikiaji yaliyotengenezwa tayari. Kwa mfano, madarasa yanayotolewa ni stdio (pembejeo/pato), rpath (faili za kusoma tu), wpath (andika faili), cpath (unda faili), tmppath (fanya kazi na faili za muda), inet (soketi za mtandao), unix ( unix soketi) , dns (suluhisho la DNS), getpw (ufikiaji wa kusoma kwa hifadhidata ya mtumiaji), ioctl (simu ya ioctl), proc (usimamizi wa mchakato), exec (uzinduzi wa mchakato) na id (usimamizi wa haki za ufikiaji).

Sheria za kufanya kazi na simu za mfumo zimebainishwa kwa namna ya maelezo, ikiwa ni pamoja na orodha ya madarasa yanayoruhusiwa ya simu za mfumo na safu ya njia za faili ambapo ufikiaji unaruhusiwa. Baada ya kujenga na kuzindua programu iliyobadilishwa, kernel inachukua kazi ya ufuatiliaji kufuata sheria zilizowekwa.

Utekelezaji tofauti wa ahadi unatengenezwa kwa FreeBSD, ambayo inatofautishwa na uwezo wa kutenga programu bila kufanya mabadiliko kwa nambari zao, wakati katika OpenBSD simu ya ahadi inalenga ushirikiano mkali na mazingira ya msingi na kuongeza maelezo kwa kanuni za kila moja. maombi.

Watengenezaji wa bandari ya ahadi ya Linux walichukua mfano wa FreeBSD na, badala ya kufanya mabadiliko kwenye msimbo, walitayarisha programu jalizi ya pledge.com ambayo inakuruhusu kuweka vikwazo bila kubadilisha msimbo wa programu. Kwa mfano, ili kuendesha matumizi ya kukunja kwa ufikiaji wa darasa za simu za stdio, rpath, inet na threadstdio tu, endesha tu β€œ./pledge.com -p 'stdio rpath inet thread' curl http://example.com”.

Huduma ya ahadi hufanya kazi kwenye usambazaji wote wa Linux kuanzia na RHEL6 na hauhitaji ufikiaji wa mizizi. Zaidi ya hayo, kwa kuzingatia maktaba ya ulimwengu, API hutolewa kwa udhibiti wa vikwazo katika msimbo wa programu katika lugha ya C, ambayo inaruhusu, kati ya mambo mengine, kuunda enclaves kwa kuchagua kuzuia upatikanaji kuhusiana na kazi fulani za programu.

Utekelezaji hauhitaji mabadiliko kwenye kernel - vikwazo vya ahadi hutafsiriwa katika sheria za SECCOM BPF na kuchakatwa kwa kutumia utaratibu wa kutengwa wa mfumo wa Linux asilia. Kwa mfano, ahadi ya kupiga simu("stdio rpath", 0) itabadilishwa kuwa kichujio cha BPF tuli 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_ANDT) | 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_STMT,(BPF_STMT)) SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* kichujio kinachofuata */ };

Chanzo: opennet.ru

Kuongeza maoni