Projekt na portování mechanismu izolace slibu na Linux

Autor standardní knihovny C Cosmopolitan a platformy Redbean oznámil implementaci mechanismu izolace pledge() pro Linux. Pledge byl původně vyvinut projektem OpenBSD a umožňuje selektivně zakázat aplikacím přístup k nepoužívaným systémovým voláním (pro aplikaci se tvoří jakýsi bílý seznam systémových volání a ostatní volání jsou zakázána). Na rozdíl od mechanismů omezení systémových volání dostupných v Linuxu, jako je seccomp, byl mechanismus zástavy původně navržen tak, aby byl co nejjednodušší.

Neúspěšná iniciativa izolovat aplikace v základním prostředí OpenBSD pomocí mechanismu systrace ukázala, že izolace na úrovni jednotlivých systémových volání je příliš složitá a časově náročná. Jako alternativa byla navržena zástava, která umožnila vytvořit pravidla izolace bez zacházení do detailů a manipulace s hotovými třídami přístupu. Nabízené třídy jsou například stdio (vstup/výstup), rpath (soubory pouze pro čtení), wpath (zápis souborů), cpath (vytváření souborů), tmppath (práce s dočasnými soubory), inet (síťové zásuvky), unix ( unix sockets), dns (rozlišení DNS), getpw (přístup pro čtení do databáze uživatelů), ioctl (volání ioctl), proc (správa procesů), exec (spouštění procesů) a id (správa přístupových práv).

Pravidla pro práci se systémovými voláními jsou specifikována ve formě anotací, včetně seznamu povolených tříd systémových volání a pole cest k souborům, kam je povolen přístup. Po sestavení a spuštění upravené aplikace přebírá jádro práce na sledování dodržování zadaných pravidel.

Pro FreeBSD se vyvíjí samostatná implementace pledge, která se vyznačuje schopností izolovat aplikace bez provádění změn v jejich kódu, zatímco v OpenBSD je volání pledge zaměřeno na úzkou integraci se základním prostředím a přidávání anotací do kódu každého z nich. aplikace.

Vývojáři portu pro zástavu pro Linux si vzali příklad z FreeBSD a místo změn v kódu připravili doplňkovou utilitu pledge.com, která umožňuje aplikovat omezení beze změny kódu aplikace. Chcete-li například spustit obslužný program curl s přístupem pouze ke třídám systémových volání stdio, rpath, inet a threadstdio, stačí spustit „./pledge.com -p 'stdio rpath inet thread' curl http://example.com“.

Nástroj zástavy funguje na všech distribucích Linuxu počínaje RHEL6 a nevyžaduje přístup root. Kromě toho je na základě kosmopolitní knihovny poskytováno API pro správu omezení v programovém kódu v jazyce C, což mimo jiné umožňuje vytvářet enklávy pro selektivní omezení přístupu ve vztahu k určitým funkcím aplikace.

Implementace nevyžaduje změny v jádře – omezení slibů jsou převedena do pravidel SECCOMP BPF a zpracována pomocí nativního mechanismu izolace systémových volání Linuxu. Například volání pledge("stdio rpath", 0) bude převedeno na BPF filtr 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(argumenty[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(argumenty[1])), /* L5*/ BPF_STMT(BPF_AND_ALU | BPF | 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(argumenty[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), /*PF_K, 12, 13, 14 - XNUMX), /*PF_LXNUMX*/ BPF_KSTMT | BPF_KSTMT | SECCOMP_RET_ALLOW), /*LXNUMX*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*LXNUMX*/ /* další filtr */ };

Zdroj: opennet.ru

Přidat komentář