Kapacitetsbaserad säkerhet - Capability-based security
Kapacitetsbaserad säkerhet är ett koncept i utformningen av säkra datorsystem , en av de befintliga säkerhetsmodellerna . En kapacitet (känd i vissa system som en nyckel ) är en smittsam, förfalsk token av auktoritet. Det hänvisar till ett värde som refererar till ett objekt tillsammans med en associerad uppsättning åtkomsträttigheter . En användare program på en kapacitet-baserat operativsystem måste använda en förmåga att få tillgång till ett objekt. Kapacitetsbaserad säkerhet avser principen för att utforma användarprogram så att de direkt delar kapacitet med varandra enligt principen om minst privilegium och till operativsystemets infrastruktur som är nödvändig för att göra sådana transaktioner effektiva och säkra. Kapacitetsbaserad säkerhet ska kontrasteras med ett tillvägagångssätt som använder hierarkiska skyddsområden .
Även om de flesta operativsystem implementerar en anläggning som liknar funktioner, ger de vanligtvis inte tillräckligt med stöd för att möjliggöra utbyte av funktioner mellan möjligen ömsesidigt otillförlitliga enheter som det primära sättet att bevilja och distribuera åtkomsträttigheter i hela systemet. Ett kapacitetsbaserat system, däremot, är utformat med det målet i åtanke.
Funktioner som diskuteras i denna artikel bör inte förväxlas med POSIX 1e/2c " Capabilities ". De senare är grovkorniga privilegier som inte kan överföras mellan processer.
Introduktion
Funktioner uppnår sitt mål att förbättra systemsäkerheten genom att användas i stället för förlåtliga referenser . En glömbar referens (till exempel ett söknamn ) identifierar ett objekt, men specificerar inte vilka åtkomsträttigheter som är lämpliga för det objektet och det användarprogram som innehåller den referensen. Följaktligen måste alla försök att komma åt det refererade objektet valideras av operativsystemet, baserat på den omgivande myndigheten för det begärande programmet, vanligtvis via användning av en åtkomstkontrollista (ACL). I stället, i ett system med funktioner, ger bara det faktum att ett användarprogram besitter den förmågan det att använda det refererade objektet i enlighet med de rättigheter som specificeras av den funktionen. I teorin tar ett system med funktioner bort behovet av åtkomstkontrollista eller liknande mekanism genom att ge alla enheter alla och bara de funktioner de faktiskt behöver.
En förmåga implementeras vanligtvis som en privilegierad datastruktur som består av en sektion som anger åtkomsträttigheter och en sektion som unikt identifierar objektet som ska nås. Användaren får inte tillgång till datastrukturen eller objektet direkt, utan istället via ett handtag . I praktiken används den ungefär som en filbeskrivning i ett traditionellt operativsystem (ett traditionellt handtag), men för att komma åt alla objekt i systemet. Funktioner lagras vanligtvis av operativsystemet i en lista, med någon mekanism på plats för att förhindra att programmet direkt ändrar innehållet i funktionen (för att förfalska åtkomsträttigheter eller ändra objektet det pekar på). Vissa system har också baserats på kapacitetsbaserad adressering (maskinvarustöd för funktioner), till exempel Plessey System 250 .
Program som har funktioner kan utföra funktioner på dem, till exempel att vidarebefordra dem till andra program, konvertera dem till en mindre privilegierad version eller radera dem. Operativsystemet måste se till att endast specifika operationer kan ske för funktionerna i systemet för att säkerställa integriteten i säkerhetspolicyn.
Exempel
En förmåga definieras som en skyddad objektreferens som, i kraft av dess innehav av en användarprocess, ger den processen förmågan (därav namnet) att interagera med ett objekt på vissa sätt. Dessa sätt kan innefatta läsning av data associerade med ett objekt, modifiering av objektet, körning av data i objektet som en process och andra tänkbara åtkomsträttigheter. Kapaciteten består logiskt av en referens som unikt identifierar ett visst objekt och en uppsättning av en eller flera av dessa rättigheter.
Antag att det finns följande sträng i en användarprocess minne:
/etc/passwd
Även om detta identifierar ett unikt objekt i systemet, specificerar det inte åtkomsträttigheter och är därför inte en funktion. Antag att det istället finns följande två värden:
/etc/passwd O_RDWR
Detta identifierar ett objekt tillsammans med en uppsättning åtkomsträttigheter. Det är dock fortfarande inte en förmåga eftersom användarprocessens innehav av dessa värden inte säger något om huruvida den åtkomsten faktiskt skulle vara legitim.
Antag nu att användarprogrammet framgångsrikt kör följande uttalande:
int fd = open("/etc/passwd", O_RDWR);
Variabeln fdinnehåller nu indexet för en filbeskrivare i processens filbeskrivningstabell. Denna filbeskrivning är en funktion. Dess existens i processens filbeskrivningstabell är tillräcklig för att veta att processen verkligen har legitim åtkomst till objektet. En viktig egenskap hos detta arrangemang är att filbeskrivningstabellen finns i kärnminnet och inte direkt kan manipuleras av användarprogrammet.
Delning mellan processer
I traditionella operativsystem kommunicerar program ofta med varandra och med lagring med hjälp av referenser som de i de två första exemplen. Sökvägar skickas ofta som kommandoradsparametrar, skickas via uttag och lagras på hårddisken. Dessa referenser är inte funktioner och måste valideras innan de kan användas. I dessa system är en central fråga "på vems auktoritet är en given referens att utvärdera?" Detta blir en kritisk fråga, särskilt för processer som måste agera på uppdrag av två olika myndighetsbärande enheter. De blir mottagliga för ett programmeringsfel som kallas det förvirrade ställföreträdande problemet , vilket ofta leder till ett säkerhetshål .
I ett kapacitetsbaserat system överförs själva funktionerna mellan processer och lagring med hjälp av en mekanism som är känd av operativsystemet för att upprätthålla integriteten hos dessa funktioner.
Ett nytt tillvägagångssätt för att lösa detta problem innebär användning av ett ortogonalt beständigt operativsystem. I ett sådant system finns det inget behov av att enheter kastas och deras kapacitet ogiltigförklaras, och därför krävs en ACL-liknande mekanism för att återställa dessa funktioner vid ett senare tillfälle. Operativsystemet upprätthåller integriteten och säkerheten för de funktioner som finns i all lagring, både flyktiga och icke flyktiga, hela tiden; delvis genom att utföra alla serialiseringsuppgifter själv, snarare än att kräva att användarprogram gör det, som är fallet i de flesta operativsystem. Eftersom användarprogram är befriade från detta ansvar, finns det inget behov av att lita på att de endast kan återskapa juridisk kapacitet eller att validera begäranden om åtkomst med hjälp av en åtkomstkontrollmekanism . Ett exempel på implementering är Flex -maskinen från början av 1980 -talet.
POSIX -funktioner
POSIX -utkast 1003.1e specificerar ett begrepp för behörigheter som kallas "kapacitet". Men POSIX -funktioner skiljer sig från funktioner i den här artikeln - POSIX -funktion är inte associerad med något objekt; en process med CAP_NET_BIND_SERVICE -kapacitet kan lyssna på alla TCP -portar under 1024. Detta system finns i Linux.
Däremot hybridiserar Capsicum en sann kapacitetssystemmodell med UNIX-designen och POSIX API. Capsicum -funktioner är en förfinad form av filbeskrivning, en delegerbar rättighet mellan processer och ytterligare objekttyper bortom klassisk POSIX, till exempel processer, kan refereras via funktioner. I Capsicum -kapacitetsläge kan processer inte använda globala namnutrymmen (t.ex. filsystemets namnrymd) för att leta upp objekt och måste istället ärva eller delegera dem. Detta system finns ursprungligen i FreeBSD, men patchar är tillgängliga för andra system.
Implementeringar
Anmärkningsvärda forsknings- och kommersiella system som använder kapacitetsbaserad säkerhet inkluderar följande:
- Tahoe-LAFS , ett kapacitetsbaserat filsystem med öppen källkod
-
GNOSIS , ett operativsystem utvecklat på Tymshare
-
KeyKOS , efterträdare till GNOSIS
- EROS, det extremt pålitliga operativsystemet , efterträdare till KeyKOS
- CapROS , ett projekt för att vidareutveckla EROS -kodbasen för kommersiellt bruk
- EROS, det extremt pålitliga operativsystemet , efterträdare till KeyKOS
-
KeyKOS , efterträdare till GNOSIS
- Cambridge CAP -dator
- Hydra (operativsystem) , en del av C.mmp -projektet vid Carnegie Mellon University
- StarOS, en del av CM* -projektet vid Carnegie Mellon University
- IBM System/38 och AS/400
- Intel iAPX 432
- Plessey System 250
- Böja
-
L4 microkernel -familj :
- OKL4 från Open Kernel Labs
- seL4 från NICTA
- Fiasco.OC och NOVA från TU-Dresden
- Amoebas distribuerade operativsystem
- FreeBSD Capsicum
- Genode
- Google Fuchsia
- WebAssemble System Interface (WASI)
Referenser
- Levy, Henry M., * Capability-Based Computer Systems , Digital Equipment Corporation 1984. ISBN 0-932376-22-3 . En elektronisk version finns här .
- EROS -projektet
- E , ett programmeringsspråk baserat på kapacitetssäkerhet ( ERights.org )
- Mark S. Miller, Ka-Ping Yee, Jonathan Shapiro. Capability Myths Demolished , teknisk rapport SRL2003-02, System Research Laboratory, Johns Hopkins University. Tillgänglig online.
- Cambridge CAP Computer , Levy, 1988
Vidare läsning
- Kapacitetsbaserad adressering : Theodore A. Linden (december 1976). "Operativsystemstrukturer för att stödja säkerhet och pålitlig programvara". ACM Computing Surveys . 8 (4): 409–445. doi : 10.1145/356678.356682 . hdl : 2027/mdp.39015086560037 . ISSN 0360-0300 . S2CID 16720589 .
- Li Gong , A Secure Identity-Based Capability System , sp, sid. 56, 1989 IEEE Symposium on Security and Privacy, 1989
- Kapacitetsbaserad adressering
- En hårdvaruimplementering av kapacitetsbaserad adressering
- En implementering av funktioner på PDP-11/45
- IBM System/38-stöd för kapacitetsbaserad adressering
- EROS: ett system med snabb kapacitet
POSIX "funktioner" i Linux:
- POSIX -funktioner och filer
- POSIX -filmöjligheter: Parceling av rotens kraft
- Gör roten oprivilegerad
- Säkerhetsproblem och nya risker kopplade till POSIX -filmöjligheter
- Linux manuell sida för "funktioner (7)"
- Arbeta med Linux -funktioner