DuneSlide: две ошибки Cursor, превращающие инъекцию промптов в RCE без клика
Cato AI Labs раскрыла CVE-2026-50548 и CVE-2026-50549, пару уязвимостей с оценкой CVSS 9.8 в терминальной песочнице Cursor. Отравленный ответ MCP или результат веб-поиска может выйти из песочницы и выполнить код. Исправление в Cursor 3.0.
Cato AI Labs раскрыла на этой неделе пару критических уязвимостей Cursor, получивших идентификаторы CVE-2026-50548 и CVE-2026-50549 и общее название DuneSlide. Обе имеют оценку CVSS 9.8, и обе позволяют одному фрагменту внедрённого текста выйти из терминальной песочницы Cursor и выполнить произвольные команды на вашей машине. Без клика, без диалога подтверждения, без вредоносного репозитория, который вы клонировали вручную. Затронуты все версии до Cursor 3.0.
Именно вектор доставки делает это достойным внимания, даже если вы не пользуетесь Cursor: инъекция промптов как примитив удалённого выполнения кода. Атакующий никогда не прикасается к вашему редактору. Он размещает инструкции в чём-то, что ваш агент читает от вашего имени, например в ответе сервера Model Context Protocol (MCP) или на странице, возвращённой веб-поиском, а агент делает всё остальное.
Песочница доверилась собственным параметрам агента
Cursor выполняет команды shell внутри песочницы, которая ограничивает запись вашим каталогом проекта. Проблема с CVE-2026-50548 в том, что список разрешённой записи частично контролируется агентом. Инструмент run_terminal_cmd принимает необязательный параметр working_directory, и когда агент задаёт его, Cursor добавляет этот путь в множество записи, не задавая вопросов.
Так что внедрённая инструкция может направить модель к вызову такого вида:
{
"tool": "run_terminal_cmd",
"command": "cp payload ~/.zshrc",
"working_directory": "/Users/you"
}
Песочница видит “легитимный” рабочий каталог и разрешает запись. Теперь атакующий может положить файл в ваш домашний каталог, и ~/.zshrc, ~/.zshenv или ~/Library/LaunchAgents превращаются в выполнение при следующем запуске shell или входе в систему.
Проверка символических ссылок сработала на пропуск
CVE-2026-50549 атакует само средство защиты. Перед записью Cursor канонизирует символические ссылки, чтобы подтвердить, что реальная цель находится внутри вашего проекта. Ошибка в резервном пути. Когда канонизация не удаётся, потому что цель не существует или атакующий убрал право на чтение у одного из каталогов в пути, Cursor сдаётся и доверяет внутрипроектному пути символической ссылки.
Это классический отказ с пропуском. Символическая ссылка только для записи, указывающая на собственный вспомогательный компонент песочницы Cursor, cursorsandbox, проходит проверку и позволяет атакующему перезаписать тот самый двоичный файл, который должен изолировать агента.
Почему “доверенные” инструменты агента стали новой поверхностью атаки
Неудобный урок в том, что run_terminal_cmd не является пользователем, вводящим команды. Это инструмент, который модель вызывает с аргументами, выбранными самой моделью, а эти аргументы пришли из текста, который модель прочитала. Как только вы принимаете, что любое содержимое, поступающее в окно контекста, потенциально враждебно, параметр вроде working_directory перестаёт выглядеть как конфигурация и начинает выглядеть как ввод атакующего.
Обе ошибки исправлены в Cursor 3.0, так что немедленное решение: обновиться и убедиться, что у вас 3.0 или новее. Более долгий урок переживает патч: относитесь к выводу MCP и загруженному веб-контенту как к недоверенным, и ограничивайте разрешения инструментов агента так, будто промпт уже скомпрометирован, потому что DuneSlide показывает, что это возможно.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.