Cosmopolitan стандартты C кітапханасының және Redbean платформасының авторы pledge() оқшаулау механизмін іске асыруды жариялады LinuxPledge бастапқыда OpenBSD жобасымен жасалған және қолданбаларға пайдаланылмаған жүйелік қоңырауларды таңдамалы түрде тыйым салуға мүмкіндік береді (қолданба үшін жүйелік қоңыраулардың ақ тізімі жасалады, ал қалған қоңырауларға тыйым салынады). Қолжетімді қоңыраулардан айырмашылығы Linux seccomp сияқты жүйелік шақыруларға кіруді шектеу механизмдерінен айырмашылығы, кепілдік механизмі бастапқыда пайдаланудың максималды қарапайымдылығын ескере отырып жасалған.
systrace механизмін пайдалана отырып, OpenBSD базалық ортасында қолданбаларды оқшаулаудың сәтсіз бастамасы жеке жүйелік шақырулар деңгейінде оқшаулау тым күрделі және уақытты қажет ететінін көрсетті. Балама ретінде, егжей-тегжейлерге бармай және дайын кіру сыныптарын манипуляциялаусыз оқшаулау ережелерін жасауға мүмкіндік беретін кепіл ұсынылды. Мысалы, ұсынылатын сыныптар: stdio (енгізу/шығару), rpath (тек оқуға арналған файлдар), wpath (файлдарды жазу), cpath (файлдарды жасау), tmppath (уақытша файлдармен жұмыс), inet (желі ұялары), unix ( unix розеткалары), dns (DNS ажыратымдылығы), getpw (пайдаланушы дерекқорына оқуға рұқсат), ioctl (ioctl қоңырауы), proc (процесті басқару), exec (процесті іске қосу) және id (қол жеткізу құқықтарын басқару).
Жүйелік қоңыраулармен жұмыс істеу ережелері аннотациялар түрінде, оның ішінде жүйелік шақырулардың рұқсат етілген сыныптарының тізімі және қол жеткізуге рұқсат етілген файл жолдарының массиві көрсетілген. Өзгертілген қолданбаны құрастырып, іске қосқаннан кейін ядро көрсетілген ережелердің сақталуын бақылау жұмысын алады.
FreeBSD үшін кепілдің жеке іске асырылуы әзірленуде, ол қолданбаларды кодтарына өзгерістер енгізбей оқшаулау мүмкіндігімен ерекшеленеді, ал OpenBSD-де кепілге шақыру базалық ортамен тығыз интеграцияға және әрбір кодқа аннотациялар қосуға бағытталған. қолданба.
Кепіл портының әзірлеушілері Linux Біз FreeBSD мысалын қолдандық және кодқа өзгерістер енгізудің орнына, қолданба кодын өзгертпей шектеулерді қолдануға мүмкіндік беретін plodge.com қосымша утилитасын жасадық. Мысалы, curl утилитасын stdio, rpath, inet және threadstdio жүйелік шақыру кластарымен шектелген қатынаумен іске қосу үшін жай ғана "./pledge.com -p 'stdio rpath inet thread' curl http://example.com" пәрменін орындаңыз.
Кепілдік утилитасы барлық дистрибутивтерде жұмыс істейді. Linux, RHEL6-дан бастап және түбірлік қатынауды қажет етпейді. Сонымен қатар, cosmopolitan кітапханасы C тіліндегі кодтағы шектеулерді басқаруға арналған API ұсынады, бұл басқа нәрселермен қатар, нақты қолданба функцияларына негізделген қатынауды таңдамалы түрде шектеуге арналған анклавтарды жасауға мүмкіндік береді.
Іске асыру негізгі бөлікке ешқандай өзгерістер енгізуді қажет етпейді - кепілдік шектеулері 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
