For nylig annoncerede forfatteren af Cosmopolitan C-standardbiblioteket og Redbean-platformen implementeringen af pledge()-isoleringsmekanismen til Linux.
Pledge, der oprindeligt blev udviklet af OpenBSD-projektet , giver dig mulighed for selektivt at forhindre applikationer i at få adgang til ubrugte systemkald (oprettelse af en hvidliste over systemkald for applikationen og forbud mod andre kald). I modsætning til syscall-adgangskontrolmekanismer, der er tilgængelige i Linux, såsom seccomp, er pledge designet fra bunden til at være så brugervenlig som muligt.
Det mislykkede initiativ til at isolere applikationer i OpenBSD-basemiljøet ved hjælp af systrace-mekanismen viste, at isolering på niveauet af individuelle systemkald er for kompliceret og tidskrævende.
Alternativt blev der foreslået pledge, som tillod oprettelse af isolationsregler uden at gå i detaljer og manipulere med forberedte adgangsklasser.
For eksempel tilbydes klasser stdio (input/output), rpath (skrivebeskyttet filer), wpath (skrive filer), cpath (opret filer), tmppath (arbejde med midlertidige filer), inet (sockets netværk), unix (unix sockets). ), dns (DNS-opløsning), getpw (læseadgang til brugerdatabase), ioctl (ioctl-kald), proc (proceskontrol), exec (startprocesser) og id (tilladelseskontrol).
Reglerne for at arbejde med systemkald er specificeret i form af annotationer, der inkluderer en liste over tilladte systemkaldsklasser og en række filstier, hvor adgang er tilladt. Efter kompilering og kørsel af den modificerede applikation overtager kernen opgaven med at overvåge overholdelsen af de angivne regler.
Separat udvikles pledge-implementeringen til FreeBSD, som er kendetegnet ved evnen til at isolere applikationer uden at foretage ændringer i deres kode, mens pantsætningen i OpenBSD er rettet mod tæt integration med basismiljøet og tilføjelse af annotationer til koden af hver enkelt.
Pledge er som den forbudte frugt, vi alle begærer, når chefen siger, at vi skal bruge ting som Linux. Hvorfor betyder det noget? Det er fordi pantet() faktisk gør sikkerheden forståelig. Linux har aldrig rigtig haft et lag af sikkerhed, som blot dødelige kan forstå.
Udviklerne af Linux pledge-porten fulgte FreeBSDs eksempel , og i stedet for at foretage kodeændringer, udarbejdede de et ekstra værktøj fra pledge.com, der giver dig mulighed for at anvende begrænsninger uden at ændre din applikationskode. For eksempel, for at køre curl-værktøjet med adgang kun til systemkaldsklasserne stdio, rpath, inet og threadstdio, skal du blot køre `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.
Værktøjet fungerer på alle Linux-distributioner fra RHEL6 og fremefter og kræver ikke root-adgang. Derudover er der, baseret på Cosmopolitan-biblioteket, en API til håndtering af begrænsninger i C-programkode, hvilket blandt andet muliggør oprettelse af enklaver for selektivt at begrænse adgangen til specifikke applikationsfunktioner.
Der har tidligere været et par udviklere, der har prøvet dette. Jeg vil ikke nævne navne, for de fleste af disse projekter blev aldrig afsluttet. Når det kommer til SECOMP, forklarer online tutorials kun, hvordan man hvidlister systemopkald, så de fleste mennesker mister interessen, før de finder ud af, hvordan man filtrerer argumenter. De projekter, der rykkede frem, havde også forglemmelser som at tillade setuid/setgid/sticky bits at blive ændret. Derfor bør ingen af de nuværende alternativer anvendes. Jeg tror, at denne indsats bringer os meget tættere på at have løfte() end nogensinde før.
Implementering kræver ingen kerneændringer: hjælpeprogrambegrænsninger oversættes til SECCOMP BPF-regler og behandles ved hjælp af Linuxs oprindelige systemopkaldsisoleringsmekanisme. For eksempel vil kald af løfte("stdio rpath", 0) konvertere til et BPF-filter
Endelig, hvis du er interesseret i at lære mere, kan du finde detaljerne på følgende link.