anthropic

Разбор Claude Desktop: MCP-сервер работает вне песочницы

Claude News

anthropic

Разбор десктопного приложения Claude версии 1.40609.1 показал, что защита локальной виртуальной машины не покрывает локальные MCP-серверы: подключённый к приложению сервер запустился процессом на самом Mac. Бандл на 855,2 МБ разобран в блоге Telkins, около 60% объёма занимают Electron и ресурсы Chromium.

Коротко

  • Гостевую систему приложение скачивает при запуске: образ ревизии 2a762adf от 13 августа 2026 года весит 1,23 ГБ в сжатом виде и разворачивается в диск на 10 ГиБ с Ubuntu 22.04.5 LTS.
  • Сетевую политику задаёт srt-settings.json внутри 24-мегабайтного образа smol-bin: в списке разрешённых доменов реестры npm, PyPI, crates.io, а также github.com, зеркала Ubuntu, домены Anthropic; отдельные копии образа собраны под arm64 и x64.
  • Тестовый MCP-сервер сообщил об операционной системе Darwin и PID 18717, оказался дочерним процессом приложения Claude и прочитал файл из /private/tmp, который в виртуальную машину не передавали.

Граница песочницы в агентских приложениях редко совпадает с границей, которую видит пользователь. Виртуальная машина закрывает код, который агент генерирует и выполняет сам, но расширения вроде MCP-серверов остаются на хосте с правами обычного процесса macOS, и их доступ ограничивают только настройки и системные разрешения. Судя по разбору, архитектура Claude собрана слоями, где сетевой прокси и изоляция ядра компенсируют друг друга, но не отменяют необходимость проверять, что подключено в конфигурации.

Демон sdk-daemon собран на Go 1.25.12 и работает внутри гостя от root

Гостевую систему приложение не несёт в бандле, а скачивает при запуске по версионированному пути с контрольными суммами в манифесте. Манифест перечисляет четыре артефакта: диск rootfs.img, ядро vmlinuz, initrd и уменьшенный initrd-micro для быстрой загрузки. Корневой диск на 10 ГиБ содержит раздел EFI на 99 МиБ и ext4 с Ubuntu 22.04.5 LTS, ядро обновлено до 6.8.0-136-generic.

Внутри образа лежат Node.js 22.23.2, Python 3.10.12, UV и бинарник /usr/local/bin/sdk-daemon: собранный на Go 1.25.12 демон, который юнит coworkd.service описывает как vsock-мост RPC для управления процессами и запускает от root. Отдельно установлен набор для документов: pdfplumber, camelot, pytesseract, magika, unoserver с headless LibreOffice, markitdown и onnxruntime. Скрипт extract-text раскидывает форматы между MarkItDown, Pandoc и LibreOffice.

Хост и гость обмениваются JSON-RPC по vsock, тем же каналом идёт сеть

Загрузку начинает Electron-приложение: оно просит нативный слой поднять гостя, служба coworkd запускает sdk-daemon в фоне, после чего Swift-класс CoworkVMRPCClient обменивается с гостем JSON-сообщениями по vsock. Сам Swift-аддон слинкован с Apple Virtualization.framework и отдаёт типы управления виртуальной машиной. Тем же каналом идёт сетевой трафик: демон гостя отправляет его с виртуального Ethernet-интерфейса на хост.

В метаданных Swift на стороне хоста встречается VZGvisorNetworking, что, по оценке автора разбора, указывает на сетевой стек на базе gVisor, работающий на самом Mac. Образ smol-bin приложение подключает к машине отдельным виртуальным диском, а апдейтер coworkd монтирует его и копирует свежий бинарник демона внутрь гостя; у двух проверенных копий демона хеши различались.

Внутри приложения границы проходят иначе: Electron IPC передаёт запросы между процессами по сгенерированным именам каналов, а Rust-аддон и Swift-код подключены через Node-API, Rust на napi-rs. Всего в приложении шесть языков: C/C++, Objective-C, JavaScript, Rust, Swift и Go. Objective-C отвечает за апдейтер Squirrel.

Прокси внутри машины требует сессионный токен, выданный виртуальной машине

В srt-settings.json прописан mitm-прокси с сокетом /var/run/mitm-proxy.sock и доменами anthropic.com, claude.com и frame.claudeusercontent.com. В Anthropic описывали случай, когда подготовленный файл заставил Claude загрузить файлы рабочего пространства в аккаунт атакующего через собственный API компании: домен был в списке разрешённых, и запрос прошёл. После этого внутрь машины добавили прокси, который проверяет запросы к API и отклоняет чужой ключ.

Тестовый сервер, добавленный в конфигурацию Claude, отчитался о системе Darwin и PID 18717, а в дереве процессов macOS оказался потомком приложения Claude с PID 18616 через вспомогательный процесс disclaimer с PID 18716. Ответ в Cowork содержал случайное значение из файла в /private/tmp.

Координацию вызовов инструментов Anthropic сначала выполняла внутри машины, но перенесла на Mac: неудачный старт виртуальной машины оставлял Claude без возможности ответить. Команды, отправленные демону гостя, по-прежнему выполняются внутри Linux, а записываемые общие каталоги агент может изменить или удалить, и остановка процесса эти изменения не откатит.

Что осталось в метаданных

В установленных Swift-аддонах отладочных карт и секций DWARF в arm64-срезах уже нет, но в swift_addon.node сохранились 28 строк с путями исходников, включая каталог сборки. Из полей Swift автор насчитал 273 дескриптора и восстановил имена для 175 из них по 171 типу; часть имён и типов расшифровать не удалось, так что полной картины нативного интерфейса разбор не даёт.

Комментарии

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.

Из Google мы используем только имя и аватар. Почту не сохраняем.