ΠΠ²ΡΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π‘ΠΈ-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Cosmopolitan ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Redbean ΠΎΠ±ΡΡΠ²ΠΈΠ» ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ pledge() Π΄Π»Ρ Linux. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ pledge ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ OpenBSD ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ±ΠΎΡΠΎΡΠ½ΠΎ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²Π°ΠΌ (Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π±Π΅Π»ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ², Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ Π·Π°ΠΏΡΠ΅ΡΠ°ΡΡΡΡ). Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π² Linux ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²Π°ΠΌ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ seccomp, ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ pledge ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ Ρ ΠΎΠ³Π»ΡΠ΄ΠΊΠΎΠΉ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ.
ΠΠ°Π²Π΅ΡΡΠΈΠ²ΡΠ°ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π° ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ OpenBSD Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° systrace ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, ΡΡΠΎ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½Π° ΠΈ ΡΡΡΠ΄ΠΎΡΠΌΠΊΠ°. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ Π±ΡΠ» ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ pledge, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ» ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ Π½Π΅ Π²Π½ΠΈΠΊΠ°Ρ Π² Π΄Π΅ΡΠ°Π»ΠΈ ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡΡΡ ΠΊΠ»Π°ΡΡΡ stdio (Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄), rpath (ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²), wpath (Π·Π°ΠΏΠΈΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²), cpath (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²), tmppath (ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ), inet (ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ), unix (unix-ΡΠΎΠΊΠ΅ΡΡ), dns (ΡΠ΅Π·ΠΎΠ»Π²ΠΈΠ½Π³ Π² DNS), getpw (Π΄ΠΎΡΡΡΠΏ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ), ioctl (Π²ΡΠ·ΠΎΠ² ioctl), proc (ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ), exec (Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²) ΠΈ id (ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²Π°ΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ°).
ΠΡΠ°Π²ΠΈΠ»Π° ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ Π·Π°Π΄Π°ΡΡΡΡ Π² ΡΠΎΡΠΌΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ, Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈ ΠΌΠ°ΡΡΠΈΠ² ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΠΏΡΡΠ΅ΠΉ, ΠΊΡΠ΄Π° ΡΠ°Π·ΡΠ΅ΡΡΠ½ Π΄ΠΎΡΡΡΠΏ. ΠΠΎΡΠ»Π΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ Π·Π°ΠΏΡΡΠΊΠ° ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ΄ΡΠΎ Π±Π΅ΡΡΡ Π½Π° ΡΠ΅Π±Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ Π·Π°Π΄Π°Π½Π½ΡΡ ΠΏΡΠ°Π²ΠΈΠ».
ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ pledge Π΄Π»Ρ FreeBSD, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±Π΅Π· Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΈΡ ΠΊΠΎΠ΄, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π² OpenBSD Π²ΡΠ·ΠΎΠ² pledge Π½Π°ΡΠ΅Π»Π΅Π½ Π½Π° ΡΠ΅ΡΠ½ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Π±Π°Π·ΠΎΠ²ΡΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ Π² ΠΊΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΠΎΡΡΠ° pledge Π΄Π»Ρ Linux Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ FreeBSD ΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠ»ΠΈ ΡΡΠΈΠ»ΠΈΡΡ-Π½Π°Π΄ΡΡΡΠΎΠΉΠΊΡ pledge.com, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΡΠΈΠ»ΠΈΡΡ curl Ρ ΠΎΡΠΊΡΡΡΠΈΡΠΌ Π΄ΠΎΡΡΡΠΏΠ° ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΠΊΠ»Π°ΡΡΠ°ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² stdio, rpath, inet ΠΈ threadstdio Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ «./pledge.com -p ‘stdio rpath inet thread’ curl http://example.com».
Π£ΡΠΈΠ»ΠΈΡΠ° pledge ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²ΠΎ Π²ΡΠ΅Ρ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π°Ρ Linux, Π½Π°ΡΠΈΠ½Π°Ρ Ρ RHEL6, ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ root-Π΄ΠΎΡΡΡΠΏΠ°. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π° Π±Π°Π·Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ cosmopolitan ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ API Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π½Π° ΡΠ·ΡΠΊΠ΅ Π‘ΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π°Π½ΠΊΠ»Π°Π²Ρ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° Π² ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ΅ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ΄ΡΠΎ — ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ pledge ΡΡΠ°Π½ΡΠ»ΠΈΡΡΡΡΡΡ Π² ΠΏΡΠ°Π²ΠΈΠ»Π° SECCOMP BPF ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄Π»Ρ Linux ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠ·ΠΎΠ² pledge(«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*/ /* next filter */ };
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru