Содержание статьи
Проникнув в операционную систему, любой уважающий себя вредонос пытается закрепиться в ней. Как минимум вредоносная программа стремится обеспечить собственный запуск после перезагрузки ОС. Этот процесс называется persistence. В macOS существует немало способов закрепления в системе, и некоторые из них перекочевали в нее еще из BSD, например использование cron. Однако некоторые persistence-методы вполне оригинальные, и о них мы чуть позже поговорим подробнее.
Cron
Cron — это планировщик задач Unix-подобных систем, который позволяет настроить выполнение команд в назначенное время. Все запланированные задачи хранятся в кронтаб‑файле (crontab
), а все задачи называют кронджобами (cronjobs
). Использование крона для закрепления в системе не так распространено, как остальные методы, но его активно используют некоторые вредоносы, например Janicab.
Janicab
Janicab (Python/Janicab.A) — это вредоносная программа, созданная APT-группировкой DeathStalker. Этот трой был впервые обнаружен в 2013 году. Основная функция этой вредоносной программы — шпионаж за зараженными системами и передача собранных данных на управляющий сервер. Троян распространялся через рассылку вредоносных документов по email. Janicab — один из немногих вредоносов, использующих cron для персистенса. Рассмотрим фрагмент этой программы:
""" add to crontab"""#save the current crontab filesubprocess.call("crontab -l > /tmp/dump",shell=True)#seek file if runner is in itinfile = open("/tmp/dump","r")if not "runner.pyc" in infile.read(): #add the script to crontab subprocess.call("echo "* * * * * python ~/.t/runner.pyc " >>/tmp/dump",shell=True) #import the new crontab subprocess.call("crontab /tmp/dump",shell=True) subprocess.call("rm -f /tmp/dump",shell=True)infile.close()
Это часть Janicab, которая отвечает за сохранение в системе. Скрипт первым делом сохраняет существующий кронтаб во временный файл /
и проверяет, присутствует ли команда запуска вредоноса в планировщике задач. Если нет, скрипт добавляет в кронтаб новую запись *
и удаляет временный файл.
Агенты и демоны
LaunchAgents и LaunchDaemons — механизмы macOS для автозапуска задач через систему инициализации launchd. LaunchAgents запускаются от имени пользователя после логина в систему, а LaunchDaemons — от имени root. Агенты лежат в папках /
или /
, а демоны — в /
, при этом для их запуска нужны root-права. Хочу также отметить, что существуют и системные LaunchAgents и LaunchDaemons. Они, в свою очередь, хранятся в директориях /
и /
. Сами агенты и демоны реализованы в виде PLIST-файла.
info
Property List — это файл с расширением .
, который хранит в себе конфигурацию и метаданные для конкретного приложения. Эти файлы бывают представлены в трех форматах: XML, JSON и бинарный. Если конкретно говорить о теме персистенса, то файлы PLIST выступают как инструкции для launchd, указывающие, как и когда программу запустить.
RustDoor
RustDoor (Trojan.MAC.RustDoor) — это написанный на Rust троян, который был обнаружен в феврале 2024 года. RustDoor распространялся под видом обновления для Visual Studio. Основная цель вредоноса — предоставление удаленного доступа к зараженной машине. RustDoor существует в нескольких вариантах: в первом, например, он использует LaunchAgent, чтобы закрепиться в системе.
После того как RustDoor заражает macOS, он создает PLIST в папке /
, чтобы стартовать при каждом логине пользователя:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.apple.visualstudio</string> <key>Program</key> <string>[путь к вредоносной программе]</string> <key>KeepAlive</key> <dict> <key>SuccessfulExit</key> <false/> </dict> <key>RunAtLoad</key> <true/></dict></plist>
RunAtLoad
запускает при входе в систему скрипт, который находится по ключу Program
.
<key>RunAtLoad</key>
В случае если процесс будет убит, ключ KeepAlive
перезапустит программу.
<key>KeepAlive</key>
Login Items
А вот и еще один метод персистенса, любезно представленный вирусописателям компанией Apple. Главное его отличие от LaunchAgent и LaunchDaemon в том, что Login Items запускаются только для конкретного пользователя. Чтобы увидеть список Login Items, нужно перейти в раздел системных настроек System Preferences → General → Login Items.

Вот скриншот Login Items на моем личном ноутбуке. Каждый раз, когда я авторизуюсь в системе, будет запускаться программа Notion. Я могу нажать +, чтобы добавить новый Login Item, или –, чтобы удалить его.
Щелкнув правой клавишей мыши на любом Login Item, я могу открыть его в Finder и тем самым выяснить полный путь к этой программе.

Windtail
Windtail (OSX.Windtail) — это вредонос, разработанный APT-группировкой WindShift. Трояна обнаружили в 2018 году, и он связан с атаками на правительственные структуры Ближнего Востока. Windtail был создан с целью выгрузки данных на серверы злоумышленников и распространялся в основном с помощью spear-фишинга: атакующие отправляли письма, замаскированные под рабочие материалы.
Когда Windtail попадает в систему, он добавляет себя в список элементов Login Items. Рассмотрим один из фрагментов кода Windtail.

Первым делом Windtail пытается создать объект NSURL
, который будет хранить в себе абсолютный путь к файлу вредоноса. Затем троян вызывает функцию LSSharedFileListCreate
, чтобы создать объект LSSharedFileList
. Потом вызывается функция LSSharedFileListInsertItemURL
и ей передается ранее созданный объект в качестве аргумента. Благодаря всем этим махинациям в Login Items добавляется исполняемый файл Windtail.
info
Почему в коде использовался объект NSURL
? Функции вроде LSSharedFileListInsertItemURL
ожидают на вход объект NSURL
, так как это часть Core Foundation и Launch Services API. Передача пути в виде строки потребовала бы дополнительного преобразования, а NSURL
уже готов к использованию.
Динамические библиотеки
Динамические библиотеки — это файлы c расширением .
, в них хранится код, который другие программы могут загружать и использовать во время исполнения. Благодаря библиотекам разработчикам различных программ не приходится писать один и тот же код для реализации типичных функций.
Динамические библиотеки могут использоваться вредоносными программами как метод персистенса. Принцип довольно прост: первым делом вредонос находит подходящую для его целей легитимную программу. Эта программа в любом случае будет использовать какую‑нибудь библиотеку, поэтому троян подгружает вредоносную библиотеку к этой легитимной программе. Новый процесс впоследствии не создается, так как вредоносная программа подгружается в уже работающий процесс. Ну а поскольку содержащая вредоносную нагрузку библиотека будет загружена легитимным и доверенным процессом, этот способ персистенса считается более скрытным, чем остальные упомянутые методы.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»