Анализ XZ backdoor в OpenSSH

Анализ XZ backdoor в OpenSSH

@dp4chat

В этом анализе мы рассмотрим поведение XZ backdoor внутри OpenSSH(по сути подведем итоги многочисленных исследований).

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

Основные находки

1. Anti-replay функция:   - Атакующий внедрил функцию против повторных атак, чтобы предотвратить захват или подмену связи backdoor.

2. Стеганография в x86 коде:   - Используется для скрытия публичного ключа. Это достигается за счет размещения информации внутри допустимых инструкций машинного кода.

3. Скрытие логов:  

- Backdoor скрывает несанкционированные подключения, подменяя логирование. Это позволяет злоумышленнику оставаться незамеченным.

4. Обход пароля и ключевой аутентификации:   - Позволяет любому злоумышленнику войти с любым паролем или ключом. Это значительно упрощает доступ к заражённому серверу.

5. Удалённое выполнение команд:   - Позволяет атакующему выполнять любые системные команды на заражённом сервере, предоставляя полный контроль над системой.

Детальный анализ:

Основные цели hook-функций:1. RSA_public_decrypt:  

- Основная цель.

Специально созданный RSA-ключ используется для взаимодействия с заражённым сервером.   2. RSA_get0_key:  

- Второстепенная цель. Также используется для манипуляций с RSA-ключами.3. EVP_PKEY_set1_RSA:  

- Не используется в текущей версии OpenSSH, но могла использоваться в старых версиях.

Подмена и обработка RSA-модуля:

Для взаимодействия с сервером атакующий создает специальный RSA-ключ, содержащий команды. Процесс реконструкции ключа следующий:

1. Чтение RSA-модуля:   - Извлечение и обработка модуля RSA, который содержит упакованный полезный код. 

  2. Проверка и дешифровка полезного кода:  

- Вычисление типа команды и проверка её подписи.Стеганография и восстановление публичного ключа:Атакующий использует стеганографию в x86 коде для скрытия публичного ключа:

1. Поиск и восстановление битов ключа:   - Анализ инструкций кода, каждая из которых содержит бит информации. Биты собираются для восстановления зашифрованного публичного ключа.

2. Дешифровка и проверка полезного кода:   - Использование алгоритма ChaCha20 для дешифровки полезного кода. Проверка подписи для подтверждения подлинности.

Функционирование RSA_public_decrypt hook

Атакующий создает специальный RSA-ключ, который используется как контейнер для команд. Структура RSA-ключа в OpenSSL включает экспоненту (E) и модуль (N). Backdoor извлекает и обрабатывает модуль RSA, что означает, что вредоносная нагрузка упакована внутри значения N. Специальный формат RSA-модуля позволяет правильно обработать его backdoor'ом:-

Формат данных модуля RSA:  - Заголовок полезной нагрузки содержит три поля (PartialCommand1, 2 и 3), которые используются для вычисления типа команды и проверки магического числа. Тип команды вычисляется по формуле: `PartialCommand3 + (PartialCommand2 * PartialCommand1)`.

Результат должен быть в пределах от 0 до 3. Если проверка проходит, код переходит к дешифровке полезной нагрузки и проверке подписи.


Извлечение публичного ключа ED448 с использованием стеганографии:

Для дешифровки и проверки данных полезной нагрузки backdoor использует публичный ключ ED448, извлеченный из бинарного файла. Первоначально казалось, что авторы backdoor сумели создать правильный публичный ключ до генерации приватного ключа, что невозможно. Но более глубокий анализ показал, что ключи были сгенерированы обычным способом, но с использованием стеганографии.Публичный ключ был разбросан внутри бинарного кода в виде допустимых инструкций. Восстановление ключа напоминает технику сканирования гаджетов в сценариях эксплуатации Return-Oriented Programming (ROP), где «гаджеты» — это инструкции register-register, каждая из которых содержит бит информации (1 или 0).

Алгоритм восстановления ключа:

Для восстановления ключа некоторые функции вызывают алгоритм «key rebuild» со следующими аргументами:- BitIndex: начальное значение, содержащее текущий индекс ключа для декодирования и указывающее, какой бит нужно установить в зашифрованной карте битов ключа.-

Total Instructions: количество инструкций register-register, которые нужно просканировать в текущей функции.- **Key Index**: конкретный индекс ключа, с которым работает функция. Это значение используется для предотвращения повторного сканирования той же функции.Алгоритм сканирует определенные функции backdoor от начала до конца, ищет инструкции register-register и декодирует значение BitIndex для извлечения правильного байтового индекса и бита, который нужно установить. По мере увеличения значения BitIndex, алгоритм устанавливает или пропускает бит в зависимости от соответствия инструкции критериям opcode.

Дешифровка полезной нагрузки и проверка подписи

Публичный ключ ED448 зашифрован с использованием алгоритма ChaCha20, где ключ и nonce являются результатом шифрования буфера, состоящего из нулей, с использованием нулей в качестве ключа и nonce. После дешифровки backdoor использует первые 32 байта публичного ключа для дешифровки тела полезной нагрузки, также зашифрованного ChaCha20.Дешифрованная полезная нагрузка содержит подпись оставшихся данных в заголовке. Для проверки подписи необходимо иметь приватный ключ. В сценарии атаки только автор backdoor имеет доступ к подписи и отправке полезных нагрузок на зараженный сервер.Backdoor также использует хэш SHA-256 публичного ключа сервера (полученного при начальном подключении SSH) для проверки соответствия текущему серверу, чтобы предотвратить replay-атаки.

Команды backdoor

Команда выбирается на основе результата вычислений в заголовке. Основные команды backdoor позволяют атакующему войти на сервер как root или обычный пользователь и выполнить системные команды. В зависимости от команды backdoor может:1. Обход аутентификации SSH:   - Команды 0 и 1 включают возможность входа как root или любой другой пользователь с любым паролем или ключом, при этом могут быть отключены модули Pluggable Authentication Modules (PAM).2. Удалённое выполнение команд через system:   - Команда 2 извлекает строку команды из данных полезной нагрузки и выполняет её на машине с использованием функции system. Атакующий может указать ID пользователя и группы, под которыми будет выполнена команда.3. Закрытие сессии pre-auth:   - Команда 3 завершает сессию, чтобы скрыть следы активности.

Скрытие логов

Backdoor может скрывать логи, подменяя сообщения о подключениях с помощью функции setlogmask, которая игнорирует все сообщения syslog, и фильтруя сообщения на основе предварительно заданного дерева префиксов. Это позволяет скрыть успешные подключения, заменяя их на сообщения о неудачных попытках аутентификации.

Report Page