Autor standardní C knihovny Cosmopolitan a platformy Redbean oznámil implementaci mechanismu izolace pledge() pro Linux. Původně byl pledge 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 vytváří jakési bílé seznam systémových volání, zatímco ostatní volání jsou zakázána). Na rozdíl od dostupných mechanismů v Linuxu, jako je seccomp, byl mechanismus pledge původně navržen s cílem co nejvíce usnadnit použití.
Neúspěšná iniciativa izolace aplikací základního 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 zdlouhavá. Jako alternativu byl navržen pledge, který umožňoval vytváření pravidel izolace bez potřeby detailního ponoření do problematiky a manipulací s hotovými třídami přístupu. Například jsou navrhovány třídy stdio (vstup/výstup), rpath (pouze čtení souborů), wpath (zápis souborů), cpath (vytváření souborů), tmppath (práce s dočasnými soubory), inet (síťové sokety), unix (unixové sokety), dns (rezolvování v DNS), getpw (čtení ze skupiny 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 definována ve formě anotací, které zahrnují seznam povolených tříd systémových volání a pole cest k souborům, k nimž je povolen přístup. Po sestavení a spuštění modifikované aplikace si jádro bere na starost kontrolu dodržování stanovených pravidel.
Separátně se vyvíjí implementace pledge pro FreeBSD, která se liší možností izolace aplikací bez nutnosti zasahovat do 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ání anotací do kódu každé aplikace.
Vývojáři portu pledge pro Linux se inspirovali příkladem FreeBSD a místo úprav v kódu připravili utility-rozhraní pledge.com, které umožňuje aplikovat omezení bez změny kódu aplikace. Například pro spuštění utility curl s otevřením přístupu pouze k třídám systémových volání stdio, rpath, inet a threadstdio stačí provést '.\/pledge.com -p 'stdio rpath inet thread' curl http:\/\/example.com'.
Nástroj pledge funguje na všech distribucích Linuxu od RHEL6 a nevyžaduje root přístup. Navíc je k dispozici API pro správu omezení v kódu programů napsaných v jazyce C, postavené na knihovně cosmopolitan, což umožňuje vytvářet enclave pro selektivní omezení přístupu v rámci určitých funkcí aplikace.
Implementace nevyžaduje změny v jádru — omezení pledge se překládají do pravidel SECCOMP BPF a zpracovávají pomocí nativního mechanismu Linuxu pro izolaci systémových volání. 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(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*/ /* next filter */ };
Zdroj: opennet.ru
