ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° прСнасянС Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° обСщания към Linux

ΠΠ²Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° стандартната C Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° Cosmopolitan ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Redbean обяви внСдряванСто Π½Π° изолационния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ pledge() Π·Π° Linux. Pledge ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° OpenBSD ΠΈ Π²ΠΈ позволява сСлСктивно Π΄Π° забраняватС Π½Π° прилоТСнията Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π½Π΅ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ систСмни повиквания (Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° сС Π²ΠΈΠ΄ бял списък със систСмни повиквания Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π° Π΄Ρ€ΡƒΠ³ΠΈ повиквания са Π·Π°Π±Ρ€Π°Π½Π΅Π½ΠΈ). Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈΡ‚Π΅ Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° систСмнитС повиквания, Π½Π°Π»ΠΈΡ‡Π½ΠΈ Π² Linux, ΠΊΠ°Ρ‚ΠΎ seccomp, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡŠΡ‚ Π·Π° ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½ Π΄Π° бъдС възмоТно Π½Π°ΠΉ-прост.

ΠΠ΅ΡƒΡΠΏΠ΅ΡˆΠ½Π°Ρ‚Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π° Π·Π° ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° прилоТСния Π² Π±Π°Π·ΠΎΠ²Π°Ρ‚Π° срСда Π½Π° OpenBSD с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° systrace ΠΏΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½ΠΈΠ²ΠΎ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ систСмни повиквания Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅ слоТно ΠΈ ΠΎΡ‚Π½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅. ΠšΠ°Ρ‚ΠΎ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° бСшС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π·Π°Π»ΠΎΠ³, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ възмоТно ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° изолация, Π±Π΅Π· Π΄Π° сС Π½Π°Π²Π»ΠΈΠ·Π° Π² подробности ΠΈ Π΄Π° сС ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Ρ‚ Π³ΠΎΡ‚ΠΎΠ²ΠΈ класовС Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ. НапримСр ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π½ΠΈΡ‚Π΅ класовС са stdio (Π²Ρ…ΠΎΠ΄/ΠΈΠ·Ρ…ΠΎΠ΄), rpath (Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ само Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅), wpath (запис Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅), cpath (създаванС Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅), tmppath (Ρ€Π°Π±ΠΎΡ‚Π° с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅), inet (ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ сокСти), unix ( unix sockets), dns (DNS Ρ€Π΅Π·ΠΎΠ»ΡŽΡ†ΠΈΡ), getpw (Π΄ΠΎΡΡ‚ΡŠΠΏ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π΄ΠΎ потрСбитСлската Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ), ioctl (ioctl ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅), proc (ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° процСси), exec (стартиранС Π½Π° процСси) ΠΈ id (ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€Π°Π²Π°Ρ‚Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ).

ΠŸΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° със систСмни повиквания са посочСни ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ списък с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈ класовС систСмни повиквания ΠΈ масив ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ ΠΏΡŠΡ‚ΠΈΡ‰Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΄ΠΎΡΡ‚ΡŠΠΏΡŠΡ‚ Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½. Π‘Π»Π΅Π΄ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ ΠΈ стартиранСто Π½Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ядрото ΠΏΠΎΠ΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° ΠΏΠΎ Π½Π°Π±Π»ΡŽΠ΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ с посочСнитС ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π—Π° FreeBSD сС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π° ΠΎΡ‚Π΄Π΅Π»Π½Π° рСализация Π½Π° pledge, която сС ΠΎΡ‚Π»ΠΈΡ‡Π°Π²Π° с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° прилоТСния, Π±Π΅Π· Π΄Π° сС правят ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² тСхния ΠΊΠΎΠ΄, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π² OpenBSD ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° pledge Π΅ насочСно към тясна интСграция с Π±Π°Π·ΠΎΠ²Π°Ρ‚Π° срСда ΠΈ добавянС Π½Π° Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ към ΠΊΠΎΠ΄Π° Π½Π° всяко ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΡ€Ρ‚Π° Π·Π° ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ Π·Π° Linux Π²Π·Π΅Ρ…Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° FreeBSD ΠΈ вмСсто Π΄Π° правят ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΡ…Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° ΠΏΠΎΠΌΠΎΡ‰Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° pledge.com, която Π²ΠΈ позволява Π΄Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚Π΅ ограничСния, Π±Π΅Π· Π΄Π° промСнятС ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. НапримСр, Π·Π° Π΄Π° стартиратС ΠΏΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° curl с Π΄ΠΎΡΡ‚ΡŠΠΏ само Π΄ΠΎ класовСтС Π·Π° систСмни повиквания stdio, rpath, inet ΠΈ threadstdio, просто стартирайтС β€ž./pledge.com -p β€˜stdio rpath inet thread’ curl http://example.com”.

ΠŸΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° всички Linux дистрибуции, Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‰ΠΈ с RHEL6 ΠΈ Π½Π΅ изисква root Π΄ΠΎΡΡ‚ΡŠΠΏ. ОсвСн Ρ‚ΠΎΠ²Π°, Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° космополитната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π΅ прСдоставСн API Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ограничСнията Π² програмния ΠΊΠΎΠ΄ Π½Π° Π΅Π·ΠΈΠΊΠ° C, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява, Π½Π°Ρ€Π΅Π΄ с Π΄Ρ€ΡƒΠ³ΠΈ Π½Π΅Ρ‰Π°, Π΄Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ Π°Π½ΠΊΠ»Π°Π²ΠΈ Π·Π° сСлСктивно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ.

ВнСдряванСто Π½Π΅ изисква ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² ядрото - ограничСнията Π½Π° обСщанията сС ΠΏΡ€Π΅Π²Π΅ΠΆΠ΄Π°Ρ‚ Π² SECCOMP BPF ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° собствСния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° систСмни повиквания Π½Π° Linux. НапримСр ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ("stdio rpath", 0) Ρ‰Π΅ бъдС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½ΠΎ Π² 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_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 - 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_RET | BPF_K, SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* слСдващ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ */ };

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€