Компания FortiGuard Labs неоднократно предупреждала организации о том, что разработчики вымогательского ПО все чаще выбирают в качестве мишени Linux-системы. Поэтому не стало неожиданностью сообщение о том, что новый вариант Royal Ransomware начал атаковать Linux-машины.
Royal Ransomware
Функциональность Linux-версии Royal Ransomware очень похожа на версию для Windows. Однако она включает некоторые дополнительные функции для поражения виртуальных машин. Образец, который мы проанализировали, предоставлял следующие параметры командной строки:
- -id <32-символьная строка>: 32-символьная идентификационная строка, добавляемая к URL-адресу в примечании о выкупе, идентифицирует цель. Это обязательный параметр, и без него программа выкупа не запускается.
- -ep <процент>: этот параметр определяет часть каждого целевого файла, которая будет зашифрована. Многие операторы ransomware применяют стратегии оптимизации производительности, которые не шифруют весь файл, что позволяет ransomware работать быстрее. В данном примере мы обнаружили простую реализацию такой стратегии. Файлы размером менее 5 245 000 байт всегда шифруются на 100%. Для больших файлов, если используется параметр -ep, обычные и зашифрованные секции чередуются таким образом, чтобы достичь заранее выбранного процента шифрования.
- -stopvm: Эта функция останавливает работу виртуальных машин на целевой системе, вероятно, чтобы позволить программе-выкупу снять блокировку с соответствующих файлов и зашифровать их.
- -vmonly: Название этого параметра указывает на то, что он шифрует только виртуальные машины. Однако в проанализированном образце этот параметр ничего не делал. Возможно, эта функция находится в стадии реализации.
- -fork: Этот параметр определяет, следует ли главному процессу выполнить форк и позволить дочернему процессу выполнить остальную работу.
- -log: Отправляет журналы в stdout.
Способность Linux-версии взаимодействовать с виртуальными машинами, похоже, является основным отличием от Windows-версий. В настоящее время реализована только функция -stopvm. Однако недоработанный параметр -vmonly указывает на то, что впереди еще много интересного.
1) Он составляет список виртуальных машин с помощью следующей команды оболочки:
1 | esxcli vm process list > list |
2) Затем он открывает созданный файл под названием 'list' и разбирает перечисленные 'World IDs'.
3) В дочернем процессе он выполняет следующую команду для каждого World ID:
1 | esxcli vm process kill --type=hard --world-id=%s |
Этот процесс отключает все запущенные виртуальные машины, позволяя программе-вымогателю зашифровать и эти машины.
Программа ransomware развертывается с помощью следующей команды:
# ./sample <целевая папка> -id <32-символьный идентификатор> [другие параметры командной строки].
Должна быть выбрана целевая папка. В противном случае образец завершится до шифрования. В рассмотренном нами образце нет списка исключений папок, что означает, что запуск ransomware в корневой папке с привилегиями root приведет к повреждению операционной системы. Эти признаки позволяют предположить, что ransomware выполняется либо вручную, либо с помощью программы-дроппера, которая указывает, какие папки должны быть зашифрованы. Простая схема выполнения выглядит следующим образом:
1) Тест шифрования: Программа выполняет тест шифрования, прежде чем делать что-либо еще. Вероятно, это функция обеспечения качества, чтобы убедиться, что шифрование файлов будет чистым и не приведет к их повреждению. Это может указывать на то, что объект угрозы серьезно относится к делу и хочет убедиться, что восстановление возможно.
2) Параметры командной строки: Программа анализирует параметры командной строки и сохраняет их значения до конца выполнения.
3) Инициализация пула потоков: Создается пул потоков для последующего выполнения шифрования. Отдельный поток создается для каждого ядра ЦП, которым располагает машина.
4) Поиск целевых файлов: функция search_files()запускается из выбранного корневого каталога и рекурсивно ищет файлы. Список исключений, показанный на рисунке 3, гарантирует, что файлы, которые были ранее зашифрованы, не будут зашифрованы снова и что записка о выкупе (readme) не будет зашифрована. Полный путь разрешенных файлов помещается в очередь, чтобы зачислить их для рабочих потоков.
5) Шифрование: Потоки в пуле потоков следят за очередью целевых файлов. Когда в очереди появляется какой-либо файл, рабочий поток извлекает его оттуда и начинает шифрование. Шифрование подробно описано в следующем разделе.
6) Переименование: На последнем этапе файлы переименовываются, чтобы включить .royal_u postfix
Рабочие потоки выполняют шифрование. Как только поток получает новый файл из очереди, он начинает процесс шифрования этого файла следующим образом:
1) Загружается открытый ключ RSA: Открытый ключ RSA был жестко закодирован в образце, который мы анализировали. Этот ключ используется для шифрования ключей AES, которыми шифруются файлы.
2) Генерируются случайные значения: Для каждого файла генерируется 32-байтовое случайное значение, которое служит ключом файла AES, и 16-байтовое значение, которое служит вектором инициализации для шифрования AES.
3) Ключ файла шифруется: Сгенерированный ключ файла шифруется с помощью открытого ключа RSA.
4) Файл шифруется: Ключ файла затем используется для шифрования файла с помощью алгоритма AES CBC. Если размер файла превышает 5245000 байт (~5 МБ), и был установлен параметр -ep, то поочередно шифруется только выбранный процент файла.
5) Ключ конкатенируется в зашифрованный файл: После завершения шифрования в файл конкатенируются следующие три значения:
a. Ключ зашифрованного файла: Расшифровщик, вероятно, загружает и расшифровывает этот ключ, чтобы расшифровать содержимое файла.
b. Оригинальный размер файла: Размер файла изменяется, чтобы вместить эту дополнительную информацию, тем самым сохраняя исходный размер файла для восстановления.
c. Значение -ep: Процентная доля файла, которая была зашифрована, также сохраняется для восстановления.
Indicators of Compromise
Onion domains
- http://royal2xthig3ou5hd7zsliqagy6yygk2cdelaxtni2fyad6dpmpxedid.onion
SHA256
- b57e5f0c857e807a03770feb4d3aa254d2c4c8c8d9e08687796be30e2093286c