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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for Rafał Łasocha

Rafał Łasocha

December 07, 2015
Tweet

More Decks by Rafał Łasocha

Other Decks in Programming

Transcript

  1. 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)
  2. 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"); }
  3. 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"); }
  4. procstat # procstat -fC <pid prog1a> <pid prog1b> 33409 prog1a

    3 v rw------ rd,wr,se,mm,cr,fe,... - /tmp/foo 32856 prog1b 3 v rw------ rd,re - /tmp/foo
  5. 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
  6. 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
  7. 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
  8. 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);
  9. 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”
  10. 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
  11. Ź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