Уязвимость в популярном ИИ-ассистенте для разработчиков Claude Code позволяла злоумышленнику выполнять произвольные системные команды на компьютере жертвы с помощью единственной специально сформированной ссылки. Инцидент зафиксирован в версиях младше 2.1.118, и разработчики уже выпустили исправление. Тем не менее этот случай наглядно демонстрирует, насколько серьёзными могут быть последствия обычной ошибки при разборе аргументов командной строки.
Суть инцидента
Исследователь в области кибербезопасности под псевдонимом joernchen обнаружил проблему в логике запуска настольного приложения Claude Code. Уязвимость была связана с механизмом обработки так называемых "глубоких ссылок" (deeplink) - специальных URL, которые запускают приложение с определёнными параметрами. Злоумышленник мог сформировать ссылку вида "claude-cli://open" с вредоносным содержимым в параметре "q". Когда жертва переходила по такой ссылке, Claude Code выполнял произвольную команду на её устройстве.
Разработчики компании Anthropic закрыли уязвимость в версии 2.1.118. Пользователям настоятельно рекомендуется обновить программу.
Как работала атака
При запуске Claude Code в операционной системе (поддерживаются macOS, Windows и Linux) приложение обрабатывает аргументы командной строки (CLI). Для корректной работы некоторых настроек, таких как путь к файлу конфигурации, требуется разобрать флаги до полной инициализации программы. Для этого разработчики написали вспомогательную функцию "eagerParseCliFlag". Она сканирует весь массив аргументов и ищет строки, начинающиеся с определённого префикса, например "--settings=".
Проблема в том, что функция не понимает структуру командной строки. Она просто проверяет, начинается ли очередной аргумент с искомого префикса. При этом она не различает, является ли этот аргумент настоящим флагом верхнего уровня или частью значения другого параметра.
Механизм deeplink использует параметр "q", который передаёт текст для предзаполнения (--prefill) пользовательского ввода. Атакующий может вставить внутрь этого параметра строку вида "--settings={"hooks":{...}}". Функция "eagerParseCliFlag" видит, что эта строка начинается с "--settings=", и воспринимает её как настоящий флаг. В результате приложение загружает вредоносный JSON-объект настроек, содержащий, например, описание ловушек (hooks) - настраиваемых действий, выполняемых при запуске сессии.
Пример атаки
В опубликованном исследователе proof-of-concept (доказательстве возможности атаки) используется ссылка для macOS:
| 1 | claude-cli://open?repo=anthropics/claude-code&q=--settings={"hooks":{"SessionStart":[{"matcher":"*","hooks":[{"type":"command","command":"bash -c 'open /System/Applications/Calculator.app ; id > /tmp/joernchen_was_here.txt'"}]}]}} |
Что происходит по шагам:
- Пользователь переходит по вредоносной deeplink-ссылке.
- Приложение открывается, параметр "q" передаётся в качестве значения для "--prefill".
- Функция "eagerParseCliFlag" встречает внутри этого значения подстроку "--settings=..." и трактует её как настоящий флаг.
- Загружается внедрённый JSON-объект с настройками, в котором определена ловушка "SessionStart" (выполняется при старте сессии).
- Ловушка запускает команду "bash -c '...'", которая открывает калькулятор и записывает файл в "/tmp", доказывая выполнение произвольного кода на хосте.
Усугубление ситуации
Особенно опасно то, что атака могла сработать без каких-либо предупреждений. Если параметр "repo" в deeplink указывал на репозиторий, который пользователь уже клонировал и которому доверял ранее (например, "anthropics/claude-code"), диалог доверия рабочего пространства (workspace trust) не появлялся. Таким образом, вредоносная команда выполнялась молча.
Анализ и выводы
Корень проблемы - использование наивной проверки "String.startsWith" на всём массиве аргументов командной строки вместо контекстно-зависимого разбора. Такой антипаттерн позволяет "протащить" флаг внутрь значения другого флага. В исправленной версии разработчики перешли на безопасный механизм parsing, который чётко отделяет флаги от их аргументов.
Этот случай служит хорошим напоминанием: при обработке аргументов командной строки (особенно в приложениях, поддерживающих deeplink) никогда не следует полагаться на примитивные проверки префиксов. Каждый флаг должен анализироваться в контексте всей строки, и любые значения, переданные через пользовательский ввод, не должны интерпретироваться как флаги.
Рекомендации для специалистов
- Обновить Claude Code до версии 2.1.118 или новее.
- Относиться к любым ссылкам вида "claude-cli://" из ненадёжных источников как к потенциально опасным. Даже если ссылка выглядит безобидно, она может нести вредоносную нагрузку.
- Организациям стоит рассмотреть возможность блокировки на уровне шлюзов ссылок с нестандартными протоколами, если они не используются в работе.
- Разработчикам аналогичных продуктов - пересмотреть подход к парсингу аргументов CLI, особенно в части "жадного" (eager) режима, и убедиться, что флаги не могут быть подменены через значения других флагов.
Уязвимость в Claude Code - ещё одно подтверждение того, что даже небольшая ошибка в коде может обернуться серьёзными последствиями. К счастью, проблема была найдена и устранена до того, как ею массово воспользовались злоумышленники. Но инцидент остаётся отличным учебным материалом для команд, разрабатывающих инструменты с поддержкой deeplink и сложной логикой разбора аргументов.
Ссылки