Pro Yearly is on sale from $80 to $50! »

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

0c9087813222ecf3d5ff0014488d50e1?s=128

Rafał Łasocha

December 07, 2015
Tweet

Transcript

  1. Bezpieczeństwo Rafał Łasocha 7.12.2015

  2. 1) Capsicum 2) Jails

  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)
  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"); }
  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"); }
  6. 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
  7. Capsicum - możliwości

  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
  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
  10. Gunzip (z Capsicum)

  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
  12. Casperd

  13. 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);
  14. None
  15. Capsicum

  16. 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”
  17. ucred struct

  18. None
  19. 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
  20. Dodatkowe opcje kontenerów

  21. prison0

  22. Ź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
  23. None