Макось зла. Исследуем методы закрепления в macOS

Содержание статьи

  • Cron
  • Janicab
  • Агенты и демоны
  • RustDoor
  • Login Items
  • Windtail
  • Динамические библиотеки
  • DYLD_INSERT_LIBRARIES
  • Tiny FUD
  • Вывод

MacOS счи­тает­ся наибо­лее защищен­ной от вре­донос­ных прог­рамм. Тем не менее они не прос­то сущес­тву­ют, но еще и уме­ют эффектив­но зак­реплять­ся в сис­теме, исполь­зуя для это­го фун­кци­ональ­ные воз­можнос­ти самой macOS. В этой статье мы под­робно рас­смот­рим методы persistence-тро­янов для «маков» и при­ведем наг­лядные при­меры таких вре­доно­сов.

Про­ник­нув в опе­раци­онную сис­тему, любой ува­жающий себя вре­донос пыта­ется зак­репить­ся в ней. Как минимум вре­донос­ная прог­рамма стре­мит­ся обес­печить собс­твен­ный запуск пос­ле перезаг­рузки ОС. Этот про­цесс называ­ется 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, которая отве­чает за сох­ранение в сис­теме. Скрипт пер­вым делом сох­раня­ет сущес­тву­ющий крон­таб во вре­мен­ный файл /tmp/dump и про­веря­ет, при­сутс­тву­ет ли коман­да запус­ка вре­доно­са в пла­ниров­щике задач. Если нет, скрипт добав­ляет в крон­таб новую запись * * * * * python ~/.t/runner.pyc и уда­ляет вре­мен­ный файл.

 

Агенты и демоны

LaunchAgents и LaunchDaemons — механиз­мы macOS для авто­запус­ка задач через сис­тему ини­циали­зации launchd. LaunchAgents запус­кают­ся от име­ни поль­зовате­ля пос­ле логина в сис­тему, а LaunchDaemons — от име­ни root. Аген­ты лежат в пап­ках /Library/LaunchAgents или /Library/LaunchAgents, а демоны — в /Library/LaunchDaemons, при этом для их запус­ка нуж­ны root-пра­ва. Хочу так­же отме­тить, что сущес­тву­ют и сис­темные LaunchAgents и LaunchDaemons. Они, в свою оче­редь, хра­нят­ся в дирек­тори­ях /System/Library/LaunchAgents и /System/Library/LaunchDaemons. Сами аген­ты и демоны реали­зова­ны в виде PLIST-фай­ла.

info

Property List — это файл с рас­ширени­ем .plist, который хра­нит в себе кон­фигура­цию и метадан­ные для кон­крет­ного при­ложе­ния. Эти фай­лы быва­ют пред­став­лены в трех фор­матах: XML, JSON и бинар­ный. Если кон­крет­но говорить о теме пер­систен­са, то фай­лы PLIST выс­тупа­ют как инс­трук­ции для launchd, ука­зыва­ющие, как и ког­да прог­рамму запус­тить.

 

RustDoor

RustDoor (Trojan.MAC.RustDoor) — это написан­ный на Rust тро­ян, который был обна­ружен в фев­рале 2024 года. RustDoor рас­простра­нял­ся под видом обновле­ния для Visual Studio. Основная цель вре­доно­са — пре­дос­тавле­ние уда­лен­ного дос­тупа к заражен­ной машине. RustDoor сущес­тву­ет в нес­коль­ких вари­антах: в пер­вом, нап­ример, он исполь­зует LaunchAgent, что­бы зак­репить­ся в сис­теме.

Пос­ле того как RustDoor заража­ет macOS, он соз­дает PLIST в пап­ке /Library/LaunchAgents, что­бы стар­товать при каж­дом логине поль­зовате­ля:

<?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 рас­ширени­ем .dylib, в них хра­нит­ся код, который дру­гие прог­раммы могут заг­ружать и исполь­зовать во вре­мя исполне­ния. Бла­года­ря биб­лиоте­кам раз­работ­чикам раз­личных прог­рамм не при­ходит­ся писать один и тот же код для реали­зации типич­ных фун­кций.

Ди­нами­чес­кие биб­лиоте­ки могут исполь­зовать­ся вре­донос­ными прог­рамма­ми как метод пер­систен­са. Прин­цип доволь­но прост: пер­вым делом вре­донос находит под­ходящую для его целей легитим­ную прог­рамму. Эта прог­рамма в любом слу­чае будет исполь­зовать какую‑нибудь биб­лиоте­ку, поэто­му тро­ян под­гру­жает вре­донос­ную биб­лиоте­ку к этой легитим­ной прог­рамме. Новый про­цесс впос­ледс­твии не соз­дает­ся, так как вре­донос­ная прог­рамма под­гру­жает­ся в уже работа­ющий про­цесс. Ну а пос­коль­ку содер­жащая вре­донос­ную наг­рузку биб­лиоте­ка будет заг­ружена легитим­ным и доверен­ным про­цес­сом, этот спо­соб пер­систен­са счи­тает­ся более скрыт­ным, чем осталь­ные упо­мяну­тые методы.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *