Autor štandardnej C knižnice Cosmopolitan a platformy Redbean oznámil zavedenie mechanizmu izolácie pledge() pre Linux. Pôvodne bol pledge vyvinutý projektom OpenBSD a umožňuje selektívne zakázať aplikáciám prístup k nepoužívaným systémovým volaniam (pre aplikáciu sa vytvorí niečo ako biely zoznam systémových volaní, pričom ostatné volania sú zakázané). Na rozdiel od dostupných v Linuxe mechanizmov obmedzenia prístupu k systémovým volaniam, ako je seccomp, bol mechanizmus pledge pôvodne navrhnutý s dôrazom na maximálne zjednodušenie aplikácie.
Neúspešná iniciatíva izolácie aplikácií základného prostredia OpenBSD pomocou mechanizmu systrace ukázala, že izolácia na úrovni jednotlivých systémových volaní je príliš zložitá a zdĺhavá. Ako alternatíva bol navrhnutý pledge, ktorý umožňoval vytvárať pravidlá izolácie bez podrobného skúmania a manipulovaním s hotovými triedami prístupu. Napríklad sa ponúkajú triedy stdio (vstup/výstup), rpath (len čítanie súborov), wpath (zápis súborov), cpath (vytváranie súborov), tmppath (práca s dočasnými súbormi), inet (sieťové sokety), unix (unixové sokety), dns (rezolvovanie v DNS), getpw (čitelný prístup k databáze používateľov), ioctl (volanie ioctl), proc (správa procesov), exec (spustenie procesov) a id (správa prístupových práv).
Pravidlá na prácu so systémovými volaniami sú stanovené formou anotácií, ktoré obsahujú zoznam povolených tried systémových volaní a pole súborových ciest, kam je povolený prístup. Po zostavení a spustení modifikovanej aplikácie preberá jadro kontrolu dodržiavania stanovených pravidiel.
Samostatne sa vyvíja implementácia pledge pre FreeBSD, ktorá sa líši možnosťou izolácie aplikácií bez potreby zmien v ich kóde, zatiaľ čo v OpenBSD je volanie pledge zamerané na úzku integráciu so základným prostredím a pridanie anotácií do kódu každej aplikácie.
Vývojári portu pledge pre Linux využili príklad FreeBSD a namiesto úprav v kóde pripravili utilitu-rozšírenie pledge.com, ktorá umožňuje uplatniť obmedzenia bez zmien v kóde aplikácie. Napríklad na spustenie utility curl s otvorením prístupu iba k triedam systémových volaní stdio, rpath, inet a threadstdio stačí vykonať „./pledge.com -p ‘stdio rpath inet thread’ curl http://example.com“.
Nástroj pledge funguje vo všetkých distribúciách Linuxu, počínajúc RHEL6, a nevyžaduje root prístup. Okrem toho sa na základe knižnice cosmopolitan poskytuje API na spravovanie obmedzení v kóde programov napísaných v jazyku C, umožňujúce vytvárať enklávy na selektívne obmedzenie prístupu viazaného na určité funkcie aplikácie.
Realizácia nevyžaduje zmeny v jadre — obmedzenia pledge sú pretransformované do pravidiel SECCOMP BPF a spracovávané pomocou natívneho mechanizmu Linuxu na izoláciu systémových volaní. Napríklad, volanie pledge("stdio rpath", 0) bude prevedené na BPF-filter 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
