ืคืจื•ื™ืงื˜ ืœื”ืขื‘ืจืช ืžื ื’ื ื•ืŸ ื‘ื™ื“ื•ื“ ื”ืžืฉื›ื•ืŸ ืœืœื™ื ื•ืงืก

ืžื—ื‘ืจ ืกืคืจื™ื™ืช Cosmopolitan standard C ื•ืคืœื˜ืคื•ืจืžืช Redbean ื”ื›ืจื™ื–ื” ืขืœ ื”ื˜ืžืขืช ืžื ื’ื ื•ืŸ ื”ื‘ื™ื“ื•ื“ pledge() ืขื‘ื•ืจ ืœื™ื ื•ืงืก. Pledge ืคื•ืชื— ื‘ืžืงื•ืจ ืขืœ ื™ื“ื™ ืคืจื•ื™ืงื˜ OpenBSD ื•ืžืืคืฉืจ ืœืš ืœืืกื•ืจ ื‘ืื•ืคืŸ ืกืœืงื˜ื™ื‘ื™ ืขืœ ื™ื™ืฉื•ืžื™ื ืœื’ืฉืช ืœืฉื™ื—ื•ืช ืžืขืจื›ืช ืฉืื™ื ืŸ ื‘ืฉื™ืžื•ืฉ (ื ื•ืฆืจืช ืžืขื™ืŸ ืจืฉื™ืžื” ืœื‘ื ื” ืฉืœ ืงืจื™ืื•ืช ืžืขืจื›ืช ืœืืคืœื™ืงืฆื™ื”, ื•ืฉื™ื—ื•ืช ืื—ืจื•ืช ืืกื•ืจื•ืช). ื‘ื ื™ื’ื•ื“ ืœืžื ื’ื ื•ื ื™ ื”ื’ื‘ืœืช ืฉื™ื—ื•ืช ื”ืžืขืจื›ืช ื”ื–ืžื™ื ื™ื ื‘ืœื™ื ื•ืงืก, ื›ื’ื•ืŸ seccomp, ืžื ื’ื ื•ืŸ ื”ื”ื‘ื˜ื—ื” ืชื•ื›ื ืŸ ื‘ืžืงื•ืจ ืœื”ื™ื•ืช ืคืฉื•ื˜ ื›ื›ืœ ื”ืืคืฉืจ.

ื”ื™ื•ื–ืžื” ื”ื›ื•ืฉืœืช ืœื‘ื•ื“ื“ ื™ื™ืฉื•ืžื™ื ื‘ืกื‘ื™ื‘ืช ื”ื‘ืกื™ืก ืฉืœ OpenBSD ื‘ืืžืฆืขื•ืช ืžื ื’ื ื•ืŸ ื”-systrace ื”ืจืืชื” ืฉื‘ื™ื“ื•ื“ ื‘ืจืžืช ืงืจื™ืื•ืช ืžืขืจื›ืช ื‘ื•ื“ื“ื•ืช ื”ื™ื” ืžื•ืจื›ื‘ ืžื“ื™ ื•ื’ื•ื–ืœ ื–ืžืŸ. ื›ื—ืœื•ืคื” ื”ื•ืฆืขื” ื”ืชื—ื™ื™ื‘ื•ืช ืฉืื™ืคืฉืจื” ืœื™ืฆื•ืจ ื›ืœืœื™ ื‘ื™ื“ื•ื“ ืžื‘ืœื™ ืœื”ื™ื›ื ืก ืœืคืจื˜ื™ื ื•ืœืชืžืจืŸ ืฉื™ืขื•ืจื™ ื’ื™ืฉื” ืžื•ื›ื ื™ื. ืœื“ื•ื’ืžื”, ื”ืžื—ืœืงื•ืช ื”ืžื•ืฆืขื•ืช ื”ืŸ stdio (ืงืœื˜/ืคืœื˜), rpath (ืงื‘ืฆื™ื ืœืงืจื™ืื” ื‘ืœื‘ื“), wpath (ื›ืชื™ื‘ืช ืงื‘ืฆื™ื), cpath (ื™ืฆื™ืจืช ืงื‘ืฆื™ื), tmppath (ืขื‘ื•ื“ื” ืขื ืงื‘ืฆื™ื ื–ืžื ื™ื™ื), inet (ืฉืงืขื™ ืจืฉืช), unix ( unix sockets), dns (ืจื–ื•ืœื•ืฆื™ื™ืช DNS), getpw (ื’ื™ืฉืช ืงืจื™ืื” ืœืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ ื”ืžืฉืชืžืฉ), ioctl (ืงืจื™ืื” ืœ-ioctl), proc (ื ื™ื”ื•ืœ ืชื”ืœื™ื›ื™ื), exec (ื”ืฉืงืช ืชื”ืœื™ืš) ื•-id (ื ื™ื”ื•ืœ ื–ื›ื•ื™ื•ืช ื’ื™ืฉื”).

ื›ืœืœื™ื ืœืขื‘ื•ื“ื” ืขื ืงืจื™ืื•ืช ืžืขืจื›ืช ืžืฆื•ื™ื ื™ื ื‘ืฆื•ืจื” ืฉืœ ื”ืขืจื•ืช, ื›ื•ืœืœ ืจืฉื™ืžื” ืฉืœ ืžื—ืœืงื•ืช ืžื•ืชืจื•ืช ืฉืœ ืงืจื™ืื•ืช ืžืขืจื›ืช ื•ืžืขืจืš ืฉืœ ื ืชื™ื‘ื™ ืงื‘ืฆื™ื ืฉื‘ื”ื ื”ื’ื™ืฉื” ืžื•ืชืจืช. ืœืื—ืจ ื‘ื ื™ื™ื” ื•ื”ืฉืงื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืฉื•ื ืชื”, ื”ืœื™ื‘ื” ืžืฉืชืœื˜ืช ืขืœ ืขื‘ื•ื“ืช ื”ืคื™ืงื•ื— ืขืœ ืขืžื™ื“ื” ื‘ื›ืœืœื™ื ืฉืฆื•ื™ื ื•.

ืคื•ืชื— ื™ื™ืฉื•ื ื ืคืจื“ ืฉืœ pledge ืœ-FreeBSD, ืืฉืจ ืžืชืืคื™ื™ืŸ ื‘ื™ื›ื•ืœืช ืœื‘ื•ื“ื“ ื™ื™ืฉื•ืžื™ื ืžื‘ืœื™ ืœื‘ืฆืข ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“ ืฉืœื”ื, ื‘ืขื•ื“ ื‘-OpenBSD ืงืจื™ืืช ื”-pledge ืžื›ื•ื•ื ืช ืœืื™ื ื˜ื’ืจืฆื™ื” ื”ื“ื•ืงื” ืขื ืกื‘ื™ื‘ืช ื”ื‘ืกื™ืก ื•ื”ื•ืกืคืช ื”ืขืจื•ืช ืœืงื•ื“ ืฉืœ ื›ืœ ืื—ื“ ืžื”ื. ื™ื™ืฉื•ื.

ื”ืžืคืชื—ื™ื ืฉืœ ื™ืฆื™ืืช ื”ื”ื‘ื˜ื—ื” ืœืœื™ื ื•ืงืก ืœืงื—ื• ืืช ื”ื“ื•ื’ืžื” ืฉืœ FreeBSD ื•ื‘ืžืงื•ื ืœื‘ืฆืข ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“, ื”ื›ื™ื ื• ืชื•ื›ื ื™ืช ืชื•ืกืฃ pledge.com ื”ืžืืคืฉืจืช ืœื”ื—ื™ืœ ื”ื’ื‘ืœื•ืช ืžื‘ืœื™ ืœืฉื ื•ืช ืืช ืงื•ื“ ื”ืืคืœื™ืงืฆื™ื”. ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช ื›ืœื™ ื”ืฉื™ืจื•ืช curl ืขื ื’ื™ืฉื” ืจืง ืœืžื—ืœืงื•ืช ื”ืงืจื™ืื” ืฉืœ ืžืขืจื›ืช stdio, rpath, inet ื•-threadstdio, ืคืฉื•ื˜ ื”ืคืขืœ ืืช "./pledge.com -p 'stdio rpath inet thread' curl http://example.com".

ื›ืœื™ ื”ืฉื™ืจื•ืช ื”-pledge ืคื•ืขืœ ืขืœ ื›ืœ ื”ื”ืคืฆื•ืช ืฉืœ ืœื™ื ื•ืงืก ื”ื—ืœ ืž-RHEL6 ื•ืื™ื ื• ื“ื•ืจืฉ ื’ื™ืฉืช ืฉื•ืจืฉ. ื‘ื ื•ืกืฃ, ื‘ื”ืชื‘ืกืก ืขืœ ื”ืกืคืจื™ื™ื” ื”ืงื•ืกืžื•ืคื•ืœื™ื˜ื™ืช, ืžืกื•ืคืง API ืœื ื™ื”ื•ืœ ื”ื’ื‘ืœื•ืช ื‘ืงื•ื“ ื”ืชื•ื›ื ื™ืช ื‘ืฉืคืช C, ื”ืžืืคืฉืจ, ื‘ื™ืŸ ื”ื™ืชืจ, ืœื™ืฆื•ืจ ืžื•ื‘ืœืขื•ืช ืœื”ื’ื‘ืœืช ื’ื™ืฉื” ืกืœืงื˜ื™ื‘ื™ืช ื‘ื™ื—ืก ืœืคื•ื ืงืฆื™ื•ืช ืžืกื•ื™ืžื•ืช ืฉืœ ืืคืœื™ืงืฆื™ื”.

ื”ื”ื˜ืžืขื” ืื™ื ื” ืžืฆืจื™ื›ื” ืฉื™ื ื•ื™ื™ื ื‘ืงืจื ืœ - ื”ื’ื‘ืœื•ืช ื”ื”ื‘ื˜ื—ื” ืžืชื•ืจื’ืžื•ืช ืœื›ืœืœื™ SECCOMP BPF ื•ืžืขื•ื‘ื“ื•ืช ื‘ืืžืฆืขื•ืช ืžื ื’ื ื•ืŸ ื‘ื™ื“ื•ื“ ื”ืฉื™ื—ื•ืช ื”ืžืงื•ืจื™ ืฉืœ ืžืขืจื›ืช ืœื™ื ื•ืงืก. ืœื“ื•ื’ืžื”, ื”-call pledge("stdio rpath", 0) ื™ื•ืžืจ ืœ-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_ANDALU | | 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_KREMT(BPF_ST,T | SECCOMP_RET_ALLOW), /*L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L13*/ /* ื”ืžืกื ืŸ ื”ื‘ื */ };

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”