Proyekto sa pag-port sa mekanismo sa pag-inusara sa pledge sa Linux

Ang tagsulat sa Cosmopolitan standard C library ug ang Redbean nga plataporma mipahibalo sa pagpatuman sa pledge() isolation mechanism para sa Linux. Ang Pledge orihinal nga gimugna sa proyekto sa OpenBSD ug gitugotan ka nga pilion nga idili ang mga aplikasyon sa pag-access sa wala magamit nga mga tawag sa sistema (usa ka klase nga puti nga lista sa mga tawag sa sistema ang naporma para sa aplikasyon, ug ang uban nga mga tawag gidili). Dili sama sa mga mekanismo sa pagpugong sa pag-access sa tawag sa sistema nga anaa sa Linux, sama sa seccomp, ang mekanismo sa pledge orihinal nga gidisenyo nga ingon ka yano kutob sa mahimo.

Ang napakyas nga inisyatiba sa pag-isolate sa mga aplikasyon sa OpenBSD base environment gamit ang systrace nga mekanismo nagpakita nga ang pag-inusara sa lebel sa tagsa-tagsa nga mga tawag sa sistema kay komplikado kaayo ug makagugol sa panahon. Isip usa ka alternatibo, gisugyot ang usa ka saad, nga nagpaposible sa paghimo sa mga lagda sa pag-inusara nga dili moadto sa mga detalye ug pagmaniobra sa mga klase sa pag-access nga andam na. Pananglitan, ang mga klase nga gitanyag mao ang stdio (input/output), rpath (read-only files), wpath (write files), cpath (create files), tmppath (work with temporary files), inet (network sockets), unix ( unix sockets), dns (DNS resolution), getpw (basaha ang access sa user database), ioctl (ioctl call), proc (process management), exec (process launch) ug id (access rights management).

Ang mga lagda alang sa pagtrabaho sa mga tawag sa sistema gipiho sa porma sa mga anotasyon, lakip ang usa ka lista sa gitugotan nga mga klase sa mga tawag sa sistema ug usa ka laray sa mga agianan sa file diin gitugotan ang pag-access. Human sa pagtukod ug paglansad sa giusab nga aplikasyon, ang kernel mopuli sa trabaho sa pagmonitor sa pagsunod sa gipiho nga mga lagda.

Usa ka bulag nga pagpatuman sa pledge ang gihimo alang sa FreeBSD, nga gipalahi sa abilidad sa pag-isolate sa mga aplikasyon nga wala’y pagbag-o sa ilang code, samtang sa OpenBSD ang tawag sa pledge gitumong sa hugot nga panagsama sa base nga palibot ug pagdugang mga anotasyon sa code sa matag usa. aplikasyon.

Ang mga nag-develop sa pledge port alang sa Linux mikuha sa panig-ingnan sa FreeBSD ug, imbes nga magbag-o sa code, nag-andam ug usa ka add-on nga utility pledge.com nga nagtugot kanimo sa paggamit sa mga pagdili nga dili usbon ang code sa aplikasyon. Pananglitan, sa pagpadagan sa curl utility nga adunay access lamang sa stdio, rpath, inet ug threadstdio system call nga mga klase, padagana lang ang β€œ./pledge.com -p 'stdio rpath inet thread' curl http://example.com”.

Ang pledge utility naglihok sa tanang distribusyon sa Linux sugod sa RHEL6 ug wala magkinahanglan ug root access. Dugang pa, base sa kosmopolitan nga librarya, usa ka API ang gihatag alang sa pagdumala sa mga pagdili sa program code sa C nga pinulongan, nga nagtugot, lakip sa ubang mga butang, sa paghimo og mga enclaves alang sa pinili nga pagpugong sa pag-access kalabot sa pipila ka mga function sa aplikasyon.

Ang pagpatuman wala magkinahanglan og mga pagbag-o sa kernel - ang mga pagdili sa pledge gihubad ngadto sa SECCOMP BPF nga mga lagda ug giproseso gamit ang lumad nga Linux system call isolation mechanism. Pananglitan, ang pledge sa tawag("stdio rpath", 0) makabig ngadto sa 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 - , /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[8])), /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 9, 0 - 12, 10), /*L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 6 - 12, 11), /*L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 11, 17, 0 - 13), /*L11*/ BPF_KPF | SECCOMP_RET_ALOW), /*L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L13*/ /* sunod nga filter */ };

Source: opennet.ru

Idugang sa usa ka comment