Я взломал Perplexity Computer и получил безлимитный доступ к Claude Code
Один промпт. Три консольные команды. Я натравил их собственный ИИ на самого себя.
Подобные уязвимости наверняка есть в любом современном многоагентном ИИ-продукте. А решение кроется в паттерне проектирования, который в индустрии пока вообще не обсуждают.
Вот как это было.
Изначально я не планировал ничего ломать. Я просто ковырялся в песочницах Perplexity Computer, потому что строю собственную агентную инфраструктуру. Хотел посмотреть, как в реальных боевых системах устроена изоляция сред: какие данные шарятся, а какие остаются закрытыми.
Начал изучать систему изнутри. И вдруг заметил, что в песочнице стоит Claude Code.
Я попросил агента запустить его и накидать простенький код — просто ради интереса. Все прошло гладко. Это был самый обычный Claude Code, запущенный в режиме автоматического согласия, чтобы не запрашивать у пользователя подтверждения действий. Для агентной системы — логичный шаг.
Тут до меня дошло: стоп, а как они работают с API-ключами? Claude Code нужен ключ Anthropic, и он обязан где-то лежать прямо внутри этой песочницы. Как именно его туда пробрасывают? Какие у него права? Есть ли изоляция?
С этого вопроса всё и началось.
Субагент держал ключ в переменных своего окружения. Оставалось его стащить.
Я пытался провернуть это шесть раз — безуспешно.
- Попросил субагента выгрузить переменные окружения — отказ.
- Подсунул троян в общую файловую систему — агент прочитал код, понял суть и наотрез отказался его выполнять.
- Отравил файлы .bashrc и .profile — они отработали слишком рано, когда API-ключ еще не подтянулся.
- Подложил фейковый бинарник node в PATH — он даже не запустился.
- Включил агента-программиста и стал мониторить дерево процессов — выяснилось, что субагент крутится в другой песочнице, поэтому перехватить ничего не вышло :(
- Искал системный промпт Claude Code, чтобы вырезать оттуда запрет на такие действия — самого промпта нигде не оказалось.
Шесть провалов подряд. Защита Claude на уровне промптов оказалась на высоте. Любые мои хитрости модель рубила на корню.
А потом до меня дошло, что Claude Code — это обычное Node.js-приложение, которое запускается через npm. При старте npm всегда читает файл ~/.npmrc из домашней директории. А папка эта общая, и у меня есть туда права на запись.
У Node.js есть флаг --require, который подгружает нужный JS-модуль еще до старта основного приложения. Этот флаг можно прописать через NODE_OPTIONS прямо в .npmrc. Получается, если я закину свой .npmrc в общую домашнюю папку, любой процесс Node, созданный субагентом, автоматически выполнит мой код! Причем еще до инициализации самого Claude Code, до любых проверок безопасности — вообще до всего!
Весь эксплойт уложился в три шага:
- Пишем скрипт на шесть строк, который дампит process.env в файл внутри общего рабочего пространства.
- echo 'node-options=--require /path/to/script.js' > ~/.npmrc
- Просим Perplexity Computer выполнить вообще любую задачу, связанную с кодом.
Субагент запускается → npm читает мой .npmrc → срабатывает прелоад еще до загрузки Claude Code → полные учетные данные от API сливаются в общую файловую систему.
Сработало! Я вытащил токен шлюза Perplexity. Через agent-proxy.perplexity.ai он проксирует все запросы прямо на их корпоративный аккаунт в Anthropic.
Первым делом я, конечно же, прописал этот API-ключ и BASE_URL в Claude Code у себя на ноутбуке. Думал, что все запросы упадут с ошибкой, так как привязаны к песочнице. Но каково было мое удивление, когда я получил мгновенный ответ от Opus 4.6!
Потом промелькнула мысль: «Они точно спишут деньги за эти запросы с моего аккаунта, ключ ведь наверняка привязан к профилю». И снова мимо.
Я попросил модель сгенерировать огромный текст с подробным описанием мировой истории, всеми империями, изобретениями и открытиями. Запустил пять таких запросов параллельно, получив по 100 с лишним тысяч токенов на выходе в каждом. По идее, это должно было выжечь все мои лимиты в Perplexity Computer, но баланс даже не шелохнулся.
Ни ограничений по IP, ни привязки к сессии, ни изоляции в песочнице. Платили за всё они.
Один из самых богатых ИИ-стартапов планеты посыпался из-за простого дотфайла — метода, который используют для атак на цепочки поставок Node.js еще с 2019 года.
Сама модель отработала идеально. А вот инфраструктура подвела.
А теперь главное. То, что стоит усвоить всем фаундерам, которые сейчас пилят инфраструктуру для ИИ-агентов.
Архитектура Perplexity правильная, но лишь наполовину. Они подняли прокси между песочницей и API Anthropic. И это грамотный подход: никогда нельзя совать сырой API-ключ от провайдера прямо в песочницу. Прокси дает контроль, позволяет следить за запросами и отзывать доступы без ротации мастер-ключа.
Проблема в том, что их прокси-токен вообще никак не привязан к контексту. Стоит его перехватить — и он будет работать где угодно и когда угодно.
Как нужно делать по-настоящему безопасно:
Привязывайте токен к ID песочницы. Если токен и ID не совпадают — сразу отказ. Ключ утек, а доступа к песочнице нет? Значит, он бесполезен. В идеале его стоит привязать еще и к IP-адресу, но сервис E2B (их провайдер песочниц) не отдает эти данные до завершения инициализации.
Используйте эфемерные токены. Выпускайте ключ только на время старта песочницы и убивайте при ее остановке. Никаких долгоживущих доступов. Прокси должен генерировать короткоживущий токен на старте сессии и уничтожать его в конце. Утекший ключ от мертвой песочницы — это мертвый ключ.
Привяжите токен к биллингу конкретного пользователя. Если остальные уровни защиты пали, и кто-то всё же вытащил активный ключ из живой сессии — пусть хотя бы деньги списываются с его же баланса, а не из общего бюджета компании. Это превращает уязвимость типа «безлимитный халявный API» в банальный перерасход собственной квоты. Согласитесь, совсем другой уровень угрозы.
Привязка к среде, эфемерность и персональный биллинг — вот те три кита, на которых держится паттерн проксирования. Без них вы просто плодите лишние сетевые узлы, которые никого и ни от чего не спасут.
И это беда не только Perplexity. Сегодня такая архитектура стала де-факто стандартом: ее банально быстрее собрать. Общие диски для агентов, долгоживущие креды, списания с мастер-аккаунта — готов поспорить, что большинство запущенных многоагентных продуктов страдают от тех же болячек.
Я сообщил об уязвимости @AravSrinivas и @denisyarats до публикации этого поста.
Комментарии (2)
Уже пофиксили?)
Я бы удивился, если нет 🙂
Войдите, чтобы комментировать