84 npm-пакета стали вредоносными в одной майской атаке

Пустите агента в прод.Ключи оставьте себе.

Sallyport держит учётные данные в локальном хранилище и сам выполняет API-вызовы и SSH-команды за агента. Каждый запуск вы подтверждаете кликом или через Touch ID. Нет команды, которая показала бы сохранённый ключ, и кнопки экспорта тоже нет.

$brew install --cask olegsotnikov/tap/sallyport

macOS 14+ · Apple Silicon · Apache-2.0 · Бесплатно · без аккаунта · без облака

Для инженеров, которые пускают Claude Code, Cursor или Codex к настоящей инфраструктуре

Claude CodeCodexCursorWindsurfClineLangChainCrewAIOpenHandsGooseZed
Попробуйте

Подтверждение в рабочем контексте

Этот ключ требует подтверждения при каждом использовании. Вызов ждёт вашего решения.

claude · ~/infra

sallyport · http.request

PATCH api.cloudflare.com/client/v4/zones/…/dns_records

key cloudflare · flagged approval per call

ожидание подтверждения...

Требуется подтверждение

http.request → api.cloudflare.com

Developer ID Application: Anthropic PBC

claude node zsh

Ключ:cloudflareкаждый вызов
Нажмите "Подтвердить", чтобы разрешить вызов.или нажмите A/D
Проблема

Сейчас агент может прочитать ваши ключи

API-токены в .env, SSH-ключи на диске, OAuth-гранты в конфигах. Всё это читает и сам агент, и каждый пакет, который он подтягивает. А одного отравленного README хватит, чтобы увести их наружу.

Секреты открыты процессу

Токены в .env и переменных оболочки, SSH-ключи на диске, OAuth-токены в конфигах. Их читает агент, его дочерние процессы и всё, что npm поставил сегодня.

Инъекция в промпт превращается в кражу

Вредоносная страница или README велит агенту отправить токен на новый адрес, и агент подчиняется. Он для того и создан, чтобы выполнять инструкции.

Вы узнаёте из счёта

Без шлюза не остаётся записи о том, какие вызовы сделал агент, куда он их отправил и что в них было. Украденные ключи всплывают через недели, по чужому расписанию.

Три, которые уже случились

Май 2026

Атака на npm через TanStack

84 вредоносные версии в 42 пакетах собирали облачные учётные данные, токены GitHub и SSH-ключи прямо во время установки, а затем расползались через пакеты самих жертв.

Конец 2025

Червь Shai-Hulud

Скомпрометированные npm-пакеты крали секреты при установке и с помощью украденных данных заражали следующую партию пакетов.

Август 2025

Nx S1ngularity

Отравленный сборочный инструмент сканировал машины разработчиков в поисках секретов, пробовал локальные AI-инструменты и выгружал добычу через GitHub CLI.

Все три собирали ключи из переменных окружения и файлов на диске. Sallyport не держит рабочие ключи ни там, ни там.

Агенту ключи не нужны

Агент отправляет запрос: вызови этот API, выполни эту команду на таком-то хосте. Sallyport подставляет учётные данные внутри приложения, выполняет вызов и возвращает результат. Ключ не попадает в окружение агента, а запечатанный журнал показывает, что выполнялось и кто это подтвердил.

Модель доверия

Фиксированная лестница решений

Каждое действие поднимается по одной и той же вшитой лестнице. Здесь нет языка правил, который можно настроить неправильно, и нет движка правил, который со временем протухнет; необязательный список разрешений может пропустить запрос подтверждения сессии для доверенных идентификаторов кода.

Модель доверия

1

блокировка хранилища

Хранилище блокирует всё

При запуске хранилище заблокировано. Secure Enclave и Touch ID защищают доступ к его данным. До разблокировки Sallyport отклоняет все действия.

2

подтверждение каждого вызова

Помеченные ключи требуют подтверждения каждый раз

Ключ с пометкой "Подтверждение на каждый вызов" требует клик или Touch ID при каждом использовании, в том числе внутри подтверждённой сессии.

3

подтверждение сессии

Одно подтверждение на запуск агента

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

4

наблюдение

Выполнить и записать

Если подтверждение сессий выключено, действия выполняются без карточек и остаются в журнале.

Гейт хранилища, ключ с подтверждением каждого вызова, гейт сессии, наблюдение. Если это нужно переложить на язык закупок: нулевые постоянные привилегии для нечеловеческой идентичности, доступ выдаётся точно в срок, человек в контуре.

Возможности

Всё в одном подписанном приложении

Одно подписанное приложение для Mac держит хранилище, подтверждения и журнал. Аккаунт создавать не нужно, облачного сервиса за ним нет.

Абсолютная блокировка хранилища

Пока хранилище заблокировано, Sallyport отклоняет все действия агентов и все операции управления, кроме проверки статуса.

Шифрование на диске

Хранилище шифрует имена и значения ключей, провайдеров, привязки к хостам, список SSH и настройки.

Данные о процессе

В карточке указаны подпись кода вызывающего процесса и цепочка родительских процессов, включая неподписанные процессы.

Touch ID для изменений

Изменения конфигурации могут требовать Touch ID. Синтетический клик не пройдёт биометрическую проверку.

Журнал со слепой записью

Sallyport шифрует записи о запусках и действиях при сохранении, а затем связывает шифротекст хеш-цепочкой.

SSH с видимой командой

Sallyport видит всю SSH-команду, проверяет ключ хоста и сохраняет зашифрованную запись сессии. Приватный ключ остаётся в приложении.

Режим наблюдения

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

Без восстановления

Хранилище нельзя экспортировать, раскрыть или восстановить отдельным ключом. При его потере перевыпустите учётные данные у провайдеров.

Каналы

HTTP, SSH и MCP

Агент подключается к Sallyport как к обычному MCP-серверу. Все действия проходят ту же лестницу и попадают в тот же журнал.

HTTP API

http.request → api.github.com

Приложение выполняет HTTPS-вызов и подставляет учётные данные только во время выполнения. При перенаправлении на другой хост оно не передаёт их дальше.

SSH

ssh.exec → deploy@prod-03

Помощник без состояния открывает соединение. Приложение подписывает запросы SSH, закрепляет ключи хостов и сохраняет запись сессии. Приватный ключ не попадает в помощник.

MCP-серверы

github.create_issue

Проксируйте локальные stdio- или удалённые MCP-серверы через тот же шлюз. Sallyport хранит и обновляет токены OAuth 2.1.

В цифрах

Что на кону

84

вредоносных версий пакетов в одной npm-атаке, охотившейся за учётными данными

0

аккаунтов, облачных сервисов и телеметрии: Sallyport работает целиком на вашем Mac

1 касание

Touch ID подтверждает помеченный вызов; синтетический клик его не подделает

~2 мин

от brew install до первого вызова через шлюз

Открытый код

Прочитайте код, который держит ваши ключи

Хранилище, гейт подтверждения, журнал и исполнитель, который касается ваших ключей, открыты под Apache-2.0. Склонируйте и проследите путь ключа от вашего касания Touch ID до провода.

Apache-2.0 · целиком

Проверьте сами

Каждая строка, которая хранит, разблокирует или тратит ключ, лежит на GitHub. Прочитайте те места, которые вас беспокоят, и решайте.

Ничего не уходит наружу

Ни аккаунта, ни облачного сервиса, ни телеметрии. Sallyport общается только с теми хостами, на которые вы его направили.

Остаётся у вас

Apache-2.0 значит: форкайте, правьте, катите внутри своей компании. Ваша копия продолжит работать, что бы дальше ни делали мы.

Вопросы и ответы

Частые вопросы

Как лицензируется Sallyport?
Sallyport можно скачать и использовать бесплатно. Ядро распространяется как открытый код по лицензии Apache-2.0. Запланированные корпоративные компоненты будут под коммерческой лицензией.
Где хранятся мои секреты?
В локальном хранилище на вашем Mac. Secure Enclave и Touch ID защищают доступ к ключу шифрования хранилища. Sallyport шифрует значения и метаданные секретов на диске и не загружает данные хранилища.
Приложение связывается с серверами Sallyport?
Нет. Ни облачного сервиса, ни аккаунта, ни телеметрии. Sallyport работает офлайн, кроме обращений к сервисам, которые вы сами указали, и ленты обновлений.
Каковы системные требования?
Mac с Apple Silicon и macOS 14 или новее. Mac на Intel не поддерживаются.
Что происходит, пока хранилище заблокировано?
Действия агентов останавливаются. Запросы управления могут вернуть только статус, остальные операции отклоняются. Для разблокировки нужен Touch ID. Блокировка очищает сессии и ожидающие подтверждения.
Работает ли Sallyport с Claude Code и другими агентами?
Любой MCP-клиент может использовать встроенную команду sp mcp для доступа к http.request, ssh.exec и настроенным внешним MCP-серверам. Мы тестируем на Claude Code, Cursor и Codex.
Можно ли запускать Claude Code с --dangerously-skip-permissions?
Флаг, который все зовут YOLO-режимом, отключает подтверждения самого Claude Code. С вашими ключами он не делает ничего: они как лежали в .env и переменных окружения, так и лежат, и агент читал их всё это время. Эти подтверждения никогда не защищали ключи. Направьте агента в Sallyport, и в его окружении просто не останется ключа, мимо которого можно проскочить.
Безопасно ли ставить MCP-сервер, который кто-то выложил в сеть?
Относитесь к нему как к любой зависимости: он работает с вашими правами, а описания его инструментов попадают в контекст модели как инструкции. Пустите его через Sallyport, и каждый его вызов потребует подтверждения и попадёт в журнал. Локальные stdio-серверы получают тот ключ, который вы к ним привязали, поэтому привязывайте самый узкий из имеющихся и помечайте его как требующий подтверждения на каждый вызов.
Чем это отличается от HashiCorp Vault или 1Password CLI?
Они хорошо хранят секреты, а потом отдают их. op run и vault read заканчиваются одинаково: ключ оказывается в окружении следующего процесса, а на вашей машине это агент. Sallyport ключ не отдаёт: он сам делает вызов и возвращает ответ. Можно использовать и то и другое: источник истины остаётся там, где он есть, а Sallyport держит ту копию, с которой работает агент.
Может ли агент увидеть мои ключи?
Нет. Нет команды, которая показывает сохранённый ключ, нет экспорта и нет способа восстановления. Sallyport возвращает то, что ответил целевой сервис. Если сервис отражает ваш ключ в собственном ответе, он показывает вам свой баг, а журнал показывает вызов, на котором это поймали.
Что делать при потере доступа к Mac?
Ключа восстановления нет. Создайте хранилище заново и перевыпустите учётные данные у провайдеров.

Вашего агента отделяет от ваших ключей одна инъекция в промпт.

Бесплатная загрузка. Apple Silicon, macOS 14 или новее. Аккаунт не нужен. Никогда.

$brew install --cask olegsotnikov/tap/sallyport

macOS 14+ · Apple Silicon

Sallyport

Sallyport выполняет API-вызовы и SSH-команды за вашего ИИ-агента. Ключи остаются в локальном хранилище на вашем Mac; вы подтверждаете каждый запуск, и каждое действие попадает в запечатанный журнал.

© 2026 Sallyport · Открытый код по лицензии Apache-2.0 · Oleg Sotnikov