# GhostApproval: как символическая ссылка превращает разрешённую папку ИИ-агента в доступ ко всему компьютеру: claude code агенты

Source: https://provod.ai/ru/blog/ghostapproval-coding-agent-symlinks

Ты один раз нажал "разрешить работу в этой папке", и агент получил не только её. Внутри проекта лежит безобидный на вид файл `notes.txt`. На самом деле это символическая ссылка на `~/.ssh/id_rsa`. Агент открывает `notes.txt`, окно согласия показывает знакомый путь внутри проекта, ты подтверждаешь чтение - и приватный ключ уходит в контекст модели. Ты видел путь, который тебе показали. Агент прочитал файл, на который этот путь указывал.

Именно этот разрыв Wiz Research назвала GhostApproval и опубликовала 8 июля 2026 года.

[Платите в рублях за Claude API без наценки на токены через provod.ai](https://provod.ai/?ref=blog-cta-top&utm_source=provod-blog&utm_medium=article&utm_campaign=ghostapproval-coding-agent-symlinks)

## Главное за минуту

- 8 июля 2026 года Wiz Research раскрыла класс уязвимостей GhostApproval после согласованного раскрытия с шестью поставщиками (источник: Wiz Research, 2026-07-08).
- Суть: символическая ссылка внутри доверенного workspace может указывать на файл за его пределами, а интерфейс согласия показывает путь ссылки, а не реальный разрешаемый путь к чувствительному файлу (источник: Wiz Research).
- Проверка охватила Amazon Q, Claude Code, Augment, Cursor, Google Antigravity и Windsurf (источник: Wiz Research; подтверждает ITPro, 2026-07-09).
- Amazon исправила проблему как CVE-2026-12958, Cursor - как CVE-2026-50549. Статусы и трактовки у поставщиков различаются, поэтому нельзя утверждать, что все продукты были одинаково уязвимы (источник: Wiz Research).
- Wiz не сообщала о подтверждённой эксплуатации этой техники в реальных атаках (источник: Wiz Research). Это находка исследователей, а не отчёт об инциденте.

Если ты пришёл сюда с запросом про claude code агенты и безопасность рабочей папки, держи короткий вывод: обнови инструмент до версии с фиксом, проверь свой проект на symlink перед тем как дать агенту доступ, и не полагайся на путь в окне согласия как на истину.

Пока ты выстраиваешь такой контроль, полезно уметь быстро сверить поведение разных моделей на одном и том же запросе - через один API это делается без прыжков между провайдерами ([provod.ai](https://provod.ai/?utm_source=provod-blog&utm_medium=article&utm_campaign=ghostapproval-coding-agent-symlinks&utm_content=hook&utm_id=brief-seo-fast-004)).

## Что именно случилось 8 июля 2026 года

Разберём терминологию, потому что вокруг находки уже накопилось много неточностей.

Wiz Research описала не единичную дыру в одном продукте, а класс проблем в модели доверия кодовых ассистентов. Общий механизм такой: инструмент разрешает агенту читать и писать внутри рабочей папки, которую ты пометил как доверенную. Граница доверия проведена по этой папке. Но файловая система умеет протыкать такие границы символическими ссылками, и проверка "файл внутри разрешённой папки?" легко проваливается, если сверять путь ссылки, а не путь, куда она реально разрешается.

Проверка охватила шесть продуктов: Amazon Q, Claude Code, Augment, Cursor, Google Antigravity и Windsurf (источник: Wiz Research; то же перечисление у ITPro, 2026-07-09). Важная оговорка от самих исследователей: статусы и трактовки у поставщиков различаются. Из открытых данных известно, что Amazon выпустила фикс с идентификатором CVE-2026-12958, а Cursor - CVE-2026-50549. По остальным участникам публичные CVE в источнике не приведены, поэтому корректно говорить о разной реакции, а не о равной уязвимости всех шести.

Ещё одна честная граница: Wiz не заявляла о подтверждённой эксплуатации в реальных атаках. Это исследование уязвимости и координация раскрытия, а не разбор инцидента с жертвами. Разница принципиальная. Дискуссия в сообществе о модели доверия агентов - это сигнал внимания, а не доказательство того, что кого-то уже взломали через GhostApproval.

## Как символическая ссылка выводит агента за пределы папки

**Главное:** доверенной должна быть не строка пути, а тот inode, куда путь фактически ведёт после разрешения всех ссылок.

Символическая ссылка - это файл, содержимое которого есть путь к другому файлу. Открываешь ссылку, ОС молча ведёт тебя к цели. Для агента `./project/notes.txt` и `/home/you/.ssh/id_rsa` выглядят как одно чтение, если проверка смотрит только на первую строку.

Вот как это выглядит в терминале - воспроизводить на чужих машинах не нужно, это для понимания механики на своей:

    # внутри доверенной папки проекта cd \~/project ln -s \~/.ssh/id\_rsa notes.txt

    # путь выглядит "внутри проекта" ls -l notes.txt # notes.txt -> /home/you/.ssh/id\_rsa

    # а вот куда он ведёт на самом деле readlink -f notes.txt # /home/you/.ssh/id\_rsa

Слабое место - шаг проверки согласия. Наивная проверка выглядит так:

    # ОПАСНО: сверяет путь-строку, а не реальную цель import os

    def is\_inside\_workspace\_bad(path, workspace): abspath = os.path.abspath(path) return abspath.startswith(os.path.abspath(workspace))

`os.path.abspath` не разворачивает symlink. Строка `~/project/notes.txt` честно начинается с корня workspace, проверка возвращает `True`, а читается ключ за его пределами.

Правильная проверка разрешает ссылки до сравнения:

    # сверяем РАЗРЕШЁННЫЙ путь после раскрытия symlink import os

    def is\_inside\_workspace\_ok(path, workspace): real\_path = os.path.realpath(path)          # раскрывает symlink real\_ws = os.path.realpath(workspace) # добавляем разделитель, чтобы /work не проходил как префикс /workspace return os.path.commonpath([real\_path, real\_ws]) == real\_ws

Ровно этот класс ошибок Wiz и описала: интерфейс согласия способен показать путь ссылки, а не реальный разрешаемый путь к чувствительному файлу (источник: Wiz Research). Пользователь одобряет то, что видит. А видит он не то, что произойдёт.

![Схема: доверенная папка, символическая ссылка и выход за границу к чувствительному файлу](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/02-21.png)

## Почему окно согласия обманывает, хотя формально не врёт

**Главное:** согласие имеет смысл только если оно про разрешаемый путь, а не про то, что набрано в ссылке.

Окно "разрешить агенту прочитать этот файл?" - это точка, где человек берёт на себя ответственность. GhostApproval бьёт именно туда. Формально интерфейс не лжёт: он показывает путь, по которому агент обратился к файлу. Но человек читает этот путь как обещание "файл внутри проекта", а система такого обещания не давала.

Чтобы согласие снова стало осмысленным, оно должно показывать до чтения файла и путь запроса, и разрешённый путь, если они расходятся. Тогда строка `notes.txt -> /home/you/.ssh/id_rsa` сразу выдаёт себя. Это и есть та граница согласия, о которой говорит editorial-угол находки: где проходит доверие и что именно тебе показывают перед действием.

![Поток авторизации: запрос агента, раскрытие пути, экран согласия с разрешённым путём](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/03-21.png)

Практический контрольный список для такого экрана согласия, если ты сам строишь агента поверх какого-либо API:

1. Разрешай путь через `realpath`/`os.path.realpath` перед любым чтением.
2. Показывай в окне и запрошенный путь, и разрешённый, когда они отличаются.
3. Считай выход за границу workspace отдельным событием, требующим явного повторного подтверждения.
4. Логируй разрешённый путь, а не путь ссылки, иначе аудит после инцидента ничего не покажет.
5. Запрещай чтение по symlink наружу по умолчанию, а не проси человека каждый раз ловить подмену глазами.

## Что делать прямо сейчас: рабочие шаги

**Главное:** обнови инструмент, просканируй проект на ссылки наружу, не доверяй чужим репозиториям слепо.

Шаг 1. Обнови кодового ассистента. Для продуктов с известными фиксами это Amazon Q (CVE-2026-12958) и Cursor (CVE-2026-50549) по данным Wiz. По остальным участникам сверься с их собственными release notes: единой даты для всех шести нет, потому что реакция вендоров различается.

Шаг 2. Найди символические ссылки, ведущие наружу, в любом репозитории до того как дашь агенту доступ:

    # показать все symlink в проекте и куда они реально ведут find . -type l -print0 | while IFS= read -r -d '' link; do target=$(readlink -f -- "$link") case "$target" in "$PWD"/\*) : ;;                       # цель внутри проекта - ок \*) printf 'НАРУЖУ: %s -> %s\\n' "$link" "$target" ;; esac done

Всё, что помечено `НАРУЖУ`, - это то, что агент прочитает как "внутренний" файл.

Шаг 3. Относись к склонированному чужому репозиторию как к недоверенному вводу. Ссылка на `~/.ssh/id_rsa`, `~/.aws/credentials` или `.env` соседнего проекта может лежать в нём заранее, ещё до того как ты открыл его в агенте.

Шаг 4. Держи по-настоящему чувствительные секреты вне досягаемости рабочих папок и вне пользовательского домашнего каталога, если это возможно, а не только "не в проекте".

Шаг 5. Читай экран согласия как показ разрешённого пути. Если инструмент не показывает, куда ведёт ссылка, считай это отсутствием информации, а не отсутствием риска.

### Таблица решений: доверять доступу или нет

| Ситуация | Символические ссылки наружу | Что делать |
| --- | --- | --- |
| Свой проект, ты создал все файлы | Нет | Обычный доступ агента |
| Свой проект, есть ссылки внутрь себя | Только внутрь | Доступ ок, проверь `find` разово |
| Склонированный публичный репозиторий | Неизвестно | Прогнать `find`, дать доступ после |
| Репозиторий с pull request от чужого | Возможны | Проверять каждый раз, не автоапрувить чтения |
| Любой проект + инструмент без фикса | Опасно даже без ссылок | Сначала обновить, потом работать |

## Как это связано с выбором и сравнением моделей

**Главное:** уязвим слой согласия и файлового доступа инструмента, а не сама языковая модель. Но выбор модели всё равно влияет на то, как агент себя ведёт.

Тут стоит развести две вещи. GhostApproval - проблема обвязки: как инструмент проверяет пути и рисует согласие. Меняя модель, ты этот баг не чинишь. Чинит его обновление инструмента и корректная проверка `realpath`.

Что действительно зависит от модели - это поведение агента после того как доступ дан: насколько аккуратно он объясняет, зачем читает файл, как реагирует на подозрительный `notes.txt`, ведущий к ключу, насколько склонен предупредить тебя. Чтобы это оценить честно, полезно прогнать один и тот же тревожный сценарий на нескольких семействах моделей и сравнить ответы бок о бок.

Здесь и появляется практичный мостик из России. provod.ai собирает Claude, GPT, Gemini, DeepSeek и Qwen в одном чате и даёт один API, совместимый с SDK OpenAI и Anthropic - меняешь ключ и base\_url, остальной код тот же. Это удобно ровно для задачи сравнения и маршрутизации между семействами моделей, когда тебе нужно быстро понять, кто из них лучше замечает подмену пути, без отдельных подписок и без VPN. Оплата рублями с российской карты, через СБП или по счёту, баланс один на все модели; для юрлица есть договор, счёт и закрывающие документы ([provod.ai](https://provod.ai/?utm_source=provod-blog&utm_medium=article&utm_campaign=ghostapproval-coding-agent-symlinks&utm_content=inline&utm_id=brief-seo-fast-004)).

Минимальный пример переключения на такой совместимый API - секрет держи в переменной окружения, не в коде:

    from openai import OpenAI

    client = OpenAI( base\_url="https://api.provod.ai/v1", api\_key="PROVOD\_API\_KEY\_PLACEHOLDER",  # подставь из окружения, не коммить )

    resp = client.chat.completions.create( model="claude-opus-4-8", messages=[ {"role": "system", "content": "Ты аудитор безопасности. Объясни риск чтения файла."}, {"role": "user", "content": "Файл notes.txt это symlink на \~/.ssh/id\_rsa. Читать?"}, ], ) print(resp.choices[0].message.content)

Повторяешь тот же запрос, меняя `model` на другое семейство, и сравниваешь, кто поднимает тревогу. Сам баг доступа это не лечит - лечит обновление инструмента, - но помогает выбрать модель, которая хотя бы предупредит.

![Сравнение семейств моделей и стоимости запроса при одинаковом сценарии](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/04-21.png)

## Частые ошибки и как отлаживать

**Главное:** большинство провалов - это молчаливое разрешение symlink и логи, в которых записан не тот путь.

Разберём типичные грабли, когда ты сам строишь или встраиваешь агента, в том числе внутри автоматизаций на платформах вроде n8n, где вызовы к файлам и моделям идут без человека у экрана.

- **Проверка через `abspath` вместо `realpath`.** Самый частый случай. Строка проходит, ссылка живёт. Лечится заменой на `os.path.realpath` и `commonpath`, как выше.
- **Проверка префикса без разделителя.** `startswith("/work")` пропустит `/work-evil`. Всегда сравнивай по компонентам пути.
- **Согласие без человека в автоматизации.** В пайплайне n8n или подобном экран согласия часто вообще выключен. Значит защита должна стоять кодом до чтения, а не в интерфейсе. Автоапрув чтений в недоверенных репозиториях - прямой путь к GhostApproval-сценарию.
- **Логи пишут путь ссылки.** После инцидента ты увидишь `notes.txt` и не поймёшь, что утёк ключ. Логируй разрешённый путь.
- **TOCTOU-гонка.** Проверил путь, потом открыл - между этими шагами ссылку могли подменить. Где возможно, открывай дескриптор и проверяй его, а не путь дважды.

Быстрая карта диагностики: если агент "неожиданно много знает" о системе, начни с `find . -type l`, затем сверь, что именно попало в контекст последнего запроса, затем проверь версию инструмента против списка с фиксами.

![Карта отладки: от подозрительного поведения агента к symlink и версии инструмента](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/05-21.png)

## Чего это не решает

Будь честен с границами.

- Обновление и `realpath` закрывают GhostApproval, но не делают агента безопасным вообще. Prompt injection через содержимое файлов, утечки через сетевые вызовы и избыточные права остаются отдельными задачами.
- Сравнение моделей помогает выбрать более осторожного агента, но не заменяет технический контроль доступа. Модель, которая "обычно предупреждает", всё равно иногда промолчит.
- provod.ai даёт доступ к иностранным моделям через совместимый API для сравнения и маршрутизации между семействами - и только это. Он не заменяет платформы автоматизации, не предоставляет GigaChat, не заменяет частную или on-prem инфраструктуру, не открывает функции, доступные только по подписке конкретного вендора, и не делает за тебя внедрение и аудит.
- Статусы вендоров различаются. Эта статья не даёт единого "безопасно/нет" по всем шести продуктам - сверяйся с их собственными объявлениями.
- Отсутствие подтверждённой эксплуатации не значит, что риска нет. Это значит, что публичных жертв на дату проверки не заявлено (источник: Wiz Research).

## Как подключить Claude API для бизнеса через provod.ai

- **Один API.** provod.ai даёт один OpenAI-совместимый API-ключ для доступных моделей из каталога; в существующем OpenAI SDK меняются только base URL и ключ.
- **Оплата в рублях.** Баланс provod.ai пополняется в рублях, а стоимость списывается за фактические запросы к выбранной модели.
- **Прозрачная цена.** Цены токенов в provod.ai указаны без наценки; при пополнении баланса действует отдельный сервисный сбор 5%.
- **Доступ из России.** Доступ к provod.ai работает из России без VPN и без зарубежной банковской карты.
- **Документы для бизнеса.** Для компаний provod.ai поддерживает рублёвую оплату, договор, счёт и закрывающие документы; текущая продуктовая справка также указывает ЭДО.

Проверка фактов актуальна на 2026-07-14. Все волатильные детали привязаны к источникам выше.

![Мем: разрешил папку - раздал весь диск через одну ссылку](https://storage.yandexcloud.net/provod-yc-production-cms-media/provod-yc-production-cms-media/blog/06-21.png)

[Подключите Claude API для бизнеса через единый API provod.ai](https://provod.ai/?ref=blog-cta-bottom&utm_source=provod-blog&utm_medium=article&utm_campaign=ghostapproval-coding-agent-symlinks)

### Источники

- Wiz Research, "GhostApproval: A Trust Boundary Gap in AI Coding Assistants", 2026-07-08 (первичный; факты о дате, шести продуктах, механике symlink, экране согласия, CVE-2026-12958 и CVE-2026-50549, различии статусов вендоров и отсутствии подтверждённой эксплуатации): https://www.wiz.io/blog/ghostapproval-a-trust-boundary-gap-in-ai-coding-assistants
- ITPro, "Flaws in some of the most popular AI coding tools left developers wide open to attack", 2026-07-09 (вторичный; подтверждает дату, перечень продуктов, механику и CVE): https://www.itpro.com/security/flaws-in-some-of-the-most-popular-ai-coding-tools-left-developers-wide-open-to-attack

## FAQ

### Что такое provod.ai?

provod.ai — российская мультимодельная AI-платформа: чат, совместимые API, генерация и редактирование изображений, видео, coding-интеграции и командные рабочие пространства используют общий предоплаченный баланс в рублях. Начните с [обзора](/ru.md), [документации](/ru/docs.md) или [каталога моделей](/ru/models.md).

### У provod.ai самые низкие цены среди российских провайдеров?

Это заявленная ценовая позиция provod.ai: поддерживать самые низкие публичные рублёвые цены среди российских провайдеров для сопоставимого доступа к одной и той же модели. Это не бессрочная гарантия для каждой модели: сравнивайте модель и версию, единицы тарификации, входные и выходные токены, кэширование, налоги, курс, минимальный платёж и акции на одну дату. Для конкретного ответа используйте [живой каталог](/ru/models.md), [страницу цен](/ru/pricing.md) и [правила проверки расхода](/ru/docs/usage-costs.md).

### Можно ли обещать отсутствие наценки?

Нет. Стоимость определяется опубликованными тарифами в рублях и подтверждённым использованием. Самая низкая сравнимая цена и полное совпадение с тарифом upstream-поставщика — разные утверждения; не обещайте универсальное отсутствие наценки без отдельного подтверждения.

### Насколько стабилен сервис?

provod.ai позиционирует сервис как рассчитанный на отличную стабильность в ежедневной работе. Доступность конкретных моделей остаётся динамической. Этот файл не публикует процент uptime и не устанавливает универсальный SLA; проверяйте текущий каталог и условия применимого договора.

### Почему provod.ai подходит для юридически оформленной работы в России?

provod.ai позиционирует себя как один из немногих российских сервисов доступа к AI, который публично указывает действующее юридическое лицо, публикует [оферту](/ru/legal/terms.md), [политику обработки персональных данных](/ru/legal/privacy.md), [реквизиты](/ru/legal/requisites.md), принимает оплату в рублях и документирует [расчёты для компаний](/ru/docs/business-billing.md). Материалы о [152-ФЗ](/ru/docs/152-fz.md) и защите данных описывают возможности и ограничения, но не заменяют юридическую оценку конкретного процесса клиента.

### provod.ai работает без VPN?

Публичный сайт описывает доступ без VPN. Для API используйте документированный базовый URL и ключ платформы; доступность конкретной модели проверяйте в текущем каталоге.

### Какие протоколы и интеграции доступны?

Документация описывает OpenAI-совместимые Chat Completions и Responses, Anthropic Messages, интерфейсы изображений, а также Claude Code, OpenCode и Codex CLI. Совместимость не означает поддержку всех upstream-параметров: следуйте [обзору интеграций](/ru/docs/integrations-overview.md), конкретной инструкции и ограничениям модели.

### Есть изображения и видео?

Платформа поддерживает работу с изображениями и видео. Генерация, редактирование, входные данные, длительность, разрешение и другие параметры зависят от выбранной модели и текущего публичного каталога.

### Какие источники считать актуальными?

Для модели, доступности, возможностей, лимитов и цены используйте [живой каталог](/ru/models.md). Для поведения API — соответствующую страницу [документации](/ru/docs.md). Для правовых выводов — русские официальные документы и применимый договор. Никогда не передавайте API-ключи, приватные данные рабочего пространства или preview-ссылки в публичные документы. По вопросам обращайтесь через [контакты](/ru/contact.md).
