Содержание статьи
Проникнув в операционную систему, любой уважающий себя вредонос пытается закрепиться в ней. Как минимум вредоносная программа стремится обеспечить собственный запуск после перезагрузки ОС. Этот процесс называется 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 расширением .
, в них хранится код, который другие программы могут загружать и использовать во время исполнения. Благодаря библиотекам разработчикам различных программ не приходится писать один и тот же код для реализации типичных функций.
Динамические библиотеки могут использоваться вредоносными программами как метод персистенса. Принцип довольно прост: первым делом вредонос находит подходящую для его целей легитимную программу. Эта программа в любом случае будет использовать какую‑нибудь библиотеку, поэтому троян подгружает вредоносную библиотеку к этой легитимной программе. Новый процесс впоследствии не создается, так как вредоносная программа подгружается в уже работающий процесс. Ну а поскольку содержащая вредоносную нагрузку библиотека будет загружена легитимным и доверенным процессом, этот способ персистенса считается более скрытным, чем остальные упомянутые методы.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее