Неизвестные злоумышленники скомпрометировали легитимные пакеты MemTensor в npm и Python Package Index (PyPI). В них внедрили платформозависимые версии написанного на Go импланта sckit для Windows, Linux и macOS. Вредоносная программа похищала учетные данные и рабочую информацию разработчиков, после чего отправляла добытое на внешний сервер. Инцидент исследовали Aikido, SafeDep, Socket и StepSecurity. По набору приемов это атака на цепочку поставок: преступники использовали настоящие имена пакетов и штатные каналы публикации.

В npm пострадал пакет @memtensor/memos-cloud-openclaw-plugin. Вредоносными признаны версии 0.1.21, 0.1.23 и 0.1.25; версии 0.1.22 и 0.1.24 в основном отчете указаны как чистые. Go-пейлоад спрятали внутри интеграции с памятью для ИИ. Он запускался при старте шлюза агента и каждый раз, когда плагин обрабатывал событие извлечения воспоминаний. Пусковой модуль передавал исполняемому файлу окружение родительского процесса, а во время обращения к памяти еще и текст пользовательского промпта.
В PyPI вредоносный код попал в MemoryOS 2.0.34. Достаточно было импортировать модуль memos в приложение: пакет сразу запускал статически скомпонованный бинарный файл на Go. На момент основного отчета проект находился в карантине PyPI. Для npm тогда рекомендовали откат к @memtensor/memos-cloud-openclaw-plugin 0.1.20, для PyPI — к MemoryOS 2.0.33.
По данным Socket, sckit искал секреты npm, PyPI, GitHub, GitLab, AWS, HashiCorp Vault и SSH. Среди интересовавших его файлов названы.npmrc,.vault-token, id_ecdsa, credentials.db, access_tokens.json и stored_tokens. Параллельно имплант просматривал переменные окружения в поисках токенов аутентификации, паролей, API-ключей, закрытых ключей, сессионных cookie, строк подключения к базам данных и брокерам сообщений. Отдельно упомянуты NPM_TOKEN и PYPI_API_TOKEN.
Список целей шире обычных издательских токенов. В него входят ключи доступа AWS, токены GitHub, GitLab, npm и PyPI, ключи Hugging Face, HashiCorp Vault, Slack, Stripe и SendGrid, а также JSON Web Token (JWT). На рабочей станции такие данные часто лежат под одной учетной записью. В системе непрерывной интеграции секреты могут существовать лишь во время конкретного задания, но этого достаточно, если sckit уже работает внутри процесса. Украденные сведения отправлялись на skyleen[.]fr; блокировать следует сам домен и все его поддомены.
SafeDep связала первоначальный взлом с конвейерами выпуска GitHub Actions самой MemTensor. Атакующие отправляли коммиты в репозиторий и добивались запуска рабочего процесса, который передавал им токен публикации npm либо PyPI. Получив эти токены, они выпускали зараженные версии под подлинными названиями MemTensor. Пользователь видел привычный пакет от ожидаемого издателя, поэтому проверка одного лишь имени не могла обнаружить подмену.
Углубленный анализ sckit обнаружил признаки червя, способного распространяться через GitHub, прямую публикацию npm-пакетов и прямую публикацию пакетов PyPI. SafeDep сообщила, что имплант собирает учетные данные с машин разработчиков и из заданий непрерывной интеграции, принимает подписанные задачи от командно-контрольного сервера C2 и содержит шаблоны для встраивания себя в npm-пакеты, Python-пакеты и рабочие процессы GitHub Actions. На момент публикации не было ясно, успел ли он заразить что-либо за пределами пакетов MemTensor.
Особенно опасным оказался контекст выполнения. По описанию StepSecurity, плагин MemOS Cloud связывает среду агента OpenClaw с сервисом памяти: извлекает подходящие воспоминания перед обработкой промпта и добавляет новые после запуска агента. В пакете также объявлены точки интеграции для Clawdbot и Moltbot. Код работает прямо внутри агентного процесса, видит пользовательский ввод и наследует его окружение. Там могут находиться конфигурация облака, доступ к исходным репозиториям, издательские токены пакетов и секреты приложения.
Позднее вредоносные выпуски удалили из npm и PyPI. В обновлении последней чистой npm-версией названа @memtensor/memos-cloud-openclaw-plugin 0.1.24. Это не противоречит прежним данным: 0.1.24 считалась чистой, а следующая 0.1.25 — зараженной. Разница касается степени осторожности: первоначальная рекомендация предлагала базовую версию 0.1.20, обновление указывает более свежую чистую 0.1.24. Для MemoryOS запись обрывается на «Version 2.0.», поэтому точный последний чистый выпуск из обновления установить нельзя; подтвержденной безопасной базой остается 2.0.33, тогда как 2.0.34 вредоносна.
Затронутым системам требуется не простое удаление пакета. Нужно остановить все процессы sckit, закрепить зависимости на проверенных версиях и сменить облачные учетные данные, токены систем контроля версий, токены npm и PyPI, SSH-ключи, API-ключи, секреты CI/CD и учетные данные приложений. Проверке подлежат рабочие станции разработчиков, задания CI, GitHub Actions, история публикации пакетов, неожиданные коммиты и релизы. Отдельный поиск нужен по пакетам, куда имплант мог перенести себя после кражи издательских полномочий.
Индикаторы компрометации для журналов и инвентаризации: @memtensor/memos-cloud-openclaw-plugin@0.1.21, @memtensor/memos-cloud-openclaw-plugin@0.1.23, @memtensor/memos-cloud-openclaw-plugin@0.1.25, MemoryOS@2.0.34, процесс или файл sckit и обращения к skyleen[.]fr. Полезно сопоставить время установки этих версий с сетевыми соединениями, запусками модуля memos, изменениями GitHub Actions и выпуском новых npm- или PyPI-пакетов. Даже после ротации секретов следует отозвать старые сессии и JWT: простая замена пароля не всегда прекращает действие уже выданного токена.

Изображение носит иллюстративный характер
В npm пострадал пакет @memtensor/memos-cloud-openclaw-plugin. Вредоносными признаны версии 0.1.21, 0.1.23 и 0.1.25; версии 0.1.22 и 0.1.24 в основном отчете указаны как чистые. Go-пейлоад спрятали внутри интеграции с памятью для ИИ. Он запускался при старте шлюза агента и каждый раз, когда плагин обрабатывал событие извлечения воспоминаний. Пусковой модуль передавал исполняемому файлу окружение родительского процесса, а во время обращения к памяти еще и текст пользовательского промпта.
В PyPI вредоносный код попал в MemoryOS 2.0.34. Достаточно было импортировать модуль memos в приложение: пакет сразу запускал статически скомпонованный бинарный файл на Go. На момент основного отчета проект находился в карантине PyPI. Для npm тогда рекомендовали откат к @memtensor/memos-cloud-openclaw-plugin 0.1.20, для PyPI — к MemoryOS 2.0.33.
По данным Socket, sckit искал секреты npm, PyPI, GitHub, GitLab, AWS, HashiCorp Vault и SSH. Среди интересовавших его файлов названы.npmrc,.vault-token, id_ecdsa, credentials.db, access_tokens.json и stored_tokens. Параллельно имплант просматривал переменные окружения в поисках токенов аутентификации, паролей, API-ключей, закрытых ключей, сессионных cookie, строк подключения к базам данных и брокерам сообщений. Отдельно упомянуты NPM_TOKEN и PYPI_API_TOKEN.
Список целей шире обычных издательских токенов. В него входят ключи доступа AWS, токены GitHub, GitLab, npm и PyPI, ключи Hugging Face, HashiCorp Vault, Slack, Stripe и SendGrid, а также JSON Web Token (JWT). На рабочей станции такие данные часто лежат под одной учетной записью. В системе непрерывной интеграции секреты могут существовать лишь во время конкретного задания, но этого достаточно, если sckit уже работает внутри процесса. Украденные сведения отправлялись на skyleen[.]fr; блокировать следует сам домен и все его поддомены.
SafeDep связала первоначальный взлом с конвейерами выпуска GitHub Actions самой MemTensor. Атакующие отправляли коммиты в репозиторий и добивались запуска рабочего процесса, который передавал им токен публикации npm либо PyPI. Получив эти токены, они выпускали зараженные версии под подлинными названиями MemTensor. Пользователь видел привычный пакет от ожидаемого издателя, поэтому проверка одного лишь имени не могла обнаружить подмену.
Углубленный анализ sckit обнаружил признаки червя, способного распространяться через GitHub, прямую публикацию npm-пакетов и прямую публикацию пакетов PyPI. SafeDep сообщила, что имплант собирает учетные данные с машин разработчиков и из заданий непрерывной интеграции, принимает подписанные задачи от командно-контрольного сервера C2 и содержит шаблоны для встраивания себя в npm-пакеты, Python-пакеты и рабочие процессы GitHub Actions. На момент публикации не было ясно, успел ли он заразить что-либо за пределами пакетов MemTensor.
Особенно опасным оказался контекст выполнения. По описанию StepSecurity, плагин MemOS Cloud связывает среду агента OpenClaw с сервисом памяти: извлекает подходящие воспоминания перед обработкой промпта и добавляет новые после запуска агента. В пакете также объявлены точки интеграции для Clawdbot и Moltbot. Код работает прямо внутри агентного процесса, видит пользовательский ввод и наследует его окружение. Там могут находиться конфигурация облака, доступ к исходным репозиториям, издательские токены пакетов и секреты приложения.
Позднее вредоносные выпуски удалили из npm и PyPI. В обновлении последней чистой npm-версией названа @memtensor/memos-cloud-openclaw-plugin 0.1.24. Это не противоречит прежним данным: 0.1.24 считалась чистой, а следующая 0.1.25 — зараженной. Разница касается степени осторожности: первоначальная рекомендация предлагала базовую версию 0.1.20, обновление указывает более свежую чистую 0.1.24. Для MemoryOS запись обрывается на «Version 2.0.», поэтому точный последний чистый выпуск из обновления установить нельзя; подтвержденной безопасной базой остается 2.0.33, тогда как 2.0.34 вредоносна.
Затронутым системам требуется не простое удаление пакета. Нужно остановить все процессы sckit, закрепить зависимости на проверенных версиях и сменить облачные учетные данные, токены систем контроля версий, токены npm и PyPI, SSH-ключи, API-ключи, секреты CI/CD и учетные данные приложений. Проверке подлежат рабочие станции разработчиков, задания CI, GitHub Actions, история публикации пакетов, неожиданные коммиты и релизы. Отдельный поиск нужен по пакетам, куда имплант мог перенести себя после кражи издательских полномочий.
Индикаторы компрометации для журналов и инвентаризации: @memtensor/memos-cloud-openclaw-plugin@0.1.21, @memtensor/memos-cloud-openclaw-plugin@0.1.23, @memtensor/memos-cloud-openclaw-plugin@0.1.25, MemoryOS@2.0.34, процесс или файл sckit и обращения к skyleen[.]fr. Полезно сопоставить время установки этих версий с сетевыми соединениями, запусками модуля memos, изменениями GitHub Actions и выпуском новых npm- или PyPI-пакетов. Даже после ротации секретов следует отозвать старые сессии и JWT: простая замена пароля не всегда прекращает действие уже выданного токена.