Бэкдор в PyPI-пакете: TON-кошелёк пустеет при запуске клиента

Бэкдор в PyPI-пакете: TON-кошелёк пустеет при запуске клиента

Вредоносная версия библиотеки fragment-api-py для Python при создании клиента переводит все USDT и почти весь TON на кошелёк злоумышленника. Пакет служит клиентом маркетплейса Fragment в Telegram и хранит seed-фразу - набор слов, который восстанавливает доступ к кошельку. Затронуты все, кто поставил заражённую сборку. Средства уходят до выполнения пользовательского кода, поэтому в момент запуска списание ничем себя не выдаёт.

Описание

По данным SafeDep, заражённая сборка получила номер 14.4.2 и вышла 8 ноября 2026 года. Собрали её на базе 13.0.0, а не предыдущей 14.4.1: почти все файлы совпадали со старой версией. Номер подняли намеренно, чтобы обновление через pip выбирало именно эту сборку, а не ту, что уже стоит у пользователя. В исходном архиве правки появились ещё 12 октября, за месяц до публикации в индексе. Сравнить архив с прошлым релизом за это время мог любой, кто следит за пакетом.

Списание маскируется под штатную операцию консолидации средств. Функция использует блокировки и типы библиотеки, возвращает привычный результат и внешне не отличается от нормальной работы. Адрес получателя зашит в код жёстко: он не приходит из конфигурации и не зависит от окружения. USDT и TON уходят одним сообщением, а на кошельке остаётся только сумма на комиссии - 0,1 TON за перевод. Запас оставлен намеренно: без него перевод просто не пройдёт.

Срабатывает это при входе в клиент, ещё до пользовательского кода. Второй вызов перехватывает сценарии, где клиент создают без контекстного менеджера, то есть без блока, который открывает и закрывает соединение. Флаг и блокировка не дают списать средства дважды. Поэтому в истории кошелька нет повторяющихся переводов, которые сразу выдали бы подмену.

По истории кошелька получателя видно как минимум двух пострадавших. Крупнейшая потеря - 43,98 TON, второй кошелёк лишился заметно меньшей суммы. Первая кража произошла примерно через шесть часов после публикации пакета. Дальше средства с адреса вывели за вычетом сетевых комиссий, так что по тому же счёту их уже не отследить.

Путь релиза в PyPI выглядит необычно. Тега или коммита для 14.4.2 нет: теги в репозитории заканчиваются на v14.4.1, а публикация шла через рабочий процесс с API-токеном. Профиль сборки похож на локальные сборки мейнтейнера с Windows-машины в часовом поясе UTC+4. Это не доказывает, кто именно выложил пакет: подходят скомпрометированная машина, украденный токен и инсайдер.

Кто именно опубликовал заражённую сборку, не установлено. Исправленной версии в описании нет, а номер 14.4.2 ничем не отличается от обычного релиза: по нему подмену не заметить. Сколько ещё кошельков опустело, по истории одного адреса не сосчитать. Исследователи связывают публикацию с рабочим процессом, который использовал PyPI-токен: тега для релиза не было, а сборка совпадает с более старой версией 13.0.0.

Индикаторы компрометации

Комментарии: 0