20 KiB
Zarządzanie bezpieczeństwem aplikacji
9. Projekt badawczo-rozwojowy [wykład]
Tomasz Kowalski (2022)
Infrastruktura krytyczna
(...) to rzeczywiste i cybernetyczne systemy (obiekty, urządzenia bądź instalacje) niezbędne do minimalnego funkcjonowania gospodarki i państwa. (źródło: RCB)
- Energia (prąd elektryczny, paliwo)
- Łączność (telefon, internet)
- Finanse (karta płatniczna, bankowość elektroniczna)
- Żywność
- Woda
oraz wiele innych składników tzw. infrastruktury krytycznej to są Twoje zależności (ang. dependencies)
Infrastruktura krytyczna to, według ustawy o zarządzaniu kryzysowym, systemy oraz wchodzące w ich skład powiązane ze sobą funkcjonalnie obiekty, w tym obiekty budowlane, urządzenia, instalacje, usługi kluczowe dla bezpieczeństwa państwa i jego obywateli oraz służące zapewnieniu sprawnego funkcjonowania administracji publicznej, a także instytucji i przedsiębiorców.
Typowy stos aplikacyjny
- Aplikacja
- Middleware
- Userspace
- Kernel
- Bootloader
- Hypervisor
- Firmware
- BIOS | EFI
- CPU | Management Engine
Czy masz świadomość zależności Twojej aplikacji na drugiej i kolejnych warstwach?
Jakie są współczesne aplikacje?
Fikcyjny stos, ale (niestety) ze znajomymi elementami
Humor (w różnych postaciach) jest tym środkiem, z użyciem którego wyraża się prawdy, które wypowiedziane wprost byłby trudne do przyjęcia.
Popatrzmy na XKCD 1636.
Jeśli odniesienia obecne w tej grafice nie są czytelne to można podeprzeć się objaśnieniem.
Rzeczywisty "stos" - przkład: linux w przeglądarce
Niestety żart w informatyce potrafi przerodzić się w rzeczywistość.
Już w 2011 kernel linuksowy pracował wewnątrz przeglądarki. Tylko dlaczego?! (Po co?)
Jest 2022 i temat nadal jest aktualny.
Mało tego - rzecz zdaje się eskalować, gdyż w ramach emulacji można już uruchomić kompletny system, a samo jądro przeportowano i pracuje w przeglądarce natywnie.
Jak radzimy sobie z utrzymaniem i rozwojem oprogramowania w dłuższej perspektywie?
Humorystyczne, ale prawdziwie, ujmuje to Geek&Poke 2011/3/1
Rzeczywistość, w której stare i słabe komponenty próbuje się "maskować", dobrze przedstawia historia Synactive na pwn2own 2021.
Można zrozumieć, że są pewne zależności, których niesposób zmienić (z powodu kosztów, skali problemu, itp.) jednak ogólnie obfuskacją nie można przykryć niedomagań systemu operacyjnego pozbawionego współczesnych środków bezpieczeństwa.
Zamaskowania problemu to zwykle (a w dłuższej perspektywie - zawsze) zły pomysł.
Zapobieganie powstawaniu błędów
Dla ops-ów mamy
CIS Microsoft Windows 11 Enterprise Benchmark
CIS Distribution Independent Linux Benchmark
i wiele wiele innych
Dla dev-ów mamy
BDEW Whitepaper Requirements for Secure Control and Telecommunication Systems
CIS Application Software Security
ale także
Przykład: OWASP SCP Quick Reference Guide
(link był wcześniej: Zapobieganie powstawaniu błędów -> Dla dev-ów)
Obecnie v2
11.2010 (niby stare, ale wątpię czy cokolwiek z tego można spokojnie pominąć)
PDF ma zaledwie 17 stron:
- checklist-a dobrych praktyk (str. 5-13)
- walidacja wejścia
- encoding wyjścia
- autentykacja i zarządzanie hasłami
- zarządzanie sesją
- kontrola dostępu
- praktyki kryptograficzne
- obsługa błędów i logowania
- ochrona danych
- bezpieczeństwo komunikacji
- konfiguracja systemu
- bezpieczeństwo związane z obsługą bazy danych
- zarządzanie plikami
- zarządzanie pamięcią
- ogólnie, praktyki programistyczne
- elementarny słownik pojęć związanych z bezpieczeństwem (str. 15-17)
Stos zagrożeń (~ISO OSI RM)
Każdy słyszał o modelu referencyjnym ISO OSI, ale o tym, że można go zamapować na stos tzw. thread actors, już nie każdy.
Kwestia tzw. credentials
Czyli API keys, username/passwd, certificates, …
- Kto ma do nich dostęp?
- Jak je otrzymali?
- Gdzie są przechowywane?
- Gdzie są używane?
Drogi Programisto, czy jest coś cenniejszego niż kod źródłowy? Kod jest czymś co lub wyciekać, a to przecież cały majątek Twojej firmy.
Problem wyciekania kodu i różnego rodzaju "credentials" jest tak duży, że doczekał się własnego określenia - jest to tzw. "secret sprawl". Szczegóły np. w tegorocznym w raporcie Gitguardian
Jak poznać czy jest dobrze czy już źle?
Pasażerowie płonącego samolotu potrafią zachować się jakby nic nietypowego się nie wydarzyło. A jak Ty poznasz, że coś poszło nie tak?
Zabezpieczenie linii produkcyjnej oprogramowania i łańcucha dostaw
Usterki w zakresie bezpieczeństwa mogą pojawić się na każdym etapie rozwoju oprogramowania:
- (już na starcie) nie zidentyfikowano wymagań dot. bezpieczeństwa
- stworzono projekt (ang. design), który ma błędy logiczne
- kiepska kultura kodowania poskutkowała wadami technicznymi (a więc podatnościami)
- wdrożenie (ang. deployment) było … niewłaściwe
- (na koniec, a więc ang. maintenance) zaktualizowano o nowe błędy
Zapobieganie? Np. CIS Software Supply Chain Security Guide
świeżynka (10/2022)
PDF ma 66 stron, 100+ rekomendacji:
- Kod źródłowy
- zmiany w kodzie
- zarządzanie repozytorium
- uprawnienia do modyfikacji kodu
- dostęp dla stron trzecich
- ryzyka związane z kodem
- Build pipelines
- środowisko
- worker
- budowa pipeline
- integralność pipeline
- Zależności
- pakiety stron trzecich
- walidacja pakietów
- Artefakty
- weryfikacja
- dostęp do nich
- ich repo
- śledzenie pochodzenia
- Wdrożenie
- środowisko
- konfiguracja
Podsumowanie
To nie ludzie z operations kształtują bezpieczeństwo. To jakość pracy programisty wyznacza jego poziom.
Zarządzanie bezpieczeństwem polega na tym, aby właściwym ludziom "się chciało".
Zarządzanie bezpieczeństwem coś jakby BHP (fabryka dla niepoznaki zwana jest software house).
Zarządzanie bezpieczeństwem polega na podejmowaniu trudnych decyzji (czas, pieniądze, itp.), które wpływają na kształt projektu, wartość produktu i odciskają piętno na jakości życia użytkowników.
Powoli zmierzamy w stronę standaryzacji np. Supply-chain Levels for Software Artifacts (SLSA) lub The Update Framework (TUF).
Ludzie z operations nie zarządzają bezpieczeństwem. Ponieważ produkty są takie jakimi wypuścili je programiści to w operations mamy już tylko "vulnerability management".
Propozycje zadań na laboratorium
Zadanie 1. Od czego zależy Twoja aplikacja lub projekt?
Przypomnij sobie którykolwiek ze swoich projektów. Co jest niezbędne dla jego prawidłowego funkcjonowania? (Także w dłuższej perspektywie czasowej).
Podaj nazwy. (Np. biblioteki, systemu, usługi, narzędzia, sprzętu, …)
Zadanie 2. Od czego w nieoczywisty sposób zależy Twoja aplikacja lub projekt?
Przyjrzyj się projektowi lub produktowi nad którym pracujesz. Spójrz na "typowy stos aplikacyjny" i dla każdej z warstw (drugiej warstwy i kolejnych) wskaż właściwy projekt lub produkt. To też są Twoje zależności.
Zadanie 3. Jak dojrzałe są Twoje zależności?
Dla każdego projektu lub produktu zidentyfikowanego w poprzednim zadaniu 2 odszukaj informację o choć jednej podatności (ang. vulnerability).
Informacja o jak najmłodszych podatnościach jest najcenniejsza. Czy Ty lub Twój zespół podjęliście już właściwe środki zaradcze?
Informacja o starszych podatnościach również jest wartościowa. Skąd wiesz, że te problemy już nie występują? Co jest źródłem tej pewności? Co sądzisz o jakości tego projektu lub produktu patrząc na ilość i typ zidentyfikowanych podatności?
Zadanie 4. Zgodność z zaleceniami OWASP.
W zespole - przyłóżcie tych 214 zaleceń OWASP do swojego projektu; ile z nich już spełniacie?
Zadanie 5
Przyjrzyj się XKCD 2166 i dla każdej z warstw na tym stosie odszukaj informacje o choćby jednej:
- zidentyfikowanej podatności tego typu
- lub doniesienia prasowe np. o głośnych incydentach w tym zakresie.
Jeśli w przypadku niższych warstw nie wiesz gdzie zacząć to zerknij na objaśnienie do komiksu.
Zadanie 6
Utwórz na Github publiczne repo. Stwórz w nim “fejkowy” projekt - trochę kodu, jakiś config.
Wygeneruj kanarka - klucz AWS. Dopisz go w configu, zacommituj, pchnij.
Zjedz kanapkę, wypij kawę, … a po chwili z przerażeniem obserwuj co by to było, gdyby to był faktyczny klucz.