to czego potrzebujemy na co dzień • ważniejsze są dla nas pliki w katalogu domowym, niż pliki w / • aplikacje są świadome, że mogą mieć podatności i chcą zminimalizować ewentualne szkody (chromium, gunzip)
if (fd < 0) err(1, "open() failed"); if (write(fd, tekst, sizeof(tekst)) > 0) { printf("write() sie udal\n"); } else { printf("write() sie nie udal\n"); } if (read(fd, tekst, sizeof(tekst)) >= 0) { printf("read() sie udal\n"); } else { printf("read() sie nie udal\n"); }
cap_rights_init, cap_rights_set, cap_rights_clear, cap_rights_is_set, … - zarządzanie strukturą cap_rights_t – cap_rights_t jest właściwie po prostu zbiorem • cap_rights_limit(int fd, cap_rights_t *rights) – ogranicz dostęp do deskryptora przez dany zbiór możliwości – zawsze można tylko ograniczać zbiór możliwości który już mamy
Capsicum („capability mode”) – już nie można wywołać open(), tylko openat() – prog1c: open() failed: Not permitted in capability mode – ogranicza się też sysctl, shm_open (możliwość tylko tworzenia anonimowych współdzielonych obszarów pamięci) – pełną listę można znaleźć w sys/kern/capabilities.conf • wywołanie cap_enter() powoduje ustawienie flagi w procesie której się już nie da zdjąć – #define IN_CAPABILITY_MODE(td) (((td)->td_ucred->cr_flags & CRED_FLAG_CAPMODE) != 0) – if (IN_CAPABILITY_MODE(td) && (userpath != SHM_ANON)) return (ECAPMODE); – podobnie w syscallenter
linijek kodu – możemy bardzo łatwo zawęzić dostęp do wszystkiego – w szczególności nie chcemy żeby tcpdump miał dostęp do internetu (bo po co) – ale jednak potrzebuje robić zapytania DNS • dodatkowe narzędzie – Casper • dostarcza kilka bardzo podstawowych usług (DNS, random, UID/GID → nazwy) • libcapsicum • chromium – 100 linijek kodu – zabezpieczenie kodu renderującego i wykonującego JS
z kontenera X wywołać kill na procesie z kontenera Y – ścisły przydział adresów IP od hosta – ograniczone montowanie: tylko nullfs, tmpfs, procfs, devfs i ZFS – zarządzanie za pomocą polecenia „jail”