Proyék pikeun port mékanisme isolasi janji ka Linux

Panulis perpustakaan C standar Cosmopolitan sareng platform Redbean parantos ngumumkeun palaksanaan mékanisme isolasi janji () pikeun Linux. Sumpah mimitina dikembangkeun ku proyék OpenBSD sareng ngamungkinkeun anjeun sacara selektif nyaram aplikasi pikeun ngakses telepon sistem anu henteu dianggo (sajenis daptar bodas tina telepon sistem kabentuk pikeun aplikasi, sareng sauran sanésna dilarang). Beda sareng mékanisme pangwatesan panggero sistem anu aya dina Linux, sapertos seccomp, mékanisme ikrar asalna dirancang sasederhana mungkin.

Inisiatif anu gagal pikeun ngasingkeun aplikasi dina lingkungan dasar OpenBSD nganggo mékanisme systrace nunjukkeun yén isolasi dina tingkat telepon sistem individu rumit teuing sareng nyéépkeun waktos. Minangka alternatipna, jangji diusulkeun, anu ngamungkinkeun pikeun nyiptakeun aturan isolasi tanpa badé rinci sareng ngamanipulasi kelas aksés anu siap-siap. Contona, kelas anu ditawarkeun nyaéta stdio (input/output), rpath (file baca-hijina), wpath (nulis file), cpath (nyieun file), tmppath (gawé kalawan file samentara), inet (sockets jaringan), unix ( sockets unix), dns (resolusi DNS), getpw (baca aksés ka database pamaké), ioctl (panggero ioctl), proc (manajemén prosés), exec (peluncuran prosés) jeung id (manajemén hak aksés).

Aturan pikeun ngerjakeun telepon sistem ditetepkeun dina bentuk anotasi, kalebet daptar kelas telepon sistem anu diidinan sareng sakumpulan jalur file dimana aksés diidinan. Saatos ngawangun sareng ngaluncurkeun aplikasi anu dirobih, kernel nyandak alih padamelan ngawaskeun patuh kana aturan anu ditangtukeun.

Palaksanaan ikrar anu misah dikembangkeun pikeun FreeBSD, anu dibédakeun ku kamampuan pikeun ngasingkeun aplikasi tanpa ngarobih kodena, sedengkeun dina OpenBSD panggero ikrar ditujukeun pikeun integrasi anu ketat sareng lingkungan dasar sareng nambihan anotasi kana kode masing-masing. aplikasi.

Pamekar port ikrar pikeun Linux nyandak conto FreeBSD sareng, tinimbang ngadamel parobihan kana kode, nyiapkeun tambihan utiliti pledge.com anu ngamungkinkeun anjeun nerapkeun larangan tanpa ngarobih kode aplikasi. Contona, pikeun ngajalankeun utilitas curl kalawan aksés ngan ka kelas stdio, rpath, inet na threadstdio Sistim panggero, ngan ngajalankeun "./pledge.com -p 'stdio rpath inet thread' curl http://example.com".

Utilitas janji tiasa dianggo dina sadaya distribusi Linux dimimitian ku RHEL6 sareng henteu ngabutuhkeun aksés root. Salaku tambahan, dumasar kana perpustakaan kosmopolitan, API disayogikeun pikeun ngatur larangan dina kode program dina basa C, anu ngamungkinkeun, antara séjén, nyiptakeun enclaves pikeun ngawatesan aksés sacara selektif dina hubungan sareng fungsi aplikasi anu tangtu.

Palaksanaanna henteu meryogikeun parobihan kana kernel - larangan jangji ditarjamahkeun kana aturan SECCOMP BPF sareng diolah nganggo mékanisme isolasi panggero sistem Linux asli. Contona, jangji panggero ("stdio rpath", 0) bakal dirobah jadi BPF filter statik 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_ALLOW), /*L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L13*/ /* saringan salajengna */ };

sumber: opennet.ru

Tambahkeun komentar