„Trwałość” to termin zabezpieczający określający jeden konkretny problem: w jaki sposób kod, który został uruchomiony raz, uruchamia się automatycznie po ponownym uruchomieniu lub zalogowaniu, tak aby nikt nie uruchamiał go ponownie ręcznie? macOS zapewnia legalnemu oprogramowaniu wiele zatwierdzonych sposobów, aby dokładnie to zrobić — moduł sprawdzania aktualizacji, klient synchronizacji paska menu, pomocnik sterownika drukarki — a każdy z tych mechanizmów jest równie dostępny dla czegoś, czego wolałbyś w ogóle nie uruchamiać. Jest to wycieczka po miejscach, w których warto zajrzeć, z prawdziwymi poleceniami i rzetelnym opisem tego, gdzie na tym obrazku powinno znajdować się narzędzie sieciowe, takie jak FireAI, a gdzie nie.
LaunchAgents i LaunchDaemons: dwa duże
macOS uruchamia prawie wszystko poprzez launchd, kierując się listą właściwości (.plist) plikami w niewielkiej liczbie znanych katalogów. Technika T1543.001 firmy MITER ATT&CK opisuje ten mechanizm w prosty sposób: podczas logowania proces launchd dla każdego użytkownika ładuje plisty z katalogów użytkownika i systemu LaunchAgents, a plista z RunAtLoad ustawioną na true jest wykonywana automatycznie w momencie jej załadowania — nie jest wymagane żadne dalsze działanie ze strony tego, kto ją tam umieścił. Technika ta wymienia trzy istotne lokalizacje: /System/Library/LaunchAgents, /Library/LaunchAgents i ~/Library/LaunchAgents. MITER zauważa coś, o czym warto pamiętać podczas przewijania listy tych plików: agenci zainstalowani w celu zapewnienia trwałości są często „przebraniem[d]… używając nazw przypominających legalny system operacyjny lub składniki oprogramowania” — plik wyglądający jak com.apple.something.plist jest wart drugiego spojrzenia właśnie dlatego, że stara się go nie uzyskać.
LaunchDaemons, objęte powiązaną techniką T1543.004, to wersja ogólnosystemowa, która nie wymaga logowania: działają jako root, zaczynając od startu, z /System/Library/LaunchDaemons/ lub /Library/LaunchDaemons/. Ponieważ instalacja tam wymaga na początku uprawnień administracyjnych, MITER wyznacza trasę demona jako sposób na przekształcenie początkowego uprzywilejowanego punktu dostępu w coś, co przetrwa ponowne uruchomienie i odtąd działa z dostępem na poziomie roota — i dlatego też nowy, nieznany plik pojawiający się w /Library/LaunchDaemons jest silniejszym sygnałem niż ten pojawiający się we własnym folderze LaunchAgents użytkownika.
ls -la ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons
# compare this list against what you remember installing; anything you don't
# recognise is worth reading with: plutil -p /path/to/the.plistPlik istniejący na dysku i aktualnie ładowane zadanie to dwa różne pytania, a launchctl print odpowiada na drugie. Jego strona podręcznika opisuje to jako wyświetlające „informacje o określonej usłudze lub domenie” — wskazuje na domenę taką jak system/ lub gui/501/ (501 to UID użytkownika), wyświetla listę wszystkich usług i punktów końcowych aktualnie załadowanych w tym kontekście, a także stan każdego z nich:
launchctl print gui/$(id -u)
# example output, trimmed — a real run lists every loaded agent for your session
"com.apple.someAgent" => {
active count = 1
path = /Library/LaunchAgents/com.apple.someAgent.plist
state = running
}Elementy logowania i zarządzanie zadaniami w tle
W większości przypadków powierzchnią skierowaną do użytkownika jest panel Elementy logowania w Ustawieniach systemu, który warto sprawdzić na własne oczy, a nie tylko w wierszu poleceń. Przewodnik pomocy Apple opisuje to bezpośrednio: możesz „wybrać elementy logowania, które otwierają się automatycznie po zalogowaniu”, dodać lub usunąć je tam i osobno zezwolić lub zabronić aplikacjom, które „wykonują zadania, gdy aplikacja nie jest otwarta, takie jak sprawdzanie dostępności aktualizacji oprogramowania lub synchronizowanie danych” – ta druga kategoria obejmuje pomocników w tle, którzy nie są pełnymi elementami logowania, ale nadal działają bez nadzoru.
Od macOS Ventura system znajdujący się pod tym panelem ustawień jest powszechnie nazywany przez społeczność zajmującą się bezpieczeństwem usługą Zarządzanie zadaniami w tle (BTM): usługa, która śledzi każdego agenta uruchamiania, demona uruchamiania i element logowania podczas rejestracji, dzięki czemu Ustawienia systemowe pokazują bieżącą, scentralizowaną listę, zamiast konieczności ręcznego przeszukiwania trzech katalogów plist. Istnieje nieudokumentowane narzędzie wiersza poleceń, sfltool, którego niektórzy badacze używają do bardziej bezpośredniego wysyłania zapytań do bazy danych za pomocą sfltool dumpbtm — Apple nie dostarcza żadnej strony podręcznika dla niego i nie ma gwarancji, że jego format wyjściowy pozostanie stabilny, więc traktuj to jako ciekawostkę naukową do wypróbowania na własnej maszynie, a nie coś, na czym można zbudować przepływ pracy. Obsługiwanym i stabilnym sposobem wyświetlania tych samych informacji jest nadal panel Elementy logowania w Ustawieniach systemowych lub launchctl print w przypadku aktualnego stanu określonego zadania.
cron: starszy, cichszy, nadal tam jest
launchd był przez długi czas preferowanym programem planującym Apple, ale starszy demon uniksowy cron nadal jest dostarczany i nadal uruchamia wszystko, co jest w nim zaplanowane. Strona podręcznika crontab bezpośrednio opisuje format pliku: każda linia zawiera pięć pól godziny/daty — minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia — po których następuje polecenie uruchomienia z @reboot i podobnymi skrótami dostępnymi zamiast pięciu pól w niektórych systemach. crontab -l, zgodnie ze stroną podręcznika crontab(1), „Wyświetli bieżący plik crontab na standardowym wyjściu” dla bieżącego użytkownika:
crontab -l
sudo crontab -l -u rootPusty wynik dla obu jest dziś normalnym zjawiskiem na większości komputerów Mac — właśnie dlatego wszystko, co tam jest, zasługuje na uwagę. cron jest mało efektowny i rzadko sprawdzany, dlatego właśnie nadal pojawia się jako rezerwowa lokalizacja trwałości w opisach incydentów.
Profile konfiguracyjne: trwałość śladu papierowego
Za pomocą profilu konfiguracyjnego można zainstalować LaunchDaemona, przyznać uprawnienia dotyczące prywatności lub przesłać ustawienia na całą flotę komputerów Mac — zgodnie z prawem tak działa MDM (zarządzanie urządzeniami mobilnymi). Nielegalnie profil jest udokumentowanym sposobem na utrwalenie zmian bez bezpośredniego dotykania pliku plist. Narzędzie wiersza poleceń profiles wyświetla listę zainstalowanych elementów: profiles list pokazuje zainstalowane profile i, jak zauważa jego strona podręcznika, uruchomienie go jako root z -all spowoduje wyświetlenie „listy wszystkich profili konfiguracyjnych w systemie”, a nie tylko bieżącego użytkownika.
sudo profiles list -all
sudo profiles show -allOsobisty komputer Mac bez rejestracji MDM zasadniczo nie powinien mieć żadnych lub mieć tylko te zainstalowane celowo (konfiguracja VPN, profil do pracy). Profil, którego instalacji nie pamiętasz, warto sprawdzić przed usunięciem, ponieważ profiles obsługuje również usuwanie z ochroną hasłem dokładnie na tym etapie.
Wtyczki autoryzacyjne i długi ogon
Poza wielką czwórką powyżej istnieje długi ogon mniejszych, starszych mechanizmów: usługi katalogowe i wtyczki autoryzacyjne, importery Spotlight, generatory QuickLook, wtyczki kafelków Dock i pliki startowe powłoki, które są uruchamiane za każdym razem, gdy otwiera się nowa sesja terminala. W tym miejscu specjalnie zaprojektowane narzędzie zarabia na siebie w porównaniu z ręcznym sprawdzaniem. Na przykład KnockKnock firmy Objective-See wylicza w jednym przebiegu ponad dwadzieścia kategorii lokalizacji trwałości — w tym agenty i demony uruchamiania, elementy logowania, rozszerzenia przeglądarki, zadania cron, rozszerzenia jądra i systemu oraz wtyczki autoryzacji i usług katalogowych — i pokazuje status podpisywania kodu tego, co znajdzie w każdej z nich. Jego towarzysz, BlockBlock, pobiera tę samą listę lokalizacji i stale je obserwuje, ostrzegając w momencie zarejestrowania czegoś nowego; według własnego opisu „monitoruje typowe lokalizacje trwałości i ostrzega za każdym razem, gdy dodawany jest nowy trwały komponent”, pokazując odpowiedzialny proces, jego status podpisania oraz umożliwiając natychmiastowe zezwolenie lub zablokowanie.
Pliki startowe powłoki: cichy sposób na wszystko
Jeszcze jedna lokalizacja warta bezpośredniego spojrzenia, ponieważ nie wymaga plist ani żadnej uprzywilejowanej instalacji: pliki konfiguracyjne powłoki. ~/.zshrc, ~/.zprofile i ~/.bash_profile są uruchamiane za każdym razem, gdy otwiera się pasująca nowa sesja terminala, a pojedyncza dodana linia — potok do skryptu, eksport przejętego PATH, uruchamianie procesu w tle — wystarczy, aby ponownie ustanowić punkt zaczepienia za każdym razem, gdy otwierasz Terminal, bez niczego do załadowania do launchd i niczego, co launchctl print mogłoby pokazać. Program KnockKnock firmy Objective-See uwzględnia w swoim skanie dokładnie tę kategorię, wymienioną obok agentów uruchamiania i elementów logowania jako pliki konfiguracyjne powłoki, z tego samego powodu, dla którego należy do tego artykułu: jest na tyle powszechny i na tyle nieestetyczny, że warto go sprawdzić, a nie zakładać.
cat -A ~/.zshrc ~/.zprofile ~/.bash_profile 2>/dev/null | less
# -A shows non-printing characters, which surfaces anything hidden with
# trailing whitespace or a carriage return trying to push it off-screenGdzie pasuje FireAI, a gdzie celowo nie
Mówiąc wprost: FireAI nie skanuje /Library/LaunchDaemons, nie czyta plików plist i nie próbuje wykryć nowego elementu logowania lub profilu konfiguracyjnego. Jest to dyscyplina odrębna od tego, czym zajmuje się FireAI, a narzędzia stworzone specjalnie dla niej – wśród nich KnockKnock i BlockBlock – już dobrze radzą sobie z tym zadaniem. To, co obserwuje FireAI, to krok, który następuje po wytrwałości i którego każdy z tych mechanizmów ostatecznie potrzebuje, jeśli ma być przydatny dla każdego, kto go zainstalował: połączenie sieciowe. LaunchAgent, który działa cicho przy każdym logowaniu, ale nigdy nie komunikuje się z siecią, jest z punktu widzenia zapory sieciowej niewidoczny, a także w praktyce znacznie mniej przydatny dla atakującego. W momencie otwarcia gniazda reguły FireAI dotyczące poszczególnych aplikacji mają do niego zastosowanie jak do każdego innego procesu: nieznany, podpisany lub niepodpisany plik binarny nawiązujący pierwsze połączenie powoduje wyświetlenie monitu, a uzasadnienie modelu na urządzeniu jest przedstawione prostym językiem, a każda decyzja jest widoczna, możliwa do cofnięcia i eksportowalna później jako reguła tekstowa.
Uczciwy sposób na połączenie obu dyscyplin: sprawdzaj lokalizacje wymienione w tym artykule zgodnie z harmonogramem odpowiadającym Twojej tolerancji ryzyka — co miesiąc jest rozsądne dla większości osób, co tydzień, jeśli instalujesz dużo oprogramowania innych firm — i pozwól, aby narzędzie sieciowe przejęło obciążenie w międzyczasie, zakładając, że wszystko, co trwało cicho, w końcu będzie musiało przemówić, aby dotrzeć do osoby, której odpowiada.
Jaką rolę odgrywają FireAI i HisnLabs
FireAI does not scan for persistence — that is a different job, and tools like KnockKnock and BlockBlock already do it well; what FireAI watches is what that persisted code does the moment it opens a socket, which is the step every one of these mechanisms eventually has to take to be useful to whoever installed it.
FireAI to własny produkt HisnLabs: zapora sieciowa z AI działająca bezpośrednio na Macu. Pokazuje prostym językiem każde połączenie nawiązywane przez twoje aplikacje i pozwala ci decydować, co opuszcza twojego Maca — jej AI działa lokalnie, więc twój ruch nigdy nie jest wysyłany do nas ani do nikogo innego. Zespół badań nad bezpieczeństwem HisnLabs dba o to, by te decyzje pozostały trafne: kataloguje, które domeny to zwykła telemetria, a które prawdziwa usługa, śledzi kraj i sieć stojące za połączeniem oraz trenuje lokalny model (funkcję Autopilot) na rzeczywistych wzorcach ruchu — a nic z tego nie opuszcza twojego Maca.
Możesz przeczytać o decyzjach technicznych, które za tym stoją, albo wypróbować FireAI przez 17 dni na FireAI od HisnLabs.
