anthropic

Разбор десктопного Claude: MCP работает вне песочницы

Promtime

anthropic

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

Коротко

  • Swift-слой поднимает гостевую Linux через Apple Virtualization.framework, а Electron-приложение общается с ней по vsock с Go-демоном sdk-daemon, который внутри гостя работает от root и отвечает за запуск процессов.
  • Образ гостя качается отдельно: ревизия для arm64 от 13 августа 2026 года весит 1,23 ГБ в сжатом виде и разворачивается в диск на 10 ГиБ с Ubuntu 22.04.5 LTS.
  • Сетевые правила лежат в srt-settings.json: разрешены домены npm, PyPI, crates.io, GitHub, Ubuntu и Anthropic, а MITM-прокси внутри виртуалки требует у запросов к API Anthropic выданный ей токен сессии.

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

Тестовый MCP-сервер вернул Darwin и PID 18717 вместо гостевого Linux

Автор добавил в конфигурацию Claude небольшой Python-сервер MCP, единственный инструмент которого сообщал операционную систему и идентификатор процесса. Из локальной сессии Cowork инструмент вернул Darwin и PID 18717. В таблице процессов macOS нашёлся тот же процесс: Claude с PID 18616, затем Contents/Helpers/disclaimer с PID 18716, затем сам Python.

Сервер прочитал тестовый файл в /private/tmp, который в виртуалку не пробрасывали, и ответ в Cowork совпал с локальным логом сервера. Команды, которые приложение отправляет гостевому демону, при этом исполняются в госте, но на общих с хостом каталогах агент сохраняет права записи, и остановка процесса изменения не откатывает.

Приложение на Mac отвечает за связь с моделью, раздачу вызовов инструментов и сбор результатов. Раньше эта координация шла внутри виртуалки, но неудачный старт виртуальной машины оставлял Claude без возможности ответить, поэтому координацию перенесли на хост, где сбой можно диагностировать силами самого приложения.

Гостевой образ разворачивается в 10 ГиБ с Ubuntu 22.04.5 LTS и Node.js 22.23.2

Образ гостевой ОС не входит в бандл и загружается во время работы. Ревизия для arm64, опубликованная 13 августа 2026 года, занимает 1,23 ГБ в сжатом виде и разворачивается в логический диск ровно на 10 ГиБ: раздел EFI на 99 МиБ и корневая файловая система ext4 с Ubuntu 22.04.5 LTS и ядром 6.8.0-136-generic.

Манифест перечисляет четыре артефакта: rootfs.img, ядро vmlinuz, initrd и уменьшенный initrd-micro для быстрой загрузки. Внутри образа Node.js 22.23.2, Python 3.10.12, UV и /usr/local/bin/sdk-daemon, обрезанный Go-бинарник, собранный Go 1.25.12; юнит coworkd.service описывает его как RPC-мост поверх vsock для управления процессами.

Отдельный слой отвечает за документы: pdfplumber, camelot для таблиц в PDF, pytesseract для OCR, unoserver и unoconvert поверх headless LibreOffice, markitdown, magika, numpy и onnxruntime. Скрипт extract-text раскидывает форматы между MarkItDown, Pandoc и LibreOffice. Эти утилиты Claude использует для чтения и конвертации файлов.

Шесть языков сходятся в JSON-RPC поверх vsock между Swift и Go

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

Rust-аддон опирается на napi-rs, а Swift-класс CoworkVMRPCClient обменивается JSON-сообщениями с гостевым демоном. По тому же vsock гость отдаёт сетевой трафик хосту, а метаданные Swift ссылаются на VZGvisorNetworking: автор разбора считает, что наружу за гостя выходит сетевой стек на базе gVisor на стороне Mac.

В установленных Swift-аддонах не осталось debug map, но swift_addon.node хранит 28 строк с путями исходников, включая каталог сборки /Users/runner/work/apps/apps/packages/desktop/claude-swift/. В двух аддонах нашлись 273 дескриптора полей, для 175 восстановлены имена, покрывающие 171 тип, среди них структура MountConfig и перечисления AXDispatch в computer_use.node с раздельными кодами намерения, исхода и причины отказа.

Обновление демона без загрузки образа

В бандл встроены образы smol-bin по 24 МБ, отдельно для arm64 и x64: приложение универсальное, поэтому копии дублируются, а тонких вариантов под конкретную архитектуру пока нет. Хост подключает smol-bin как дополнительный виртуальный диск, а апдейтер coworkd копирует оттуда свежий sdk-daemon в гостя. Две изученные копии демона отличались хешами, так что менять протокол можно без повторной загрузки образа на 1,23 ГБ.

Комментарии

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

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

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

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