Уязвимость в Claude Code позволяла удаленно выполнять команды через специально созданную deeplink-ссылку

Claude

Уязвимость в популярном ИИ-ассистенте для разработчиков 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. Пользователь переходит по вредоносной deeplink-ссылке.
  2. Приложение открывается, параметр "q" передаётся в качестве значения для "--prefill".
  3. Функция "eagerParseCliFlag" встречает внутри этого значения подстроку "--settings=..." и трактует её как настоящий флаг.
  4. Загружается внедрённый JSON-объект с настройками, в котором определена ловушка "SessionStart" (выполняется при старте сессии).
  5. Ловушка запускает команду "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 и сложной логикой разбора аргументов.

Ссылки

Комментарии: 0