Несколько дней назад в списке рассылки Full Disclosure появилось сообщение об интересной вредоносной программе для Linux. Это очень любопытный образец – не только потому, что он предназначен для 64-разрядных платформ Linux и скрывает свое присутствие в системе с помощью хитроумных методов, но прежде всего из-за необычного функционала, связанного с заражением сайтов, размещенных на подвергшемся атаке HTTP-сервере. Таким образом, мы имеем дело с вредоносной программой, используемой для организации drive-by загрузок вредоносного ПО.
Вредоносный модуль создан специально для версии ядра 2.6.32-5-amd64. Это новейший вариант ядра, используемый в 64-разрядной системе Debian версии Squeeze. Исполняемый файл имеет размер более 500 кБ, но это связано с тем, что он был скомпилирован с отладочной информацией. Возможно, модуль находится на стадии разработки: создается впечатление, что некоторые функции не до конца отлажены или, может быть, еще не полностью реализованы.
Вредоносная программа обеспечивает свой автозапуск, добавляя строку в скрипт /etc/rc.local:
1 |
insmod /lib/modules/2.6.32-5-amd64/kernel/sound/module_init.ko |
После своей загрузки в память руткит использует один из двух методов для получения kernel symbols и их записи в файл /.kallsyms_tmp:
1 2 |
/bin/bash -c cat /proc/kallsyms > /.kallsyms_tmp /bin/bash -c cat /boot/System.map-`uname -r` > /.kallsyms_tmp |
Затем он извлекает адреса памяти нескольких функций и переменных ядра и сохраняет их в памяти для дальнейшего использования.
Временный файл немедленно удаляется:
1 |
rm /.kallsyms_tmp -f |
Чтобы скрыть файлы и строку стартового скрипта, запускающую вредоносную программу, руткит перехватывает следующие функции ядра путем сплайсинга или замены адреса в памяти на указатели собственных вредоносных функций руткита:
1 2 3 4 |
vfs_readdir vfs_read filldir64 filldir |
В дополнение к сокрытию собственного модуля вредоносная программа пытается скрыть следующие файлы и потоки:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
zzzzzz_command_http_inject_for_module_init zzzzzz_write_command_in_file module_init.ko sysctl.conf /usr/local/hide/first_hide_file/* /ah34df94987sdfgDR6JH51J9a9rh191jq97811/* backconnect_command_thread_name new_backconnect_command_thread_name read_command_http_inject_thread_name write_startup_command_thread_name write_se_linux_command_thread_name get_http_inj_from_server_thread_name |
Интересен механизм внедрения плавающего фрейма (iFrame): вредоносная программа подменяет системную функцию tcp_sendmsg, отвечающую за построение TCP-пакетов, собственной функцией. Таким образом, вредоносные фреймы внедряются в HTTP-трафик путем непосредственной модификации исходящих TCP-пакетов.
Для получения актуального внедряемого блока данных вредоносная программа соединяется с сервером управления (C&C), используя для аутентификации зашифрованный пароль.
Нам не удалось соединиться с сервером управления через порт, используемый вредоносной программой, однако вредоносный сервер все еще активен; на нем размещен и другой инструментарий для UNIX-подобных операционных систем, в частности, инструменты для очистки журналов (большое спасибо моему коллеге Давиду Якоби за предоставление этой информации).
До сих пор в большинстве сценариев drive-by атак механизм автоматического внедрения вредоносного кода был реализован с помощью простого PHP-скрипта. Но в данном случае мы имеем дело с гораздо более сложным механизмом – применением руткит-компонента режима ядра, использующего сложные технологии перехвата, что позволяет сделать процесс внедрения более прозрачным (незаметным) и низкоуровневым, чем когда-либо ранее. Этот руткит, который в данный момент находится на стадии разработки, демонстрирует новый подход к организации drive-by атак. Несомненно, можно ожидать появления других подобных вредоносных программ в будущем.
Превосходный подробный анализ этого руткита был недавно опубликован в блоге CrowdStrike.
Продукты «Лаборатории Касперского» детектируют данный руткит как
1 |
Rootkit.Linux.Snakso.a |
.
Новый руткит для 64-разрядной системы Linux: внедрение iframe