Bezpieczeństwo oparte na możliwościach — Capability-based security

Bezpieczeństwo oparte na zdolnościach to koncepcja stosowana w projektowaniu bezpiecznych systemów komputerowych , jeden z istniejących modeli zabezpieczeń . Zdolność (znane w niektórych systemach jako klucza ) jest zakaźną, podrobienia żeton władzy. Odnosi się do wartości, która odwołuje się do obiektu wraz z powiązanym zestawem praw dostępu . Użytkownik programu w systemie operacyjnym zdolności oparte musi korzystać z możliwości, aby uzyskać dostęp do obiektu. Bezpieczeństwo oparte na możliwościach odnosi się do zasady projektowania programów użytkownika w taki sposób, aby bezpośrednio współdzieliły między sobą możliwości zgodnie z zasadą najmniejszych uprawnień oraz do infrastruktury systemu operacyjnego niezbędnej do tego, aby takie transakcje były wydajne i bezpieczne. Zabezpieczenia oparte na możliwościach należy skontrastować z podejściem wykorzystującym hierarchiczne domeny ochrony .

Chociaż większość systemów operacyjnych implementuje funkcję, która przypomina możliwości, zazwyczaj nie zapewniają one wystarczającego wsparcia, aby umożliwić wymianę możliwości między potencjalnie wzajemnie nieufnymi jednostkami jako podstawowy sposób nadawania i dystrybucji praw dostępu w całym systemie. Natomiast system oparty na zdolnościach został zaprojektowany z myślą o tym celu.

Możliwości omówione w tym artykule nie powinny być mylone z POSIX 1e/2c „ Możliwości ”. Te ostatnie to uprawnienia gruboziarniste, których nie można przenosić między procesami.

Wstęp

Możliwości osiągają swój cel, jakim jest poprawa bezpieczeństwa systemu, poprzez wykorzystanie ich w miejsce podrabialnych referencji . Odwołanie możliwe do podrobienia (na przykład nazwa ścieżki ) identyfikuje obiekt, ale nie określa, które prawa dostępu są odpowiednie dla tego obiektu i programu użytkownika, który przechowuje to odwołanie. W związku z tym każda próba uzyskania dostępu do obiektu, do którego się odwołuje, musi zostać zweryfikowana przez system operacyjny w oparciu o uprawnienia otoczenia programu żądającego, zwykle za pomocą listy kontroli dostępu (ACL). Zamiast tego, w systemie z możliwościami, sam fakt, że program użytkownika posiada tę zdolność, upoważnia go do korzystania z obiektu, do którego się odwołuje, zgodnie z prawami określonymi przez tę zdolność. Teoretycznie system z możliwościami eliminuje potrzebę jakiejkolwiek listy kontroli dostępu lub podobnego mechanizmu, dając wszystkim podmiotom wszystkie i tylko te możliwości, których faktycznie będą potrzebować.

Możliwość jest zazwyczaj implementowana jako uprzywilejowana struktura danych, która składa się z sekcji, która określa prawa dostępu, oraz sekcji, która jednoznacznie identyfikuje obiekt, do którego należy uzyskać dostęp. Użytkownik nie ma bezpośredniego dostępu do struktury danych lub obiektu, lecz poprzez uchwyt . W praktyce jest używany podobnie jak deskryptor pliku w tradycyjnym systemie operacyjnym (tradycyjny uchwyt), ale w celu uzyskania dostępu do każdego obiektu w systemie. Możliwości są zwykle przechowywane przez system operacyjny na liście, z pewnym mechanizmem uniemożliwiającym programowi bezpośrednią modyfikację zawartości możliwości (w celu sfałszowania praw dostępu lub zmiany obiektu, na który wskazuje). Niektóre systemy są również oparte na adresowaniu opartym na możliwościach (sprzętowa obsługa możliwości), na przykład Plessey System 250 .

Programy posiadające możliwości mogą wykonywać na nich funkcje, takie jak przekazywanie ich innym programom, konwertowanie ich na mniej uprzywilejowaną wersję lub usuwanie. System operacyjny musi zapewniać, że tylko określone operacje mogą być wykonywane na możliwościach systemu, aby zachować integralność polityki bezpieczeństwa.

Przykłady

Zdolność jest zdefiniowana jako chronione odniesienie do obiektu, które z racji posiadania przez proces użytkownika nadaje temu procesowi zdolność (stąd nazwa) do interakcji z obiektem w określony sposób. Sposoby te mogą obejmować odczytywanie danych powiązanych z obiektem, modyfikowanie obiektu, wykonywanie danych w obiekcie jako proces oraz inne wyobrażalne prawa dostępu. Zdolność logicznie składa się z odwołania, które jednoznacznie identyfikuje konkretny obiekt oraz zestawu co najmniej jednego z tych praw.

Załóżmy, że w przestrzeni pamięci procesu użytkownika istnieje następujący ciąg:

/etc/passwd

Chociaż identyfikuje to unikalny obiekt w systemie, nie określa praw dostępu, a zatem nie jest możliwością. Załóżmy, że zamiast tego są następujące dwie wartości:

/etc/passwd
O_RDWR

Identyfikuje obiekt wraz z zestawem praw dostępu. Jednak nadal nie jest to możliwość, ponieważ posiadanie tych wartości przez proces użytkownika nie mówi nic o tym, czy dostęp ten byłby rzeczywiście legalny.

Załóżmy teraz, że program użytkownika pomyślnie wykonuje następującą instrukcję:

int fd = open("/etc/passwd", O_RDWR);

Zmienna fdzawiera teraz indeks deskryptora pliku w tabeli deskryptorów plików procesu. Ten deskryptor pliku jest funkcją. Jego istnienie w tabeli deskryptorów pliku procesu wystarcza, aby wiedzieć, że proces rzeczywiście ma uprawniony dostęp do obiektu. Kluczową cechą tego układu jest to, że tablica deskryptorów plików znajduje się w pamięci jądra i nie może być bezpośrednio manipulowana przez program użytkownika.

Udostępnianie między procesami

W tradycyjnych systemach operacyjnych programy często komunikują się ze sobą oraz z pamięcią masową za pomocą odwołań, takich jak te w pierwszych dwóch przykładach. Nazwy ścieżek są często przekazywane jako parametry wiersza poleceń, wysyłane przez gniazda i przechowywane na dysku. Te odwołania nie są możliwościami i muszą zostać zweryfikowane przed użyciem. W tych systemach centralnym pytaniem jest „na czyim autorytecie ma być oceniane dane odniesienie?”. Staje się to kwestią krytyczną, zwłaszcza dla procesów, które muszą działać w imieniu dwóch różnych podmiotów posiadających autorytet. Stają się podatne na błąd programistyczny znany jako problem zdezorientowanego zastępcy , co bardzo często skutkuje luką w zabezpieczeniach .

W systemie opartym na możliwościach same możliwości są przekazywane między procesami i pamięcią masową przy użyciu mechanizmu znanego systemowi operacyjnemu w celu zachowania integralności tych możliwości.

Jedno nowatorskie podejście do rozwiązania tego problemu obejmuje użycie ortogonalnie trwałego systemu operacyjnego. W takim systemie nie ma potrzeby odrzucania jednostek i unieważniania ich możliwości, a zatem do przywrócenia tych możliwości w późniejszym czasie wymagany jest mechanizm podobny do ACL. System operacyjny przez cały czas zachowuje integralność i bezpieczeństwo funkcji zawartych w całej pamięci masowej, zarówno ulotnej, jak i nieulotnej; częściowo wykonując wszystkie zadania serializacji samodzielnie, a nie wymagając tego od programów użytkownika, jak ma to miejsce w większości systemów operacyjnych. Ponieważ programy użytkownika są zwolnione z tej odpowiedzialności, nie ma potrzeby ufać im, że odtwarzają jedynie zdolności prawne, ani nie sprawdzają poprawności żądań dostępu za pomocą mechanizmu kontroli dostępu . Przykładem realizacji jest maszyna Flex z początku lat 80-tych.

Możliwości POSIX

Wersja robocza POSIX 1003.1e określa koncepcję uprawnień zwanych „zdolnościami”. Jednak możliwości POSIX różnią się od możliwości opisanych w tym artykule — funkcja POSIX nie jest powiązana z żadnym obiektem; proces mający zdolność CAP_NET_BIND_SERVICE może nasłuchiwać na dowolnym porcie TCP poniżej 1024. Ten system można znaleźć w Linuksie.

W przeciwieństwie do tego, Capsicum hybrydyzuje prawdziwy model systemu zdolności z projektem UNIX i POSIX API. Możliwości Capsicum to wyrafinowana forma deskryptora plików, delegowalne prawo między procesami i dodatkowymi typami obiektów poza klasycznym POSIX, takimi jak procesy, do których można się odwoływać za pośrednictwem możliwości. W trybie możliwości Capsicum procesy nie mogą wykorzystywać globalnych przestrzeni nazw (takich jak przestrzeń nazw systemu plików) do wyszukiwania obiektów i zamiast tego muszą je dziedziczyć lub być delegowane. Ten system znajduje się natywnie we FreeBSD, ale poprawki są dostępne dla innych systemów.

Realizacje

Znane systemy badawcze i komercyjne wykorzystujące zabezpieczenia oparte na zdolnościach obejmują:

Bibliografia

Dalsza lektura

"Możliwości" POSIX w Linuksie:

Zewnętrzne linki