Prosjekt for å overføre panteisolasjonsmekanismen til Linux

Forfatteren av Cosmopolitan standard C-biblioteket og Redbean-plattformen har annonsert implementeringen av pledge()-isolasjonsmekanismen for Linux. Pledge ble opprinnelig utviklet av OpenBSD-prosjektet og lar deg selektivt forby applikasjoner å få tilgang til ubrukte systemanrop (en slags hvitliste over systemanrop dannes for applikasjonen, og andre anrop er forbudt). I motsetning til systemanropsbegrensningsmekanismene tilgjengelig i Linux, for eksempel seccomp, ble pantemekanismen opprinnelig designet for å være så enkel som mulig.

Det mislykkede initiativet for å isolere applikasjoner i OpenBSD-basemiljøet ved å bruke systrace-mekanismen viste at isolering på nivået av individuelle systemanrop var for kompleks og tidkrevende. Som et alternativ ble det foreslått et løfte som gjorde det mulig å lage isolasjonsregler uten å gå i detaljer og manipulere ferdige tilgangsklasser. For eksempel er klassene som tilbys stdio (input/output), rpath (skrivebeskyttede filer), wpath (skrive filer), cpath (opprett filer), tmppath (arbeid med midlertidige filer), inet (nettverkssockets), unix ( unix-sockets), dns (DNS-oppløsning), getpw (lesetilgang til brukerdatabasen), ioctl (ioctl-kall), proc (prosessstyring), exec (prosessstart) og id (adgangsrettighetsbehandling).

Regler for arbeid med systemanrop er spesifisert i form av merknader, inkludert en liste over tillatte klasser av systemanrop og en rekke filbaner der tilgang er tillatt. Etter å ha bygget og lansert den modifiserte applikasjonen, overtar kjernen arbeidet med å overvåke overholdelse av de spesifiserte reglene.

En egen implementering av pant utvikles for FreeBSD, som utmerker seg ved evnen til å isolere applikasjoner uten å gjøre endringer i koden deres, mens i OpenBSD er pantesamtalen rettet mot tett integrasjon med basismiljøet og legge til merknader til koden til hver applikasjon.

Utviklerne av pledge-porten for Linux tok eksemplet med FreeBSD, og ​​i stedet for å gjøre endringer i koden, forberedte de et tilleggsverktøy pledge.com som lar deg bruke begrensninger uten å endre applikasjonskoden. For å kjøre curl-verktøyet med kun tilgang til stdio, rpath, inet og threadstdio systemanropsklassene, kjør "./pledge.com -p 'stdio rpath inet thread' curl http://example.com".

Pledge-verktøyet fungerer på alle Linux-distribusjoner som starter med RHEL6 og krever ikke root-tilgang. I tillegg, basert på det kosmopolitiske biblioteket, er det gitt en API for å administrere restriksjoner i programkode på C-språket, som blant annet gjør det mulig å lage enklaver for selektivt å begrense tilgang i forhold til visse applikasjonsfunksjoner.

Implementeringen krever ikke endringer i kjernen - pantsettelsesbegrensninger oversettes til SECCOMP BPF-regler og behandles ved hjelp av den opprinnelige Linux-systemanropsisolasjonsmekanismen. For eksempel vil call pledge("stdio rpath", 0) bli konvertert til en BPF-filter statisk konstruksjon 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_ALU | | 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 , /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[8])), /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 9, 0 - 12, 10), /*L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 6 - 12, 11), /*L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 11, 17, 0 - 13), /*L11*/ BPF_KREMT(BPF_KREMT | SECCOMP_RET_ALLOW), /*L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L13*/ /* neste filter */ };

Kilde: opennet.ru

Legg til en kommentar