Исследователи из команды Socket Threat Research обнаружили два связанных вредоносных пакета для языка программирования Go, которые более четырёх лет скрывались в экосистеме, маскируясь под популярную библиотеку для генерации UUID. Пакеты "github[.]com/bpoorman/uuid" и "github[.]com/bpoorman/uid" использовали тактику "типосквоттинга" (typosquatting), имитируя легитимные библиотеки "github.com/google/uuid" и "github.com/pborman/uuid". При этом они сохраняли заявленный функционал, но добавляли скрытую функцию-бэкдор для шифрования и передачи данных на внешний сервис.
Описание
Первый пакет был опубликован ещё в мае 2021 года и до сих пор доступен на официальном сайте для обнаружения пакетов Go "pkg.go.dev", а также через публичное зеркало модулей "proxy.golang.org". Второй пакет был удалён с "pkg.go.dev", но также остаётся кэширован в публичном зеркале. Оба пакета были переданы команде безопасности Go для удаления, а аккаунт издателя на GitHub - для блокировки.
Библиотеки UUID являются критически важным компонентом в экосистеме Go. Оригинальные пакеты от Google импортируются более чем 100 000 других пакетов и служат стандартом де-факто для создания уникальных идентификаторов пользователей, сессий, заказов и записей в базах данных. Именно эта популярность делает их привлекательной мишенью для атак на цепочку поставок (supply chain attacks).
Злоумышленники скопировали не только название, но и структуру легитимных библиотек. При беглом изучении README и API пакет выглядит совершенно нормально. Единственным видимым дополнением стала вспомогательная функция с обманчивым названием "Valid" ("Проверить"). На практике эта функция не выполняет валидацию, а является примитивом для эксфильтрации данных. Она шифрует переданные ей аргументы с использованием AES и отправляет их на сервис "dpaste.com" - аналог Pastebin - используя вшитый в код токен доступа API.
Анализ кода показывает, что функция "Valid" принимает строку "s" и байтовый срез "dst", объединяет их, шифрует алгоритмом AES в режиме CFB и передаёт зашифрованные данные на внешний сервер через HTTPS POST-запрос. Ключ шифрования формируется из жёстко заданного префикса и случайного суффикса. Важно отметить, что функция подавляет практически все возможные ошибки и использует короткий таймаут для HTTP-клиента. Это позволяет ей работать по принципу "отправил и забыл", оставаясь незаметной даже в высоконагруженных сервисах.
Угроза заключается в том, что функция крадёт ровно те данные, которые передаёт в неё разработчик. Если в коде приложения "Valid" используется для "проверки" идентификатора пользователя, email, токена сессии или конфигурационного параметра, эта информация будет украдена. Особенно опасным может быть использование такого пакета в средах непрерывной интеграции (CI) или развёртывания (CD), где он может получить доступ к долгоживущим токенам, ключам подписи или другим критическим секретам.
Аккаунт злоумышленника на GitHub под именем "bpoorman" имеет минимальный профиль и содержит всего один публичный репозиторий. Выбор публичного сервиса для вставок кода ("dpaste") в качестве точки сбора данных является осознанной тактикой. Это позволяет злоумышленнику смешать вредоносный трафик с обычной активностью разработчиков, избежать необходимости поддерживать собственную инфраструктуру и усложнить обнаружение утечки средствами защиты предприятия.
Данный инцидент демонстрирует растущую изощрённость атак на цепочки поставок. Эксперты предупреждают, что злоумышленники могут применять аналогичные схемы, маскируясь под другие ключевые утилиты для работы с логами, HTTP, JSON и т.д. Для защиты рекомендуется относиться к каждому новому зависимому пакету как к недоверенному, пока не будет доказано обратное. Командам следует тщательно проверять пути импорта, анализировать код на предмет неожиданных сетевых подключений или криптографических операций и регулярно сканировать проекты на наличие пакетов-имитаторов. Специальное внимание следует уделять средам сборки и развёртывания.
В качестве мер противодействия исследователи предлагают использовать инструменты безопасности, которые интегрируются в процесс разработки. Например, сканирование pull request'ов в реальном времени может помешать слиянию кода с подозрительными зависимостями. CLI-утилиты позволяют блокировать установку пакетов с рискованным поведением, таким как неожиданный сетевой доступ или выполнение скриптов после установки. Расширения для браузера могут предупреждать разработчиков о подозрительных пакетах прямо при просмотре документации. Внедрение подобных инструментов в ежедневные рабочие процессы помогает снизить риск случайного использования враждебных пакетов.
Индикаторы компрометации
Malicious Go Packages
- github.com/bpoorman/uuid
- github.com/bpoorman/uid
Threat Actor’s GitHub
- github.com/bpoorman
AES Key Prefix String
- 57a475a22da17139
HTTP header
- Authorization: Bearer 5bd4e8cb8165d4d2