Мы рассмотрели части двух вирусов, отвечающих за шифрование MFT. Это шифрование выполняется, если у программы-вымогателя есть права администратора.
Что делает NotPetya
В момент заражения (ещё под Windows) вирус записывает в начало диска код, который будет запущен после перезагрузки, а в определённые сектора - его конфигурацию, данные для сканирования и исходную MBR. Прежде всего, давайте посмотрим на сектор 0x20 диска, который является чем-то вроде «конфига» для конкретной машины.При заражении в сектор 0x20 записываются следующие значения: — Индикатор того, что MFT не зашифрован (значение 0) — EncryptionKey (случайная последовательность длиной 32 байта) — Nonce (случайная последовательность длиной 8 байт) — Персональный установочный ключ (случайная последовательность длиной 60 символов из алфавита «123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz») Случайные данные получаются с помощью функции CryptGenRandom, которая считается криптостойкой.
В сектор 0x21 со значением 0x07 записывается 512 байт. Исходный MBR записывается в сектор 0x22, в котором каждый байт подвергается операции XOR со значением 0x07. После первой перезагрузки MFT шифруется.
До этого: - читается сектор 0х20, — установлен флаг шифрования MFT (значение 1), — EncryptionKey копируется во временный буфер, — поле с EncryptionKey затирается нулевыми байтами - на диск записывается сектор 0х20, — прочитать сектор 0x21 (все 0x07), — его содержимое зашифровано с помощью EncryptionKey + Nonce, — на диск записывается сектор 0x21. Затем сектора MFT шифруются с использованием того же EncryptionKey + Nonce. Код алгоритма шифрования очень похож на алгоритм Salsa20, но есть отличия.
Вместо константы «расширить 32-байтовый k» используется константа «-1nvalid s3ct-id».
И до сих пор мне не удалось повторить результаты шифрования с использованием известного ключа.
Возможно у них где-то баг, который вроде бы подтверждается
эта почта .Алгоритм Salsa20 рассматривается настойчивый .
Когда все зашифровано, машина снова перезагружается, отображается текст с требованием выкупа и вас просят ввести ключ дешифрования.
Ключ должен представлять собой строку символов из набора «0123456789abcdef» длиной 32. Эта строка передается через некую функцию, которая принимает на вход произвольное количество байт и выводит 32 байта.
Предположительно это хеш-функция SPONGENT (нужно проверить).
Затем выходные данные обрабатываются одной и той же функцией 128 раз, и этот результат принимается как EncryptionKey. Для проверки правильности ключа делается попытка расшифровать содержимое сектора 0x21, и если ожидаемый открытый текст там есть (все 0x07), запускается процесс расшифровки MFT и восстановления MBR.
Могут ли злоумышленники расшифровать файлы пользователя?
По моему мнению, возможность восстановления после оплаты авторами не была предусмотрена.И вот почему:
- Персональный установочный ключ, который необходимо сообщить авторам вируса после выплаты выкупа, никак не связан с EncryptionKey. Оба являются случайными данными.
Получить другой от одного невозможно, если только злоумышленники не знают что-то о CryptGenRandom. Другой вариант — они должны отправить пару установочных ключей EncryptionKey+Personal на свой сервер, но о такой активности вроде никто не сообщил (да и в коде я этого не увидел, хотя это не исключено на 100%).
- Если я правильно угадал с хеш-функцией SPONGENT, то ключ дешифрования должен быть выходом хеша, и чтобы вычислить то, что должен ввести пользователь, этот хэш необходимо перевернуть (129 раз), что вряд ли осуществимо на современных технологиях.
- ? Размер EncryptionKey составляет 32*8 == 256 бит. Шестнадцатеричный ключ, введенный пользователем, имеет размер 32*4 == 128 бит. Любая операция может только уменьшить энтропию.
Из 32 шестнадцатеричных символов невозможно получить 32 байта с конкретными значениями.
Отличия от образца Petya 9 января 2016 г.
Петя не хотел заражать мою тестовую машину.
Возможно ему нужна сеть или что-то еще.
Пришлось выкинуть это из памяти.
У меня не было времени посмотреть код, формирующий используемые сектора из MBR, установленного вредоносным ПО, но я посмотрел скриншоты и код, который будет выполнен после перезагрузки.
Отличия:
- Используются сектора 0x36-0x39 (в отличие от 0x20-0x23 для NotPetya).
- Большинство сервисных функций (вывод текста, чтение/запись секторов) идентичны Petya.
- Есть функция и строки для отображения баннера с черепом.
NotPetya также имеет очень похожую функцию, но она, вероятно, никогда не вызывается, а строки обнуляются.
- Длина Личного установочного ключа — 90 символов (15 групп по 6 символов) против 60 у NotPetya. Используя алфавит из 58 символов, можно закодировать максимум 527 бит информации (против 351 у NotPetya).
- В дампе Petya показаны строки secp256k1 и secp192k1, что предполагает, что персональный установочный ключ получен из EncryptionKey и рассчитывается с использованием криптографии на основе эллиптических кривых.
- Ключ, введенный пользователем для начала расшифровки, должен представлять собой строку из алфавита «123456789abcdefghijkmnopqrstuvwxABCDEFGHJKLMNPQRSTUVWX» длиной 16 символов.
- Нет ничего похожего на SPONGENT (или любой другой хеш).
- Salsa20 использует исходную константу «расширить 32-байтовый k».
При этом код функций практически идентичен, и если код Petya, вероятно, был сгенерирован компилятором (сработала оптимизация на повторяющихся символах), то в NotPetya похоже просто заменили константы.
НеПетя:
Я бы предположил, что существовал еще один образец Petya, из которого NotPetya был создан путем замены констант и строк.
Еще раз повторю, что NotPetya скорее всего не предусматривал возможности расшифровки файлов своих жертв, но в Petya с этим все было хорошо.
Что касается самостоятельного восстановления диска, то это возможно.
Оба вируса имеют очень схожие ошибки в реализации алгоритмов шифрования, что приводит к возможности быстрого выбора ключа шифрования и восстановления всех зашифрованных данных.
В 2016 году исследователи описал метод восстановить данные, зашифрованные Petya, без уплаты выкупа.
УПД
Среди разных версий вредоносной программы Petya 2016 года, которая под разными цветами ( 1 , 2 ) выступал в дуэте с вымогателем Мишей, а также в так форме, следует обратить внимание на PetyaGoldenEye.malware , впервые опубликованное на VirusTotal в декабре прошлого года.
Код, который NotPetya записывает в начало диска при заражении и который запускается из MBR, чрезвычайно похож на код, написанный PetyaGoldenEye: SHA256:b5ef16922e2c76b09edd71471dd837e89811c5e658406a8495c1364d0d9dc690.
Обнаружены различия между NotPetya и PetyaGoldenEye:
- Изменены многие текстовые строки (исправлен текст выкупного сообщения, удалено изображение с черепом);
- Изменены смещения некоторых строк (начала строк «сдвинулись» из-за изменения размера сообщений);
- В функции по адресу 0000:86E0 перепрыгивается (никогда не выполняется) кусок кода, отвечающий за отображение баннера (мигающего «черепа и скрещенных костей») перед нажатием любой клавиши;
- Там цвет баннера поменяли с желтого (0xE) на красный (0xC), но баннер по-прежнему не показывается;
- По адресу 0000:848E удален вызов функции, очищающей буфер клавиатуры (заменен тремя инструкциями NOP) (не требуется, поскольку нажатия не предполагалось);
- В функции по адресу 0000:96D4 (расширение для Salsa20) начальное состояние строки заменяется с «расширить 32-байтовый k» на «-1nvalid s3ct-id»;
- В функции по адресу 0000:998E (перестановка для SPONGENT) было изменено начальное значение LFSR (сдвиговый регистр с линейной обратной связью); вместо 0x9E используется 0xA3.
Теперь давайте посмотрим на криптографию.
Хэш-функция ГУБКА
Код, реализующий SPONGENT, вероятно, был взят отсюда .Если в функции permute() заменить начальное значение переменной «lfsr» и переписать функцию Spongent() так, чтобы она принимала на вход не строку с нулевым завершением, а указатель на массив и длину массива , мы получим код, эквивалентный тому, который используется в NotPetya. Примечательно, что начальное значение LFSR == 0x9E (как описано в оригинальной спецификации для SPONGENT-256/256/16) дает 140 раундов, а начальное значение 0xA3, используемое в NotPetya, дает 152 раунда (криптостойкость немного увеличена).
Функция шифрования Salsa20
Код, реализующий Salsa20, вероятно, был позаимствован.отсюда .
Если в функции s20_expand32() заменить значение массива «o» и заменить тело функции s20_littleendian() на строку «return *(__int16*)b;», мы получим код, эквивалентный тому, который используется в NotPetya. Поскольку функция s20_littleendian() реализована некорректно (вероятно, из-за неправильного определения типа или ошибки 16-битного компилятора), значения двух из каждых четырех байтов в массиве "keystream" никак не используются.
.
Это фактически делает ключ шифрования 128-битным, а не 256-битным.
Однако полный перебор 128-битного ключевого пространства считается неразрешимой задачей на современном уровне технологий.
Выводы и предположения
Авторы Petya реализовали шифрование MFT с использованием сильных (хотя и не очень широко используемых) криптографических примитивов, код для которых был позаимствован из репозиториев на GitHub. Во время подготовки первой версии (Петя Рыжий) ошибки , и это позволило расшифровать данные без уплаты выкупа.В последующих версиях (Petya Green, PetyaGoldenEye) ошибки были частично исправлены, и осталась только ошибка преобразования типов, уменьшив эффективную длину ключа вдвое.
Предпринимались попытки реализовать атаку на исправленный версия , но они не привели к успеху.
Авторы NotPetya, вероятно, не имели доступа к исходному коду Petya и не могли внести в него необходимые изменения и перекомпилировать проект. За основу они взяли существующий код от PetyaGoldenEye, проанализировали его с помощью дизассемблера и внесли изменения с помощью шестнадцатеричного редактора.
Поиск способов вернуть файлы, зашифрованные NotPetya, продолжается.
Теги: #notpetya #petya #вирус-вымогатель #информационная безопасность
-
Hp Павильон Dm3T-1000
19 Oct, 24 -
Очереди И Блокировки. Теория И Практика
19 Oct, 24 -
Яндекс Будет Обрабатывать Электронные Чеки
19 Oct, 24 -
Продолжаем Разговор Об Индикаторах Раскладки
19 Oct, 24 -
Анализ Погоды Своими Руками
19 Oct, 24 -
25 Июля, Москва — Qiwi Ios Meetup
19 Oct, 24 -
Все О Триггерах В Oracle
19 Oct, 24