Forfatteren af standard C-biblioteket Cosmopolitan og platformen Redbean har annonceret implementeringen af pledge()-isoleringsmekanismen til Linux. Oprindeligt blev pledge udviklet af OpenBSD-projektet og gør det muligt selektivt at forhindre applikationer i at tilgå unødvendige systemopkald (dvs. der dannes en form for hvidliste over systemopkald for applikationen, og andre opkald forbydes). I modsætning til de tilgængelige mekanismer i Linux til begrænsning af adgangen til systemopkald, såsom seccomp, er pledge-mekanismen oprindeligt udviklet med fokus på at forenkle anvendelsen.
Den mislykkede initiativ til at isolere grundlæggende OpenBSD-applikationer ved hjælp af systrace-mekanismen har vist, at isolering på niveau med individuelle systemopkald er for kompleks og arbejdskrævende. Som alternativ blev pledge foreslået, som gjorde det muligt at skabe isoleringsregler uden at dykke ned i detaljerne og ved at manipulere med færdige adgangsklasser. For eksempel tilbydes klasserne stdio (input/output), rpath (kun læse filer), wpath (skrive filer), cpath (oprette filer), tmppath (arbejde med midlertidige filer), inet (netværkssockets), unix (unix-sockets), dns (DNS-opløsning), getpw (læse adgang til brugerbasen), ioctl (kald af ioctl), proc (processtyring), exec (start af processer) og id (adgangsrettighedshåndtering).
Reglerne for arbejde med systemopkald angives i form af annotationer, der inkluderer en liste over tilladte klasser af systemopkald og et array af filbaner, hvor adgang er tilladt. Efter at det modificerede program er samlet og kørt, tager kernen sig af arbejdet med at overvåge overholdelsen af de angivne regler.
En separat implementering af pledge til FreeBSD er under udvikling, som adskiller sig ved muligheden for at isolere applikationer uden at ændre deres kode, mens pledge-opkaldet i OpenBSD er rettet mod tæt integration med det grundlæggende miljø og tilføjelse af annotationer til koden for hver applikation.
Udviklerne af pledge-porten til Linux har taget inspiration fra FreeBSD og har i stedet for at ændre koden forberedt et tillægsprogram, pledge.com, der gør det muligt at anvende begrænsninger uden at ændre applikationskoden. For eksempel, for at køre curl med adgang kun til klasserne for systemopkald stdio, rpath, inet og thread, er det tilstrækkeligt at udføre "./pledge.com -p 'stdio rpath inet thread' curl http://example.com".
Pledge-værktøjet fungerer på alle Linux-distributioner fra RHEL6 og kræver ikke root-adgang. Desuden leverer API'et baseret på cosmopolitan-biblioteket funktioner til at styre begrænsninger i C-programkoden, hvilket også muliggør oprettelsen af enclaves til selektiv begrænsning af adgang i forbindelse med specifikke funktioner i applikationen.
Implementeringen kræver ikke ændringer i kernen — pledge-begrænsninger oversættes til SECCOMP BPF-regler og behandles ved hjælp af det native Linux-system kald isolationsmekanisme. For eksempel vil kaldet pledge("stdio rpath", 0) blive konverteret til 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 */ };
Kilde: opennet.ru
