Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ciąg dalszy aspektów bezpieczeństwa we FreeBSD

Ciąg dalszy aspektów bezpieczeństwa we FreeBSD

Ciąg dalszy aspektów bezpieczeństwa we FreeBSD
Instytut Informatyki Uniwersytetu Wrocławskiego
Seminarium: Systemy operacyjne
07.12.2015

Rafał Łasocha

December 07, 2015
Tweet

More Decks by Rafał Łasocha

Other Decks in Programming

Transcript

  1. Bezpieczeństwo
    Rafał Łasocha
    7.12.2015

    View full-size slide

  2. 1) Capsicum
    2) Jails

    View full-size slide

  3. Capsicum (możliwości)

    MAC i DAC to nie do końca 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)

    View full-size slide

  4. char tekst[] = "foo";
    int fd;
    fd = open("/tmp/foo", O_RDWR);
    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");
    }

    View full-size slide

  5. char tekst[] = "foo";
    int fd;
    fd = open("/tmp/foo", O_RDWR);
    if (fd < 0) err(1, "open() failed");
    cap_enter();
    cap_rights_t setrights;
    cap_rights_init(&setrights, CAP_READ);
    cap_rights_limit(fd, &setrights);
    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");
    }

    View full-size slide

  6. procstat
    # procstat -fC
    33409 prog1a 3 v rw------ rd,wr,se,mm,cr,fe,... - /tmp/foo
    32856 prog1b 3 v rw------ rd,re - /tmp/foo

    View full-size slide

  7. Capsicum - możliwości

    View full-size slide

  8. Capsicum
    ● cap_enter(void) - włącz tryb korzystania z Capsicum
    ● 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

    View full-size slide

  9. Capsicum

    po włączeniu capsicum (cap_enter()) program wchodzi w tryb 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

    View full-size slide

  10. Gunzip (z Capsicum)

    View full-size slide

  11. Capsicum

    tcpdump
    – dodanie capsicum do niego to kilkanaście 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

    View full-size slide

  12. Caspersd (przykład użycia)
    cap_channel_t *capcas, *capdns;
    capcas = cap_init();
    cap_enter();
    capdns = cap_service_open(capcas, "system.dns");
    cap_close(capcas);
    limits = nvlist_create(0);
    nvlist_add_string(limits, "type", "ADDR");
    nvlist_add_number(limits, "family", (uint64_t)AF_INET);
    cap_limit_set(capdns, limits);
    inet_aton("127.0.0.1", &ip) // Convert IP address in C-string to in_addr
    hp = cap_gethostbyaddr(capdns, (const void *)&ip, sizeof(ip), AF_INET);

    View full-size slide

  13. Jails

    „wirtualizacja systemowa”
    – współdzielimy jądro
    – nie możemy 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”

    View full-size slide

  14. ucred struct

    View full-size slide

  15. Polecenie „jail”

    utworzenie kontenera
    – ścieżka do nowego katalogu głównego, hostname,
    nazwa kontenera i lista przydzielonych adresów
    IPv4/v6

    „wyłączenie” kontenera (jail_remove)

    dodatkowe opcje do ustawienia

    View full-size slide

  16. Dodatkowe opcje kontenerów

    View full-size slide

  17. Źródła

    „Tak w książce mówili”

    http://www.admin-magazine.com/Archive/2013/18/Capsicum-Additional-seasoning-for-FreeBSD

    http://nxr.netbsd.org/xref/src-freebsd/sys/kern/kern_jail.c#prison_priv_check

    do_jail_attach
    – http://nxr.netbsd.org/xref/src-freebsd/sys/kern/kern_jail.c#2395

    cap_enter
    – http://nxr.netbsd.org/xref/src-freebsd/sys/kern/sys_capability.c#94

    libcapsicum (casperd)
    – https://www.freebsd.org/cgi/man.cgi?query=libcapsicum&apropos=0&sektion=3&manpath=FreeBSD+11-current&format=html

    View full-size slide