SkillLeak, кража учетных данных браузера через MCP Skill

SkillLeak: дешифратор учетных данных браузера, реализуемый через навык MCP.

TL, д-р

@szc-ft/mcp-szcd-client Это клиент протокола Model Context Protocol (MCP), опубликованный в npm, который автоматически настраивает помощников по программированию на основе ИИ — своего рода связующий пакет, который разработчик устанавливает, чтобы агент IDE мог взаимодействовать со службой библиотеки компонентов. Он имеет долгую, на первый взгляд обычную историю релизов.71 версии) и безобидный этап установки. Ничто в процессе установки после завершения процесса не затрагивает учетные данные.

Процесс считывания учетных данных осуществляется на более глубоком уровне, в рамках встроенного навыка MCP, называемого local-browser-testКогда этот навык connect() в ходе рутинных запусков он вызывает _decryptCredentials() — который расшифровывает все сохраненные пароли в локальном профиле Chrome/Edge (все сайты, а не одно приложение, которое будет проверяться браузером) с использованием API защиты данных Windows (DPAPI) и AES-256-GCM. Расшифрованный набор данных записывается в открытом виде. ~/.szcd-mcp/deps/decrypted-creds.json и возвращается в результат работы инструмента MCP навыка, который передается на удаленный сервер MCP по умолчанию пакета. mcp.szcd-mcp.top.

Это модель цепочки поставок, заслуживающая названия: Возможность обработки конфиденциальной информации не предусмотрена в установочном хуке. (где большинство сканеров и рецензентов ищут информацию), но в навыке MCP, который выполняется только тогда, когда оператор направляет инструмент на свой собственный запущенный браузер. Мы называем это так: SkillLeakMEW классифицирует @szc-ft/mcp-szcd-client (версии 0.38.0 и 0.39.0) как злонамеренный.

Краткий обзор событий — навык MCP: самодостаточный набор инструкций и вспомогательных скриптов, который сервер MCP предоставляет агенту ИИ в качестве вызываемой возможности. Агент вызывает его как инструмент; скрипты выполняются на компьютере разработчика.

Анатомия атаки

Упаковка представляет собой два совершенно разных образа.

Лицо, которое рецензент видит первым. — это путь установки. В манифесте указано: postinstall: node scripts/postinstall.js, и этот скрипт делает именно то, что написано в файле README: он устанавливает соединения. MCP интегрируется с IDE и устанавливает соседний пакет. @szc-ft/sketch-mcp-serverОн никогда не доходит до кода учетных данных. Сканер, который останавливается на этапе установки. hooks — исторически наиболее показательное место для поиска — это чистый, ничем не примечательный инструмент для разработчиков. Этот пакет фактически был признан безопасным в ходе предыдущей проверки.

Лицо, которое имеет значение Достигается только посредством объединенного навыка. Цепочка:

  • Разработчик управляет локальный-браузер-тест Это навык, используемый в экземпляре Chrome/Edge, запущенном с помощью удаленной отладки. Это документированный способ использования навыка.
  • Навык подключить () (lib/browser-engine.jsзвонки _decryptCredentials() в строке 246.
  • _decryptCredentials() призывы decryptAllPasswords({ filter: '%' }), '%' Фильтр — это деталь, которая превращает удобство тестирования в результат: он сопоставляет все сохраненные источники, а не только один тестируемый сайт.
  • lib/decrypt-passwords.js читает данные браузера os_crypt зашифрованный ключ, запускается powershell … ProtectedData::Unprotect (DPAPI) для восстановления ключа AES, затем AES-256-GCM-дешифрует каждые сохраненные учетные данные.
  • Полный расшифрованный набор записывается в ~/.szcd-mcp/deps/decrypted-creds.json в открытом виде и возвращается в качестве результата работы навыка. инструмент MCP результат.
  • Полученный результат передается обратно по каналу MCP на сервер по умолчанию для данного пакета. mcp.szcd-mcp.top — тот же хост, что описан в файле README и в scripts/lib/common.js.

Краткое пояснение, почему вообще работает шаг 4. В Windows Chrome и Edge не хранят сохраненные пароли в открытом виде: каждые учетные данные шифруются ключом AES-256-GCM, а сам ключ защищен с помощью DPAPI, который привязывает его к текущей учетной записи пользователя. Поэтому восстановление пароля требует двух действий — сначала ProtectedData::Unprotect для восстановления ключа AES (что удается, поскольку код выполняется от имени вошедшего в систему пользователя, именно в том контексте, который предоставляет терминал разработчика), затем выполняется расшифровка каждого сохраненного BLOB-объекта, считанного из браузера, с помощью GCM. os_crypt— Защищенное хранилище. Это хорошо известный, работающий в автономном режиме и бесшумный: нет запроса мастер-пароля, нет взаимодействия с браузером, нет сетевого обмена данными до тех пор, пока результаты не будут переданы. Это тот же примитив, который используют многие злоумышленники, занимающиеся кражей информации — новизна здесь лишь в оболочке, которая его содержит.

Дешифратор не является случайным элементом.Он упакован трижды — под standard-навык/, opencode-extension/ и qwen-extension/ — Одна копия на каждую поддерживаемую поверхность с ИИ-помощником, поэтому эта функция будет доступна для любого помощника, подключенного разработчиком.

В отличие от легитимной автоматической проверки браузера.login Вот и вся история. Настоящий помощник по тестированию расшифровывает учетные данные для one приложение это упражнениеcisПрограмма использует данные внутри процесса и никогда не сохраняет и не пересылает их. Здесь она расшифровывает все данные, записывает их на диск в открытом виде и возвращает через сетевую границу на удаленный сервер.

Хронология и триггер 

Для понимания воздействия важны два типа поведения.

Запуск происходит по желанию, а не автоматически. При установке пакета никакие учетные данные не считываются. Расшифровка выполняется только тогда, когда разработчик активно вызывает программу. локальный-браузер-тест Это позволяет существенно сузить круг пострадавших по сравнению с более сложными задачами. послеустановка полезная нагрузка, которая срабатывает на каждом Установка npm.

Упаковка солидная, не одноразовая. Издатель выпустил 71 версию и поддерживает более широкий охват. @szc-ft Пакет MCP, состоящий из библиотеки компонентов. Дешифратор учетных данных присутствует в обеих помеченных версиях (0.38.0 и 0.39.0) с идентичным отпечатком, запускается из одного и того же источника. browser-engine.js:246 Точка входа. На момент написания статьи пакет по-прежнему доступен на npm.

Именно это сочетание — проверенный издатель, простой этап установки и функция, которая срабатывает только при наличии определенного согласия — объясняет, почему автоматизированный классификатор предсказал «безопасность», и предыдущий обзор подтвердил это. Проблема исчезает только при ручном чтении вспомогательных скриптов навыка.

Показатели компромисса

Тип Индикаторные
Упаковка @szc-ft/mcp-szcd-client (npm) — версии 0.38.0, 0.39.0
Cеть Удаленный сервер MCP по умолчанию mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18)
Файл (перетащен) ~/.szcd-mcp/deps/decrypted-creds.json — расшифрованные учетные данные в открытом тексте
Файл (полезная нагрузка) .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (входит в комплект) standard-skill/, opencode-extension/, qwen-extension/)
Поведенческий browser-engine.js:246 _decryptCredentials()decryptAllPasswords({ filter: '%' }) (Общий охват всего объекта)
Поведенческий Читает Chrome/Edge os_crypt ключ; требуется браузер, запущенный с --remote-debugging-port
Установить крючок postinstall: node scripts/postinstall.js - доброкачественный (Конфигурация IDE MCP + установка соседних пакетов); не доходит до дешифратора

Аудит защитников Инструменты MCP следует лечить умение В область видимости входит именно каталог, а не только манифест и скрипты установки.

Атрибуция и наблюдаемое поведение

Мы описываем поведение, а не мотивы.

Пакет опубликован под зарегистрированным аккаунтом npm с согласованной структурой, включающей несколько пакетов. @szc-ft Пакет MCP и длительная история версий. Нет выделенного скрытого канала управления: расшифрованные учетные данные возвращаются через собственный документированный сервер MCP пакета. mcp.szcd-mcp.topа не в анонимный пункт выдачи. Этап установки действительно безобиден.

Что превращает это из «агрессивной функции для удобства» в вредоносную функцию, так это наблюдаемое сочетание области действия и назначения: процедура расшифровки ВСЕ сохраненные учетные данные браузера, а не единственное приложение, которое использовалось бы в тесте.cise) сохраняет их на диск в открытом виде и передает с хоста по каналу MCP. Автоматическое тестирование в браузереlogin Функция, которая вела себя таким образом, по сути, была бы неотличима от сбора учетных данных — и именно об этом эффекте должен рассуждать защитник.

Мы честно отмечаем, что триггер является добровольным, и издатель установлен; оба факта зафиксированы в приведенной выше записи. Ничто из этого не меняет наблюдаемый результат для разработчика, запускающего навык: сохраненные пароли для всех сайтов в его профиле браузера покидают компьютер.

SkillLeak — это инцидент, затрагивающий один пакет, но суть в используемой им платформе доставки.

Механизмы управления цепочками поставок в отрасли настроены на выполнение работ в момент установки: предустановка/послеустановка hooksмаяки, вызывающие путаницу в зависимостях, опечатки с полезной нагрузкой в index.js. MCP изменяет геометрию.Пакет MCP может содержать манифест и этап установки, которые являются полностью чистыми, но при этом сохраняют соответствующее поведение внутри пакета. умение — пакет, который агент ИИ запускает позже по указанию самого разработчика, используя его собственные ресурсы. Эта функция интегрируется с помощником и остается неактивной до тех пор, пока ее не активирует обычный рабочий процесс («запустить тест в браузере»).

Для команд, внедряющих инструменты MCP:

  • Навыки проведения аудита, а не просто составление накладных. Расширьте область проверки пакетов до навыки/, *-расширение/и эквивалентные каталоги. Наиболее конфиденциальный код может никогда не появиться в хуке установки.
  • Следите за увеличением масштаба изображения. Возможность, которая, как утверждается, имеет узкое назначение (тестирование одного приложения), но работает в широком диапазоне (фильтр: '%' (по всем сохраненным источникам) — это тревожный сигнал, не зависящий от намерений.
  • Рассматривайте результаты работы инструмента MCP как канал выхода. Данные, возвращаемые навыком, отправляются с хоста на тот MCP-сервер, для которого настроен клиент. Проведите инвентаризацию этих адресов так же, как и любых исходящих соединений.
  • Повторно проверьте обновления версий «доверенных» пакетов MCP. Наличие авторитетного издателя и длительной истории релизов не заменяет необходимости изучения кода, поставляемого в каждой версии, — как показывает этот случай, опровергающий ранее сделанную оценку безопасности.

Конкретнее, три недорогие проверки позволили бы обнаружить этот пакет до того, как разработчик запустит навык. Во-первых, сканирование содержимого каталогов навыка на предмет доступа к локальному хранилищу учетных данных — ссылки на os_crypt, Защищенные данные/DPAPI, или DPAPI браузера Login Данные файл — помечает возможность независимо от того, какой хук установки существует. Во-вторых, проверка области видимости для любой процедуры расшифровки/чтения, которая принимает селектор с подстановочным знаком (фильтр: '%' и эквиваленты), а не связанный идентификатор, позволяет выявить инфляцию от тестирования к сбору данных. Во-третьих, сравнение набора хостов, к которым может получить доступ пакет (здесь, mcp.szcd-mcp.top) по отношению к пунктам назначения, которые, как утверждается в документации, необходимы, превращает канал результатов MCP в проверяемую точку выхода. Ни для одного из этих действий не требуется запуск кода.

Расшифровка учетных данных через DPAPI и os_crypt Это устаревшая техника; новая форма — предоставление возможности через навык ИИ-агента, который запускается только при добровольном согласии пользователя. Ожидайте большего распространения шаблона «возможность в рамках навыка» по мере развития инструментов MCP и соответствующей корректировки объема проверки. 

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
Получите бесплатный аккаунт.
Нет необходимости кредитную карту.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni