Գրավի մեկուսացման մեխանիզմը Linux տեղափոխելու նախագիծ

Cosmopolitan standard C գրադարանի և Redbean պլատֆորմի հեղինակը հայտարարել է Linux-ի համար pledge() մեկուսացման մեխանիզմի ներդրման մասին։ Pledge-ն ի սկզբանե մշակվել է OpenBSD նախագծի կողմից և թույլ է տալիս ընտրողաբար արգելել հավելվածներին մուտք գործել չօգտագործված համակարգային զանգեր (հավելվածի համար ձևավորվում է համակարգային զանգերի մի տեսակ սպիտակ ցուցակ, իսկ այլ զանգերն արգելված են): Ի տարբերություն Linux-ում հասանելի համակարգային զանգերի սահմանափակման մեխանիզմների, ինչպիսին է seccomp-ը, գրավադրման մեխանիզմն ի սկզբանե նախատեսված էր հնարավորինս պարզ լինելու համար:

OpenBSD բազային միջավայրում հավելվածները systrace մեխանիզմի միջոցով մեկուսացնելու ձախողված նախաձեռնությունը ցույց տվեց, որ անհատական ​​համակարգային զանգերի մակարդակով մեկուսացումը չափազանց բարդ էր և ժամանակատար: Որպես այլընտրանք առաջարկվեց գրավ, որը հնարավորություն տվեց ստեղծել մեկուսացման կանոններ՝ առանց մանրամասների մեջ մտնելու և պատրաստի մուտքի դասերը շահարկելու։ Օրինակ՝ առաջարկվող դասերն են՝ stdio (մուտք/ելք), rpath (միայն կարդալու ֆայլեր), wpath (ֆայլեր գրել), cpath (ստեղծել ֆայլեր), tmppath (աշխատանք ժամանակավոր ֆայլերի հետ), inet (ցանցային վարդակներ), unix ( unix վարդակներ), dns (DNS լուծում), getpw (կարդալ մուտք դեպի օգտվողների տվյալների բազա), ioctl (ioctl զանգ), proc (գործընթացի կառավարում), exec (գործընթացի մեկնարկ) և id (մուտքի իրավունքների կառավարում):

Համակարգային զանգերի հետ աշխատելու կանոնները սահմանվում են անոտացիաների տեսքով, ներառյալ համակարգային զանգերի թույլատրելի դասերի ցանկը և ֆայլերի երթուղիների զանգվածը, որտեղ մուտքը թույլատրված է: Փոփոխված հավելվածը կառուցելուց և գործարկելուց հետո միջուկն իր վրա է վերցնում նշված կանոններին համապատասխանության մոնիտորինգի աշխատանքը:

FreeBSD-ի համար մշակվում է գրավի առանձին իրականացում, որն առանձնանում է հավելվածներն առանց դրանց կոդում փոփոխություններ կատարելու մեկուսացման ունակությամբ, մինչդեռ OpenBSD-ում գրավական զանգը նպատակաուղղված է բազային միջավայրի հետ սերտ ինտեգրմանը և յուրաքանչյուրի կոդին անոտացիա ավելացնելուն։ դիմումը.

Գրավային պորտի մշակողները Linux-ի համար վերցրեցին FreeBSD-ի օրինակը և կոդի մեջ փոփոխություններ կատարելու փոխարեն պատրաստեցին հավելում pledge.com, որը թույլ է տալիս սահմանափակումներ կիրառել՝ առանց հավելվածի կոդը փոխելու: Օրինակ՝ curl utility-ը գործարկելու համար միայն stdio, rpath, inet և threadstdio համակարգերի զանգերի դասեր մուտք գործելու համար պարզապես գործարկեք «./pledge.com -p 'stdio rpath inet thread' curl http://example.com»:

Գրավականը աշխատում է բոլոր Linux բաշխումների վրա՝ սկսած RHEL6-ից և չի պահանջում արմատային մուտք: Բացի այդ, հիմնվելով կոսմոպոլիտ գրադարանի վրա, տրամադրվում է API՝ C լեզվով ծրագրային կոդի սահմանափակումները կառավարելու համար, ինչը թույլ է տալիս, ի թիվս այլ բաների, ստեղծել անկլավներ՝ ընտրովիորեն սահմանափակելու մուտքը՝ կապված որոշակի հավելվածի գործառույթների հետ:

Իրականացումը միջուկում փոփոխություններ չի պահանջում. գրավադրման սահմանափակումները թարգմանվում են SECCOMP BPF կանոնների մեջ և մշակվում՝ օգտագործելով Linux համակարգի զանգերի մեկուսացման բնիկ մեխանիզմը: Օրինակ՝ կանչի գրավականը ("stdio rpath", 0) կվերածվի BPF ֆիլտրի ստատիկ կոնստ կառուցվածքի 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_K, ~0x80800), /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0), /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_2,) , /* L0*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[13])), /* L8*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 8, 2 - 9, 0), /*L12 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 0 - 10, 6), /*L12*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 11, 0, 11 - 17), /*PF_0 SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L11*/ /* հաջորդ զտիչը */ };

Source: opennet.ru

Добавить комментарий