Projekts ķīlas izolācijas mehānisma pārnešanai uz Linux

Cosmopolitan standarta C bibliotēkas un Redbean platformas autors ir paziņojis par ķīlas () izolācijas mehānisma ieviešanu Linux. Pledge sākotnēji izstrādāja OpenBSD projekts un ļauj selektīvi aizliegt lietojumprogrammām piekļūt neizmantotiem sistēmas izsaukumiem (aplikācijai tiek izveidots sava veida baltais sistēmas izsaukumu saraksts, un citi izsaukumi ir aizliegti). Atšķirībā no sistēmas izsaukuma piekļuves ierobežošanas mehānismiem, kas pieejami operētājsistēmā Linux, piemēram, seccomp, ieķīlāšanas mehānisms sākotnēji tika izstrādāts tā, lai tas būtu pēc iespējas vieglāk lietojams.

Neveiksmīgā iniciatīva izolēt lietojumprogrammas OpenBSD bāzes vidē, izmantojot systrace mehānismu, parādīja, ka izolēšana atsevišķu sistēmas izsaukumu līmenī bija pārāk sarežģīta un laikietilpīga. Kā alternatīva tika piedāvāta ķīla, kas ļāva izveidot izolācijas noteikumus, neiedziļinoties detaļās un manipulējot ar gatavām piekļuves klasēm. Piemēram, piedāvātās klases ir stdio (ievade/izvade), rpath (tikai lasāmi faili), wpath (failu rakstīšana), cpath (failu izveide), tmppath (darbs ar pagaidu failiem), inet (tīkla ligzdas), unix ( unix ligzdas), dns (DNS izšķirtspēja), getpw (lasīšanas piekļuve lietotāju datubāzei), ioctl (ioctl izsaukums), proc (procesu pārvaldība), exec (procesa palaišana) un id (piekļuves tiesību pārvaldība).

Noteikumi darbam ar sistēmas izsaukumiem ir norādīti anotāciju veidā, tostarp atļauto sistēmas izsaukumu klašu saraksts un failu ceļu masīvs, kur piekļuve ir atļauta. Pēc modificētās lietojumprogrammas izveides un palaišanas kodols pārņem norādīto noteikumu ievērošanas uzraudzību.

FreeBSD tiek izstrādāta atsevišķa ķīlas realizācija, kas izceļas ar spēju izolēt lietojumprogrammas, neveicot izmaiņas to kodā, savukārt OpenBSD ķīlas izsaukums ir vērsts uz ciešu integrāciju ar bāzes vidi un anotāciju pievienošanu katra kodam. pieteikumu.

Linux ķīlas porta izstrādātāji ņēma piemēru no FreeBSD un tā vietā, lai veiktu izmaiņas kodā, sagatavoja papildinājumu utilītu pledge.com, kas ļauj piemērot ierobežojumus, nemainot lietojumprogrammas kodu. Piemēram, lai palaistu curl utilītu ar piekļuvi tikai stdio, rpath, inet un threadstdio sistēmas izsaukuma klasēm, vienkārši palaidiet “./pledge.com -p 'stdio rpath inet thread' curl http://example.com”.

Ķīlas utilīta darbojas visos Linux izplatījumos, sākot ar RHEL6, un tai nav nepieciešama root piekļuve. Turklāt, pamatojoties uz kosmopolītisko bibliotēku, tiek nodrošināts API ierobežojumu pārvaldībai programmas kodā C valodā, kas cita starpā ļauj izveidot anklāvus selektīvai piekļuves ierobežošanai saistībā ar noteiktām lietojumprogrammu funkcijām.

Īstenošanai nav nepieciešamas izmaiņas kodolā - ķīlas ierobežojumi tiek tulkoti SECCOMP BPF noteikumos un apstrādāti, izmantojot vietējo Linux sistēmas zvanu izolācijas mehānismu. Piemēram, izsaukuma ķīla ("stdio rpath", 0) tiks pārveidota par BPF filtru statiskā 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_STMT(BPF_ALU) | 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(BPFK_STMT) SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* nākamais filtrs */ };

Avots: opennet.ru

Pievieno komentāru