Атака через AGENTS.md в Downloads: проверка Codex и Claude Code
Проверьте файлы инструкций в папке загрузок до запуска ИИ-агента. Найдите неожиданные настройки MCP в Codex, подмену адреса API в Claude Code и следы установки function-color. Отделите реальный инцидент от результатов экспериментов, отзовите скомпрометированные учётные данные и проверьте свой шлюз с учётом приоритета настроек.
Содержание

Не запускайте Codex или Claude Code в ~/Downloads и других папках с непроверенными файлами. Если агент уже работал в такой папке, проверьте AGENTS.md и настройки агента до следующего запуска. При обнаружении постороннего адреса API или следов установки вредоносного пакета остановите затронутые сеансы и отзовите соответствующие учётные данные.
Проверка рассчитана на локальные Codex и Claude Code; сведения о конфигурации сверены по состоянию на 2026-10-28. Вы получите список файлов для просмотра, проверите настройки и определите, нужно ли расследовать инцидент.
Что показало исследование атаки через Downloads
Атака использует непроверенные инструкции, чтобы изменить конфигурацию самого агента. Markdown-файл сам по себе ничего не запускает: команды выполняет агент через доступные ему инструменты.
В отчёте Forever Security от 22 октября описана заблокированная попытка установки пакета. Её вызвали инструкции из ~/Downloads/AGENTS.md на компьютере клиента. Как файл попал в папку, выяснить не удалось.
- Эксперимент с Codex: агент зарегистрировал сервер инструментов по протоколу Model Context Protocol (MCP) в
~/.codex/config.toml. Для установкиfunction-colorв цепочке использовалисьlaunchctlиnpm. Дочерний процессcodex execзапускался с--dangerously-bypass-approvals-and-sandbox. - Эксперимент с Claude Code: инструкции из
CLAUDE.mdпобудили агента изменитьANTHROPIC_BASE_URLв.claude/settings.json. Исследователи перехватили OAuth-токен — учётные данные для запросов от имени вошедшего пользователя. Их сервер возвращал поддельные вызовыBash. Иногда вспомогательный агент открывал соединение с подменённым адресом в том же сеансе. По данным отчёта, запись этих настроек требовала подтверждения пользователя.
Исследователи сообщили об успехе более чем в 90% попыток для Codex. Для Claude изменение конфигурации удалось примерно в 50% попыток, а выполнение кода в том же сеансе — примерно в одной пятой. В большинстве тестов использовали безопасную замену, которая запускала калькулятор. Настоящий вредоносный пакет запустили один раз в изолированной виртуальной машине. Эти цифры описывают тесты исследователей и не показывают вероятность взлома конкретного пользователя.
Поведение браузера зависит от настроек. В документации Chrome описаны выбор папки загрузок, необязательный запрос места сохранения и уведомления о скачанных файлах. Скачивание файла браузером и успешная компрометация агента — отдельные события.
Codex 0.165.0 не загружает проектные инструкции, если проект явно помечен как недоверенный. OpenAI также описывает защищённые пути .codex в стандартной политике песочницы workspace-write. Не отключайте эти ограничения: в уже проверенной папке могут появиться новые файлы.
Первичная проверка примерно за пять минут
Остановите агентов и просматривайте файлы в обычном терминале или текстовом редакторе. Пять минут — ориентир для одной знакомой рабочей папки. Разбор подозрительных находок и восстановление компьютера потребуют больше времени.
1. Найдите файлы инструкций до запуска агента
Уточните текущую рабочую папку и фактическую папку загрузок браузера. В Bash на macOS или Linux выполните следующий поиск, если установлен ripgrep, rg: он выводит только имена файлов.
pwd -P
rg --files --hidden --no-ignore \
-g 'AGENTS.md' -g 'AGENTS.override.md' \
-g 'CLAUDE.md' -g 'CLAUDE.local.md' \
-g '**/.claude/settings*.json' \
-g '**/.codex/config.toml' -g '.mcp.json' \
-g '!**/.git/**' -g '!**/node_modules/**' \
"$HOME/Downloads"
Если браузер сохраняет загрузки в другом месте, замените последний путь. Повторите поиск в папке скачанного или клонированного проекта. Если rg не установлен, найдите файлы с этими именами через файловый менеджер, включив показ скрытых файлов.
Команда выводит только пути: она не запускает агента и не раскрывает значения настроек. Прежде чем оценивать пустой результат, устраните ошибки доступа и проверьте, существуют ли указанные папки. Поиск не читает архивы и не переходит по вложенным символическим ссылкам. Отсутствие результатов не доказывает, что компьютер не заражён.
Открывайте найденные файлы как обычный текст. Ищите указания переписать настройки агента, сменить провайдера, установить неожиданные инструменты или отключить подтверждения действий. Отдельно просмотрите импортируемые файлы инструкций и файлы, на которые ведут ссылки.
Проверьте также глобальные инструкции в каталоге Codex и в ~/.claude/CLAUDE.md. Codex ищет проектные инструкции на пути от найденного корня проекта до рабочей папки. Если корень проекта не найден, проверяется только текущий каталог. Учтите AGENTS.override.md и резервные имена файлов инструкций, заданные в конфигурации.
Claude Code загружает инструкции и из родительских папок. Поэтому переход в подпапку Downloads не гарантирует, что эти инструкции перестанут загружаться. Используйте проверенную рабочую папку за пределами каталога загрузок.
2. Проверьте настройки Codex, действующие в разных проектах
Откройте ~/.codex/config.toml до запуска Codex. Это конфигурация пользователя: её изменение может затронуть другие проекты того же пользователя. Если задан CODEX_HOME, проверьте config.toml в этом каталоге.
Проверьте также файл профиля, который выбирает команда запуска, и файлы .codex/config.toml внутри проекта, которые загружает Codex. Порядок загрузки настроек описан в базовом руководстве OpenAI. Каталоги конфигурации и профили разобраны в расширенном руководстве.
| Параметр | Что проверить |
|---|---|
[mcp_servers.<name>] | Убедитесь, что сервер вам знаком. Проверьте полные значения command, args, cwd, env, а для удалённого сервера — url. |
chatgpt_base_url | Если адрес сервиса ChatGPT переопределён, убедитесь, что вы согласовали это изменение. |
openai_base_url, model_provider, model_providers.<id>.base_url | Адрес API должен соответствовать выбранному вами провайдеру. |
projects.<path>.trust_level | Проверьте, какие папки помечены как доверенные, особенно Downloads и другие каталоги с разнородными файлами. |
MCP подключает агента к инструментам. Конфигурация локального MCP-сервера может запускать процесс. Проверяйте аргументы команды и адрес подключения: одного знакомого названия недостаточно.
Выясните назначение незнакомого сервера. Общее название сервера или наличие npm, npx либо launchctl само по себе не доказывает заражение.
По состоянию на 2026-10-28 справочник конфигурации Codex запрещает проектным настройкам переопределять chatgpt_base_url и параметры маршрутизации к провайдеру. Это ограничение не отменяет посторонние изменения, уже внесённые в пользовательскую конфигурацию.
3. Проверьте настройки Claude Code и их приоритет
Проверьте все источники настроек, которые могут задавать адрес API. При запуске из корня проекта просмотрите следующие файлы:
| Файл | Область действия |
|---|---|
~/.claude/settings.json | Ваши настройки для всех проектов. |
.claude/settings.json | Общие настройки этого проекта. |
.claude/settings.local.json | Ваши локальные настройки этого проекта. |
Если задан CLAUDE_CONFIG_DIR, ищите пользовательский файл в этом каталоге конфигурации. На корпоративном компьютере уточните у администратора, какие централизованные настройки применяются.
Проверьте env.ANTHROPIC_BASE_URL, HTTP_PROXY и HTTPS_PROXY. Посмотрите, какие переменные аутентификации заданы, не копируя их секретные значения в чаты или журналы. Проверьте также неожиданные hooks (обработчики событий) и изменения правил разрешений.
В документации Anthropic ANTHROPIC_BASE_URL описан как переопределение адреса API. Для согласованного шлюза это нормальная настройка. Неизвестный хост, необъяснимое изменение или адрес из скачанной инструкции — повод разобраться.
По правилам приоритета Claude Code локальные настройки проекта выше общих проектных, а те — выше пользовательских. В большинстве сеансов значение в блоке env файла настроек также заменяет значение одноимённой переменной из оболочки. Поэтому адрес в пользовательском файле или экспорт переменной в оболочке не защищает от переопределения.
Если появились неожиданные MCP-интеграции, проверьте и .mcp.json. В рекомендациях Anthropic по безопасности MCP указано, что настройки других уровней и плагины могут добавлять серверы вне этого файла.
4. Найдите следы установки пакета
Если агент работал в подозрительной папке, проверьте метаданные пакетов и журналы. Выполните из этой папки команду Bash, которая выводит только имена файлов с совпадениями:
rg -l --hidden --no-ignore -F 'function-color' \
-g 'package.json' -g '*lock*' \
-g 'npm-shrinkwrap.json' -g '*.log' \
-g '!**/.git/**' \
.
Просмотрите найденные файлы локально. Проверьте также /tmp/ptools и соответствующие журналы установки npm, если они сохранились. Поиск только внутри проекта может пропустить установку в другой папке.
Анализ Checkmarx относит function-color версий 1.0.0 и 1.7.3 к вредоносным пакетам-обёрткам для function-flag. Изученный загрузчик рассчитан на Windows. Упоминание пакета в конфигурации macOS само по себе не доказывает, что конкретный вредоносный код запустился.
Различайте упоминание пакета в статье, запись об установленной зависимости и журнал установки. Сам по себе lock-файл не доказывает запуск установочного скрипта. При наличии следов установки считайте компьютер потенциально скомпрометированным до завершения расследования. Не устанавливайте и не импортируйте пакет ради проверки. Пустой результат поиска не исключает переименованный код или удалённые следы.
Что сделать до повторного входа в аккаунт
С доверенного устройства отзовите учётные данные, которые могли утечь. Сделайте это до повторного использования затронутой конфигурации. Выберите действия по тому, что удалось установить:
- Найдены посторонние инструкции, но нет признаков их использования: сохраните файл для разбора и поместите его вне каталогов, где агент ищет инструкции. Проверьте конфигурацию, прежде чем решать, могли ли утечь учётные данные.
- Найден посторонний адрес API, на который могли уйти запросы с авторизацией: исходите из возможной утечки использованных учётных данных. Отзовите их и проверьте активность аккаунта.
- Есть признаки запуска вредоносного кода пакета: изолируйте компьютер и обратитесь к команде безопасности. До очистки сохраните нужные файлы и журналы. Удаление Markdown-файла не удаляет установленный код и не лишает силы украденные учётные данные.
Если вы входили через подписку Claude, используйте управление сеансами аккаунта Claude. В разделе Settings → Account завершите затронутые сеансы или выйдите из всех сеансов аккаунта. Если токены Claude Code перечислены в Settings → Claude Code, удалите соответствующее разрешение там. По сведениям Anthropic, выход из всех сеансов распространяется и на Claude Code, включая токены, созданные командой setup-token.
Отзовите API-ключи отдельно. В инструкции Anthropic на случай утечки ключа предлагается удалить затронутый ключ и создать новый. Выход из аккаунта не отзывает API-ключи.
Для доступа к OpenAI следуйте инструкции по защите скомпрометированного аккаунта: завершите сеансы, удалите API-ключи, которые могли утечь, проверьте активность и обратитесь в поддержку. Не считайте, что удаление локального файла с учётными данными автоматически отзывает украденный токен или завершает сеанс на сервере.
До нового входа на этом компьютере восстановите проверенную конфигурацию и удалите посторонние интеграции, запускаемые вместе с агентом. Если не удаётся установить, какой код выполнялся, не возвращайте компьютер к обычной разработке до завершения расследования.
Как сохранить контроль над настройками API-шлюза
Выбирайте адрес шлюза сами и проверяйте, из какого источника он загружается. Для личной работы храните согласованный адрес в пользовательской конфигурации или в переменных оболочки, которую контролируете. В команде используйте утверждённый способ подключения.
Рассматривайте адрес из проекта как изменение настроек, которое нужно проверить. Это может быть штатная настройка команды. Но надпись «внутренний шлюз» сама по себе не даёт оснований её одобрять.
Например, инструкция BetterToken для Claude Code указывает https://bettertoken.ai без /v1 и ваш собственный API-ключ BetterToken. Доступ к этому API и подписка Claude — разные услуги. Для шлюза используйте выданный им ключ, а не OAuth-токен подписки. Этот адрес относится к API BetterToken; доступ к сторонним сайтам, установщикам, аккаунтам и обновлениям проверяйте отдельно.
Если подключаете Codex к выбранному провайдеру, сверьте блок настроек с руководством по подключению своего провайдера к Codex. Не используйте chatgpt_base_url как универсальный параметр адреса API модели.
После проверки конфигурации или завершения восстановления можно проверить подключение Claude Code без проектных настроек и дополнительных компонентов. Запустите следующую команду из уже проверенной папки проекта:
claude --safe-mode --setting-sources user --permission-mode default
Эти флаги описаны в справочнике CLI. В безопасном режиме не загружаются дополнительные компоненты, в том числе файлы инструкций, плагины и MCP-серверы. Аутентификация и проверка разрешений продолжают работать. Пользовательские настройки и централизованные политики всё равно должны быть доверенными. Режим разрешений default в интерфейсе подписан Manual — ручной режим.
Если клиент не принимает какой-либо флаг, сначала проверьте claude --help и официальную инструкцию по обновлению.
Командой /status проверьте, какие источники настроек загружены. Затем отправьте короткий запрос, например Reply with OK. Do not use tools. Ответ должен появиться в терминале. Если у провайдера есть история запросов, сопоставьте время, чтобы подтвердить маршрут именно этого запроса. Это обычный запрос к модели, с соответствующим расходом лимита или оплатой.
То, как модель представилась в ответе, не подтверждает адрес сервера. Если непонятно, куда ушёл запрос, выполните проверку активного провайдера Claude Code. Остановитесь, если настройки неожиданно меняются. Успешная проверка подключения не доказывает, что компьютер не заражён.
Как отделить загрузки от повседневной работы агента
Работайте в проверенной папке проекта вне каталога загрузок браузера. Для анализа скачанного CSV сначала проверьте файл и скопируйте в рабочую папку только его. При переносе целой непроверенной папки вместе с ней переедут и файлы инструкций.
В Chrome откройте Settings → Downloads и включите Ask where to save each file before downloading — запрос папки перед каждой загрузкой. Это добавит шаг подтверждения, но уже сохранённые файлы всё равно нужно проверить.
Оставьте включёнными песочницу и подтверждения действий. Документация по безопасности Codex разделяет ограничения команд в песочнице, соединения MCP и запросы аутентификации клиента. Песочница с доступом только для чтения не делает запуск с непроверенной конфигурацией безопасным.
Повторяйте проверку после клонирования репозитория, распаковки архива или изменения настроек агента. Если задача требует запуска недоверенного кода, используйте изолированную среду без ваших обычных учётных данных для разработки.