Я взломал Perplexity Computer и получил безлимитный доступ к Claude Code
@ai_longreadsОдин промпт, три команды в терминале — и ИИ Perplexity взломал сам себя. Это класс уязвимостей, который, вероятно, существует в каждом мультиагентном ИИ-продукте сегодня.
Это AI-перевод статьи, сделанный каналом Про AI: Лучшие Статьи и Исследования.
Я взломал Perplexity Computer и получил безлимитный доступ к Claude Code
I hacked Perplexity Computer and got unlimited Claude Code Автор: Yousif Astarabadi Оригинальный текст:
Один промпт. Три команды. Я заставил их собственный ИИ взломать самого себя.
Это класс уязвимостей, который, вероятно, существует в каждом мультиагентном ИИ-продукте, работающем сегодня в продакшене. И исправление — это паттерн проектирования, о котором пока никто в индустрии не говорит.
Вот полная история.
Я не пытался ничего взламывать. Я исследовал, как Perplexity Computer реализует песочницу (sandboxing) — для собственной работы над агентной инфраструктурой. Я пытался понять, как продакшен-системы с мультиагентной архитектурой на самом деле изолируют среды выполнения: что является общим, а что — нет.
Для начала я покопался в системе. Я заметил, что в песочнице установлен Claude Code.
Я попросил агента запустить его и сгенерировать тестовый код, чтобы посмотреть, как он себя ведёт. Работал нормально. Стандартный Claude Code, запущенный в режиме обхода разрешений, чтобы не запрашивать подтверждения. Для агентной (агентный) системы это логично.
И тут я подумал: подождите, а как они обрабатывают API-ключи?! Claude Code нужен API-ключ Anthropic для работы. Этот ключ должен где-то храниться в песочнице. Как он туда попадает? Как ограничена его область действия? Изолирован ли он?
Именно этот вопрос и привёл меня дальше.
Субагент хранит API-ключ в переменных окружения своего процесса. Мне нужно было его украсть.
Perplexity Computer предпринял шесть попыток и потерпел неудачу.
- Попросил субагента вывести свои переменные окружения — отказал!
- Подбросил троянский скрипт в общую файловую систему — он прочитал мой код, понял, что тот делает, и отказался его запускать!
- Отравил .bashrc и .profile — они сработали слишком рано, до того как API-ключ был внедрён.
- Подложил фальшивый бинарник node в PATH — так и не сработал.
- Запустил кодинг-агента и одновременно мониторил дерево процессов — субагент работает в другой песочнице, ничего не удалось перехватить :(
- Попытался найти системный промпт для Claude Code и модифицировать его, чтобы убрать отказы — не смог обнаружить кастомный системный промпт.
Шесть провалов. Защита Claude на уровне модели и промптов действительно хороша. Каждый раз, когда я пробовал что-то хитрое, модель это замечала.
Затем Perplexity вспомнил, что Claude Code — это приложение на Node.js, запускаемое через npm. А npm читает ~/.npmrc из домашней директории. И домашняя директория находится на общей файловой системе, в которую я могу писать.
В Node.js есть флаг --require, который предзагружает JavaScript-модуль до запуска любого кода приложения. Его можно задать через 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 на своём ноутбуке. Я ожидал, что вызовы к LLM от Claude Code будут отклонены и ограничены песочницей. Я был в шоке. Мгновенный ответ от Opus 4.6!
Потом я подумал: «Наверняка использование будет списано с моего аккаунта, этот API-ключ должен быть привязан к моему пользователю». Я снова оказался неправ.
Я попросил Opus 4.6 сгенерировать длинную историю, описывающую историю мира, включая каждое изобретение, империю и открытие. Я запустил этот вызов 5 раз параллельно, генерируя более 100 тысяч выходных токенов (токены) за каждый. Это должно было исчерпать все мои кредиты Perplexity Computer, но они не изменились.
Без привязки к IP. Без привязки к сессии. Без привязки к песочнице. Их счёт.
Один из самых хорошо профинансированных ИИ-стартапов (стартап) на планете был взломан через dotfile, который используется в атаках на цепочку поставок Node.js с 2019 года.
Модель сделала всё правильно. Инфраструктура — нет.
А теперь — что я хочу, чтобы основатели, строящие агентную инфраструктуру, вынесли из этого
Архитектура Perplexity наполовину правильная. Они используют прокси между песочницей и API Anthropic. Это правильный паттерн. Никогда не следует помещать «сырой» API-ключ провайдера внутрь песочницы. Прокси даёт контроль, наблюдаемость и возможность отозвать доступ без ротации мастер-ключа.
Проблема в том, что их прокси-токен (токены) никак не привязан к контексту выполнения. Получив его, вы можете использовать его где угодно и когда угодно.
Вот как это нужно делать правильно:
Привяжите токен к ID песочницы. Токен и ID песочницы не совпадают? Отклонено. Ключ утёк, но у вас нет доступа к песочнице? Бесполезен. В идеале следует также привязывать токен к IP-адресу песочницы, но E2B (провайдер песочниц, который они используют) не предоставляет эту информацию до инициализации песочницы.
Сделайте токен эфемерным. Создавайте его при запуске песочницы. Уничтожайте при её приостановке. Никаких долгоживущих учётных данных. Прокси генерирует краткосрочный токен при старте сессии и аннулирует его при завершении. Утёкший ключ от мёртвой песочницы — мёртвый ключ.
Привяжите токен к биллинг-аккаунту пользователя. Даже если всё остальное не сработает — даже если кто-то извлечёт активный токен из работающей песочницы и использует его до истечения срока действия — потребление будет списано с аккаунта, который инициировал сессию. Не с общего мастер-пула биллинга. Это превращает «безлимитный бесплатный доступ к API» в «кто-то злоупотребляет собственной квотой» — а это совершенно другой уровень серьёзности.
Эти три вещи — привязка к песочнице, эфемерность, биллинг пользователя — и делают паттерн прокси по-настоящему рабочим. Без них вы просто добавляете лишний сетевой переход, который ничего не останавливает.
Это не специфическая проблема Perplexity. Это архитектура по умолчанию для агентной инфраструктуры прямо сейчас, потому что она самая быстрая в реализации. Общие файловые системы между агентами, долгоживущие учётные данные, биллинг на мастер-аккаунт. Держу пари, что у большинства мультиагентных продуктов в продакшене сегодня есть какая-то версия этой проблемы.
Сообщил @AravSrinivas и @denisyarats до публикации.
Подпишитесь на канал и каждый день читайте лучшие материалы про AI переведенные на русский!
Нашли интересную статью для перевода? Пришлите нашему боту: @ailongreadsbot