Projekt för att porta mekanismen för pantisolering till Linux

Författaren till Cosmopolitan C-standardbiblioteket och Redbean-plattformen tillkännagav implementeringen av pledge()-isoleringsmekanismen för Linux. Löftet utvecklades ursprungligen av OpenBSD-projektet och låter dig selektivt förbjuda applikationer att komma åt oanvända systemanrop (en sorts vit lista över systemanrop bildas för applikationen, och andra anrop är förbjudna). Till skillnad från syscall-åtkomstkontrollmekanismerna som finns tillgängliga i Linux, såsom seccomp, är pantmekanismen designad från grunden för att vara så enkel att använda som möjligt.

Det misslyckade initiativet att isolera applikationer i OpenBSD-basmiljön med hjälp av systrace-mekanismen visade att isolering på nivån för individuella systemanrop är för komplicerat och tidskrävande. Som ett alternativ föreslogs ett löfte som gjorde det möjligt att skapa isoleringsregler utan att gå in på detaljer och manipulera färdiga åtkomstklasser. Till exempel är klasserna som erbjuds stdio (ingång/utgång), rpath (endast läser filer), wpath (skriver filer), cpath (skapar filer), tmppath (arbetar med temporära filer), inet (nätverkssockets), unix (unix). sockets), dns (DNS-upplösning), getpw (läsåtkomst till användardatabasen), ioctl (anrop ioctl), proc (processkontroll), exec (startprocesser) och id (behörighetskontroll).

Reglerna för att arbeta med systemanrop specificeras i form av anteckningar som inkluderar en lista över tillåtna systemanropsklasser och en uppsättning filsökvägar där åtkomst är tillåten. Efter att ha byggt och kört den modifierade applikationen tar kärnan över jobbet med att övervaka efterlevnaden av de angivna reglerna.

Separat utvecklas pledge-implementeringen för FreeBSD, som kännetecknas av möjligheten att isolera applikationer utan att göra ändringar i deras kod, medan i OpenBSD pledge-anropet syftar till tät integration med basmiljön och lägga till kommentarer till koden för varje Ansökan.

Utvecklarna av Linux port of pledge tog FreeBSD-exemplet och, istället för att göra ändringar i koden, förberedde de ett pledge.com-tilläggsverktyg som låter dig tillämpa begränsningar utan att ändra applikationskoden. Till exempel, för att köra curl-verktyget med endast åtkomst till stdio-, rpath-, inet- och threadstdio-systemanropsklasserna, kör bara "./pledge.com -p 'stdio rpath inet thread' curl http://example.com" .

Pledge-verktyget fungerar på alla Linux-distributioner sedan RHEL6 och kräver inte root-åtkomst. Dessutom, baserat på det kosmopolitiska biblioteket, tillhandahålls ett API för att hantera begränsningar i koden för program på C-språket, vilket bland annat gör det möjligt att skapa enklaver för att selektivt begränsa åtkomsten i förhållande till vissa applikationsfunktioner.

Implementeringen kräver inga ändringar av kärnan - pantbegränsningar översätts till SECCOMP BPF-regler och bearbetas med den inbyggda Linux-systemanropsisoleringsmekanismen. Till exempel kommer en call to pledge("stdio rpath", 0) att konverteras till en BPF-filter statisk konstruktion 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_KRET(BPF_KRET | , SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* nästa filter */ };

Källa: opennet.ru

Lägg en kommentar