Блог з безпеки FireAI

Автор FireAI Security & Research Team · Опубліковано

Hunting Persistence на macOS: LaunchAgents, елементи входу та фонові завдання

Hunting Persistence на macOS: LaunchAgents, елементи входу та фонові завдання

«Стійкість» — це термін безпеки для однієї конкретної проблеми: як код, який запустився одного разу, організовує автоматичний запуск знову після перезапуску або входу в систему, без повторного запуску вручну? macOS надає легітимному програмному забезпеченню багато дозволених способів зробити саме це — засіб перевірки оновлень, клієнт синхронізації панелі меню, помічник драйвера принтера — і кожен із цих механізмів однаково доступний для того, що ви б воліли взагалі не запускати. Це екскурсія по фактичних місцях, які потрібно шукати, зі справжніми командами та чесним описом того, де такий орієнтований на мережу інструмент, як FireAI, має місце, а яке ні.

LaunchAgents і LaunchDaemons: два великих

macOS запускає майже все через launchd, керуючись файлами списку властивостей (.plist) у невеликій кількості відомих каталогів. Техніка MITRE ATT&CK T1543.001 чітко описує цей механізм: під час входу в систему процес launchd для кожного користувача завантажує plists із каталогів LaunchAgents користувача та системи, а plist із RunAtLoad виконується автоматично в момент завантаження — жодних додаткових дій від того, хто його туди помістив. Техніка містить три важливі місця: /System/Library/LaunchAgents, /Library/LaunchAgents та ~/Library/LaunchAgents. MITER зазначає про те, що варто пам’ятати, коли ви прокручуєте список цих файлів: агенти, встановлені для постійності, часто «маскуються[d]... використовують імена, схожі на законні компоненти ОС або програмного забезпечення» — файл, який виглядає як com.apple.something.plist, вартий повторного перегляду саме тому, що він намагається його не отримати.

LaunchDaemons, які охоплюються подібною технікою T1543.004, є загальносистемною версією, яка не потребує входу в систему: вони запускаються як root, починаючи з завантаження, з /System/Library/LaunchDaemons/ або /Library/LaunchDaemons/. Оскільки для його встановлення спочатку потрібні адміністративні привілеї, MITER створює маршрут демона як спосіб перетворити початкову привілейовану точку опори на щось, що переживає перезапуск і відтоді працює з доступом кореневого рівня — саме тому новий, незнайомий файл, що з’являється в /Library/LaunchDaemons, є більш серйозним сигналом, ніж той, що з’являється у власній папці LaunchAgents користувача.

Термінал — перелік того, що насправді зареєстровано
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.plist

Файл, який існує на диску, і завдання, яке фактично завантажується, — це два різні запитання, і launchctl print відповідає на друге. Його сторінка довідки описує це як друк «інформації про вказану послугу або домен» — вказуючи на домен, наприклад system/ або gui/501/ (501 є UID користувача), він містить список усіх служб і кінцевих точок, які зараз завантажуються в цьому контексті, а також стан кожного з них:

Термінал — те, що реально завантажується прямо зараз
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
	}

Елементи входу та керування фоновими завданнями

Поверхнею для користувача для багатьох із цього є панель «Елементи входу» системних налаштувань, і це варто перевірити своїми очима, а не лише через командний рядок. Посібник підтримки Apple описує це безпосередньо: ви можете «вибирати елементи входу, які відкриваються автоматично під час входу», додавати або видаляти їх там, а також окремо дозволяти або забороняти програми, які «виконують завдання, коли програма не відкрита, наприклад перевірка оновлень програмного забезпечення або синхронізація даних» — ця друга категорія охоплює фонові помічники, які не є елементами повного входу, але все ще працюють без нагляду.

Починаючи з macOS Ventura, система під цією панеллю налаштувань зазвичай називається Background Task Management (BTM) у спільноті безпеки: служба, яка відстежує кожен агент запуску, демон запуску та елемент входу під час самореєстрації, що дозволяє параметрам системи показувати вам живий централізований список замість того, щоб вам потрібно було шукати три каталоги plist вручну. Існує незадокументований інструмент командного рядка, sfltool, який деякі дослідники використовують для більш прямого запиту до цієї бази даних за допомогою sfltool dumpbtm — Apple не надає довідкову сторінку для нього, і його вихідний формат не гарантовано залишатиметься стабільним, тому сприймайте його як дослідницьку цікавість, яку можна спробувати на власному комп’ютері, а не як щось для створення робочого процесу. Підтримуваним стабільним способом перегляду тієї самої інформації залишається панель «Елементи входу» в системних налаштуваннях або launchctl print для поточного стану певної роботи.

cron: старше, тихіше, все ще є

launchd був улюбленим планувальником Apple протягом тривалого часу, але старіший демон Unix cron досі постачається та запускає все, що в ньому заплановано. Сторінка довідки crontab безпосередньо описує формат файлу: кожен рядок містить п’ять полів часу/дати — хвилини, години, день місяця, місяць, день тижня — за якими слідує команда для запуску, із @reboot та подібними скороченими рядками, доступними замість п’яти полів у деяких системах. crontab -l, відповідно до сторінки довідки crontab(1), «Відображатиме поточний crontab у стандартному виведенні» для поточного користувача:

Термінал — перевірка власного та кореневого crontab
crontab -l
sudo crontab -l -u root

Порожній результат для обох є нормальним для більшості комп’ютерів Mac сьогодні — саме тому все, що там є, заслуговує на увагу. cron непривабливий і рідко перевіряється, саме тому він досі відображається як резервне місце збереження в описах інцидентів.

Профілі конфігурації: постійність із паперовим слідом

Профіль конфігурації може встановлювати LaunchDaemon, надавати дозволи на конфіденційність або надсилати налаштування на парк комп’ютерів Mac — законно, так працює MDM (керування мобільними пристроями). Профіль — це задокументований спосіб закріпити зміни, не торкаючись безпосередньо файлу plist. Інструмент командного рядка profiles перераховує, що встановлено: profiles list показує встановлені профілі, і, як зазначено на сторінці довідки, запуск його від імені користувача -all «перерахує всі профілі конфігурації в системі», а не лише профілі поточного користувача.

Термінал — кожен профіль конфігурації на Mac
sudo profiles list -all
sudo profiles show -all

Персональний комп’ютер Mac без реєстрації MDM, як правило, не повинен мати жодного або мати лише ті, які ви навмисно встановили (конфігурація VPN, робочий профіль). Профіль, який ви не пам’ятаєте встановлювати, варто дослідити перед видаленням, оскільки profiles також підтримує видалення із захистом паролем саме для цього кроку.

Плагіни авторизації та довгий хвіст

Крім великої четвірки вище, є довгий хвіст менших, старіших механізмів: служба каталогів і плагіни авторизації, імпортери Spotlight, генератори QuickLook, плагіни Dock tile і файли запуску оболонки, які запускаються щоразу, коли відкривається новий термінальний сеанс. Саме тут спеціально створений інструмент отримує перевагу над ручною перевіркою. Наприклад, KnockKnock від Objective-See за один прохід перераховує більше двадцяти категорій постійних розташувань, включаючи агенти запуску та демони, елементи входу, розширення браузера, завдання cron, розширення ядра та системи, а також плагіни авторизації та служби каталогів, і показує статус підпису коду того, що він знаходить у кожному з них. Його компаньйон, BlockBlock, бере той самий список місць і постійно спостерігає за ними, сповіщаючи, коли щось нове реєструється; згідно з його власним описом, він «відстежує загальні місця збереження та сповіщає щоразу, коли додається новий постійний компонент», показуючи відповідальний процес, його статус підпису та дозволяючи або блокуючи на місці.

Файли запуску оболонки: тихий універсальний засіб

Ще одне розташування, яке варте безпосереднього перегляду, оскільки воно не потребує жодного plist і жодного привілейованого встановлення взагалі: файли конфігурації оболонки. ~/.zshrc, ~/.zprofile та ~/.bash_profile запускаються кожного разу, коли відкривається відповідний новий сеанс терміналу, і одного доданого рядка — конвеєра до сценарію, експорту захопленого PATH, запуску фонового процесу — достатньо, щоб відновити точку опори кожного разу, коли ви відкриваєте Термінал, без нічого для завантаження в launchd і нічого для launchctl print. KnockKnock від Objective-See включає саме цю категорію у своє сканування, перераховану поряд із агентами запуску та елементами входу як файли конфігурації оболонки, з тієї самої причини, що стосується цієї статті: вона досить поширена та досить негламурна, щоб її варто перевірити, а не припускати.

Термінал — швидке читання, а не заміна фактичного читання
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-screen

Де FireAI підходить, а де свідомо ні

Скажу прямо: FireAI не сканує /Library/LaunchDaemons, не читає файли plist і не намагається виявити новий елемент входу чи профіль конфігурації. Це відмінна дисципліна від того, чим займається FireAI, і створені спеціально для неї інструменти — серед них KnockKnock і BlockBlock — уже добре виконують цю роботу. Те, за чим спостерігає FireAI, — це крок, який приходить після збереження, і який зрештою потрібен кожному з цих механізмів, якщо він збирається бути корисним тому, хто його встановив: підключення до мережі. LaunchAgent, який тихо працює під час кожного входу в систему, але ніколи не спілкується з мережею, з точки зору мережевого брандмауера є невидимим, а також, на практиці, набагато менш корисним для зловмисника. У той момент, коли він відкриває сокет, правила FireAI для кожного додатка застосовуються до нього, як і до будь-якого іншого процесу: незнайомий бінарний файл із підписом або без знаку, що встановлює своє перше підключення, викликає підказку з міркуваннями моделі на пристрої, показаними простою мовою, і кожне рішення стає видимим, скасованим і експортованим у вигляді текстового правила.

Чесний спосіб об’єднати дві дисципліни: перевірте розташування в цій статті за графіком, який відповідає вашій толерантності до ризику — щомісяця це розумно для більшості людей, щотижня, якщо ви встановлюєте багато програмного забезпечення сторонніх розробників — і дозвольте мережевому інструменту нести навантаження між ними, припускаючи, що все, що зберігалося тихо, зрештою доведеться говорити, щоб досягти того, кому він відповідає.

Яке місце тут посідають FireAI та 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 — це власний продукт HisnLabs: ШІ-фаєрвол, який працює безпосередньо на вашому Mac. Він показує простою мовою кожне з’єднання, яке встановлюють ваші застосунки, і дає вам вирішувати, що покидає ваш Mac, — його ШІ працює локально, тож ваш трафік ніколи не надсилається ні нам, ні будь-кому іншому. Команда дослідників безпеки HisnLabs — саме вона підтримує точність цих рішень: каталогізує, які домени є звичайною телеметрією, а які — справжнім сервісом, відстежує країну та мережу за з’єднанням і навчає локальну модель (функцію Autopilot) на реальних шаблонах трафіку — і нічого з цього не покидає ваш Mac.

Ви можете почитати про технічні рішення, що лежать в його основі, або спробувати FireAI протягом 17 днів на сторінці FireAI від HisnLabs.

Джерела