Атака на цепи поставок или атака с эксплуатацией доверия к сторонней организации (supply-chain attacks) — очень эффективный способ распространения вредоносного программного обеспечения в целевые организации. Это связано с тем, что при атаках на цепи поставок злоумышленники пользуются доверительными отношениями между производителем/поставщиком и клиентом, чтобы атаковать организации и отдельных лиц по различным мотивам. Червь Petya/Nyetya/NePetya, который был выпущен в сеть в начале 2017 года, показал насколько масштабны эти типы атак. Часто, как и в случае с Petya, исходный вектор атаки может оставаться скрытым в течение некоторого времени.

Недавно исследователи Talos заметили случай, когда серверы загрузки, используемые компанией-разработчиком для распространения легитимного пакета программного обеспечения, были использованы для загрузки вредоносного ПО на компьютеры ничего неподозревающих жертв. В течение некоторого периода версия CCleaner 5.33, распространяемая Avast, содержала многоступенчатую вредоносную нагрузку. 5 миллионов новых пользователей загружают CCleaner в неделю. Учитывая потенциальный ущерб, который может быть вызван сетью зараженных компьютеров подобного размера, решено было действовать быстро. 13 сентября 2017 года Cisco Talos уведомила Avast. В следующих разделах будут обсуждаться конкретные детали, касающиеся этой атаки.

Технические подробности


CCleaner — утилита, которая включает такие функции, как очистка временных файлов, анализ системы, определение способов оптимизации производительности, а также более упрощенный способ управления установленными приложениями.


Рисунок 1: Снимок экрана CCleaner 5.33

13 сентября 2017 года, проведя бета-тестирование клиентов новой технологией обнаружения эксплойтов, Cisco Talos обнаружила исполняемый файл, который определялся как вредоносная программа. Это был установщик CCleaner v5.33 с легитимных серверов загрузки CCleaner. Talos провёл первоначальный анализ, чтобы определить, что заставляет систему защиты блокировать CCleaner. Они определили, что, хотя загруженный исполняемый файл был подписан с использованием действительной цифровой подписи Piriform, CCleaner не был единственным приложением, которое было загружено. Во время установки CCleaner 5.33 32-разрядный двоичный файл CCleaner, также содержал вредоносную нагрузку с возможностью использовать алгоритм генерации домена (DGA), а также функции выдачи команд и управления (Command and Control — C2).

При просмотре страницы истории версий на сайте загрузки CCleaner выяснилось, что версия (5.33) была выпущена 15 августа 2017 года. 12 сентября 2017 года была выпущена версия 5.34. Версия, содержащая вредоносную нагрузку (5.33), распространялась между этими датами. Эта версия была подписана с использованием действительного сертификата, который был выпущен для компании Piriform Ltd, которую недавно приобрел Avast, компанией Symantec и действителен до 10.10.2018.


Рисунок 2: Цифровая подпись CCleaner 5.33

Также был обнаружен второй образец установщика, связанный с этой угрозой. Этот образец также был подписан с использованием действительного цифрового сертификата, однако отметка времени подписания была приблизительно на 15 минут позднее подписания первоначальной сборки.

Наличие действительной цифровой подписи в вредоносном двоичном коде CCleaner может указывать на значительную проблему, которая была причиной нарушений в процессе разработки или подписания. В идеале этот сертификат должен быть отозван. При создании нового сертификата необходимо следить за тем, чтобы злоумышленники не находились в среде, в которой можно было бы скомпрометировать новый сертификат. Только в процессе расследования возможно было собрать подробную информацию о масштабах этой проблемы и о том, как наилучшим образом ее решить.

В двоичном коде CCleaner был найден следующий артефакт компиляции:
S:\workspace\ccleaner\branches\v5.33\bin\CCleaner\Release\CCleaner.pdb

Учитывая наличие этого артефакта компиляции, а также тот факт, что двоичный код был подписан цифровой подписью с использованием действительного сертификата, вполне вероятно, что злоумышленник из вне скомпрометировал часть среды разработки или сборки и использовал этот доступ для вставки вредоносного кода в сборку CCleaner, которая была выпущена организацией. Также возможно, что инсайдер, имеющий доступ к средам разработки или сборки внутри организации, намеренно включал вредоносный код или имел скомпрометированную учетную запись, которая позволяла злоумышленнику изменять код.

Важно отметить, что, хотя предыдущие версии установщика CCleaner в настоящее время доступны на сервере загрузки, версия, содержащая вредоносные файлы, была удалена и больше не доступна.

Процесс установки вируса


'__scrt_get_dyn_tls_init_callback' был изменен для запуска кода CC_InfectionBase (0x0040102C) с целью перенаправления потока выполнения кода на вредоносный до продолжения обычных операций CCleaner. Вызываемый код отвечает за дешифрование данных, которые содержат два уровня вредоносной нагрузки: загрузчик PIC (позиционно-независимого программного кода) и DLL-файл.

Используя HeapCreate (HEAP_CREATE_ENABLE_EXECUTE, 0,0), создаётся исполняемая куча. Содержимое расшифрованных данных, содержащих вредоносное ПО, копируется в кучу, исходные данные стираются. Затем вызывается PE-загрузчик и начинается его работа. Как только процесс заражения начался, двоичный код стирает области памяти, в которых ранее содержался PE-загрузчик и DLL-файл, освобождает ранее выделенную память, уничтожает кучу и продолжает исполняться с обычными операциями CCleaner.

PE-загрузчик использует методы позиционно-независимого кодирования, чтобы найти DLL-файл в памяти. Затем он переносит DLL в исполняемую память и вызывает DLLEntryPoint, чтобы начать его выполнение.

CCBkrdr_GetShellcodeFromC2AndCall отвечает за многие из вредоносных операций, обнаруженные Talos при анализе этого вредоносного ПО. Во-первых, он записывает текущее системное время. Затем он задерживает выполнение вредоносного кода на 601 секунду, вероятно, с целью уклониться от автоматизированных систем анализа, которые настроены на проверку ПО на вирусы в отладчике в течение предопределенного периода времени. Чтобы реализовать эту функцию задержки, вредоносное ПО вызывает функцию, которая пытается выполнить ping 224.0.0.0 с использованием таймаута delay_in_seconds, установленного на 601 секунду. Затем он определяет текущее системное время, чтобы узнать прошло ли 600 секунд. Если это условие не выполняется, вирус завершает выполнение, в то время как CCleaner продолжает выполняться. В ситуациях, когда вредоносное ПО не может выполнить IcmpCreateFile, оно возвращается к использованию функции Sleep () для реализации той же функции задержки. Вредоносная программа также сравнивает текущее системное время со значением, хранящимся в следующем разделе реестра:

HKLM \ SOFTWARE \ Piriform \ Agomo: TCID

Если время, хранящееся в TCID, ещё не пришло, вирус также прекратит выполнение.


Рисунок 3: Процедура задержки

Затем проверяются привилегии, назначенные пользователю. Если текущий пользователь, не является администратором, вредоносное ПО прекратит выполнение.


Рисунок 4: Проверка привилегий

Если у пользователя, запустившеего вредоносное ПО, есть права администратора, на зараженной системе активируется SeDebugPrivilege. Затем вредоносное ПО считывает значение «InstallID», которое хранится в следующем разделе реестра:

HKLM \ SOFTWARE \ Piriform \ Agomo: Muid

Если это значение не существует, вредоносное ПО создает его с помощью '((rand () * rand () ^ GetTickCount ())'.

Как только вышеупомянутые действия были выполнены, вирус начинает сбор системной информации, которая позже передается на сервер C2. Системная информация хранится в следующей структуре данных:


Рисунок 5: Структура данных CCBkdr_System_Information

После сбора информации о системе она зашифровывается и кодируется с использованием модифицированного Base64. Затем вредоносное ПО устанавливает связь с командным сервером (C2), как описано в следующем разделе.

Command and Control (C2)


Как только ранее упомянутая системная информация была собрана и подготовлена для передачи на сервер C2, начинается попытка передать её с использованием запроса POST HTTPS на 216[.]126[.]225[.]148.

Данные, полученные с сервера C2, проверяются, чтобы подтвердить, что они находятся в правильном формате для использования в CCBkdr_ShellCode_Payload. Пример показан ниже:


Рисунок 6: Структура данных CCBkdr_ShellCode_Payload

После установки вируса продолжаются обычные операции CCleaner. Ниже приведена диаграмма, описывающая работу этого вредоносного ПО на высоком уровне:


Рисунок 7: Схема процесса запуска вредоносной нагрузки

Алгоритм генерации домена


В ситуациях, когда основной сервер C2 не возвращает ответ на запрос HTTP POST, описанный в предыдущем разделе, вредоносная программа использует алгоритма DGA. В этом случае он основан на времени и может быть рассчитан с использованием значений текущего года и месяца. Ниже приведен список доменов DGA:


Рисунок 8: генерация доменов для 12 месяцев

Вредоносная программа будет инициировать DNS-поиск для каждого домена, генерируемого алгоритмом DGA. Если DNS-поиск не приведет к возврату IP-адреса, этот процесс будет продолжен. Вредоносная программа выполнит DNS-запрос активного DGA-домена и ожидает получить два IP-адреса с сервера доменных имен. Затем вредоносная программа вычислит вторичный сервер C2, выполнив серию битовых операций с полученными IP-адресами и объединив их для определения нового фактического адреса командного сервера. Диаграмма, показывающая этот процесс, приведена ниже:


Рисунок 9: Определение адреса командного сервера

Cisco Talos во время анализа определила, что DGA-домены не были заняты, поэтому они были зарегистрированы и заблокированы, чтобы злоумышленники не могли использовать их в своих целях.

Потенциальный ущерб


Воздействие этой атаки может быть серьезным, учитывая чрезвычайно большое число возможных систем. CCleaner утверждают, что по состоянию на ноябрь 2016 года он имеет более 2 миллиардов загрузок по всему миру и, как сообщается, прирост новых пользователей равен 5 миллионам в неделю.


Рисунок 10: Статистика CCleaner

Системы, на которые производилась установка CCleaner в период распространения вируса должны быть восстановлены до состояния на 15 августа 2017 года или переустановлены. Пользователи также должны обновиться до последней доступной версии CCleaner, чтобы избежать заражения. На момент написания этой версии была версия 5.34. Важно отметить, что, согласно странице загрузки CCleaner, бесплатная версия CCleaner не предоставляет автоматические обновления, поэтому это необходимо сделать вручную.

При анализе телеметрических данных Cisco Umbrella о доменах, связанных с этой атакой, Talos определил значительное количество систем, которые выполняли соответствующие DNS-запросы. Поскольку эти домены никогда не регистрировались, разумно сделать вывод о том, что единственной причиной является этот вирус. Только домены, относящиеся к августу и сентябрю (что коррелирует со временем, когда эта угроза была активна), показывают значительную активность.


Рисунок 11: Активность июльского DGA-домена

Как упоминалось ранее, версия CCleaner, которая включала это вредоносное ПО, была выпущена 15 августа 2017 года. Следующий график показывает значительное увеличение активности DNS, связанной с DGA-доменом, используемым в августе 2017 года:


Рисунок 12: Активность для домена в августе 2017 года


Рисунок 13: Активность для домена в сентябре 2017 года

После обращения к Avast было замечено, что C2 сервер, указанный по умолчанию, стал недоступным для зараженных систем. В результате мы увидели значительное увеличение количества запросов, направленных на DGA-домены.


Рисунок 14: Трафик после отключения сервера

Стоит также отметить, что на 18 сентября антивирусное обнаружение этой угрозы остается очень низким (1/64).


Рисунок 15: Проверка обнаружения вируса

Ещё причины для беспокойства


Позднее во время нашего исследования нам был предоставлен архив, содержащий файлы, хранящиеся на сервере C2. Наша исследовательская деятельность была отражена в содержимом базы данных MySQL, включенной в архивные файлы, что подтвердило подлинность данных.

При анализе кода с сервера C2 сразу выделяется список организаций, на которые была нацелена доставка загрузчика второго уровня. Основываясь на обзоре базы данных отслеживания C2, которая охватывает только четыре дня в сентябре, мы можем подтвердить, что по меньшей мере 20 машин жертв были заражены специализированными вредоносными нагрузками. Ниже приведен список доменов, на которые атакующие пытались настроить таргетинг. Не для всех компаний, идентифицированных в файле .php, был замечен обмен с С2 сервером.


Рисунок 16

PHP скрипт сравнивает системные маяки, полученные с заражённой машины, по трём значениям: $DomainList, $IPList и $HostList. Это необходимо для определения того, должна ли зараженная система доставлять вредоносную нагрузку Stage 2. Ниже приведен сжатый PHP-код, который демонстрирует это:


Рисунок 17

База данных C2 содержала две таблицы: одну, описывающую все машины, которые «общались» с сервером, и описание всех машин, получивших загрузку Stage 2. Причем обе из них были датированы с 12 сентября по 16 сентября. За этот период времени на сервер C2 было отправлено более 700 000 машин, и более 20 машин получили Stage 2 нагрузку. Важно понимать, что целевой список может быть изменён и был изменён в течение периода, когда сервер был активен для заражения целевых организаций.

Во время компрометации вредоносное ПО периодически связывалось с сервером C2 и передавало информацию о зараженных системах. Эта информация включала IP-адреса, время, имя хоста, домен, списки процессов и прочее. Вероятно, эта информация использовалась злоумышленниками для определения того, на какие машины таргетироваться на последних этапах атаки.

Основные данные подключения хранятся в таблице «Сервер». Вот пример для одного из узлов Talos в этой таблице базы данных:


Рисунок 18

А также список установленных программ.


Рисунок 19

И список процессов.


Рисунок 20

Вторая таблица базы данных содержала дополнительный набор данных, связанный с системами, которым фактически была доставлена нагрузка Stage 2. Эта таблица содержала аналогичную информацию, структура которой показана ниже:


Рисунок 21

Основываясь на анализе таблицы, очевидно, что эта инфраструктура предоставляет злоумышленникам доступ ко множеству разных целей. Учитывая фильтрацию на сервере C2, злоумышленники могут добавлять или удалять домены в любой момент времени в зависимости от среды или организаций, на которые они нацелены. На скриншоте ниже показано количество записей, которые содержались в таблице базы данных, используемой для хранения профилей систем:


Рисунок 22

На следующем снимке экрана показано количество затронутых правительственных систем по всему миру.


Рисунок 23

Уязвимые системы с доменом, содержащим слово «банк»:


Рисунок 24

Это демонстрирует уровень доступа для злоумышленников, полученный посредством использования этой инфраструктуры, а также подчеркивает серьезность и потенциальное воздействие этой атаки.

CODE REUSE


Talos рассмотрел заявления от исследователей Лаборатории Касперского о совпадении кода с образцами вредоносных программ, которые, как известно, используются Group 72. Хотя это никоим образом не является доказательством, мы можем подтвердить совпадение и согласны с тем, что это важная информация.

Слева: 2bc2dee73f9f854fe1e0e409e1257369d9c0a1081cf5fb503264aa1bfe8aa06f (CCBkdr.dll)

Справа: 0375b4216334c85a4b29441a3d37e61d7797c2e1cb94b14cf6292449fb25c7b2 (Missl backdoor — APT17 / Group 72)


Рисунок 25

ВЫВОД


Атаки на цепи поставок растут по скорости и сложности. В этом конкретном примере злоумышленник разработал систему, которая, как представляется, специально ориентирована на технологические компании, чтобы скомпрометировать огромное количество машин. Это усиливает обеспокоенность этими событиями и также подтверждает рекомендацию о том, что пользователи, загрузившие CClenaer в период заражения, должны не просто удалить заражённую версию CCleaner или обновиться до последней версии, но также должны восстановить данные из резервных копий, чтобы гарантировать полное удаление вредоносных программ.

Ниже приведены индикаторы компроментации, связанные с этой атакой.

File Hashes
6f7840c77f99049d788155c1351e1560b62b8ad18ad0e9adda8218b9f432f0a9
1a4a5123d7b2c534cb3e3168f7032cf9ebf38b9a2a97226d0fdb7933cf6030ff
36b36ee9515e0a60629d2c722b006b33e543dce1c8c2611053e0651a0bfdb2e9

DGA Domains
ab6d54340c1a[.]com
aba9a949bc1d[.]com
ab2da3d400c20[.]com
ab3520430c23[.]com
ab1c403220c27[.]com
ab1abad1d0c2a[.]com
ab8cee60c2d[.]com
ab1145b758c30[.]com
ab890e964c34[.]com
ab3d685a0c37[.]com
ab70a139cc3a[.]com

IP Addresses
216[.]126[.]225[.]148

Installer on the CC: dc9b5e8aa6ec86db8af0a7aa897ca61db3e5f3d2e0942e319074db1aaccfdc83 (GeeSetup_x86.dll)

64-bit trojanized binary
128aca58be325174f0220bd7ca6030e4e206b4378796e82da460055733bb6f4f (EFACli64.dll)

32-bit trojanized binary: 07fb252d2e853a9b1b32f30ede411f2efbb9f01e4a7782db5eacf3f55cf34902 (TSMSISrv.dll)

DLL in registry: f0d1f88c59a005312faad902528d60acbf9cd5a7b36093db8ca811f763e1292a

Registry Keys:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\WbemPerf\001
HKLM\Software\Microsoft\Windows NT\CurrentVersion\WbemPerf\002
HKLM\Software\Microsoft\Windows NT\CurrentVersion\WbemPerf\003
HKLM\Software\Microsoft\Windows NT\CurrentVersion\WbemPerf\004
HKLM\Software\Microsoft\Windows NT\CurrentVersion\WbemPerf\HBP