
Forever Security остановила на машине заказчика ИИ-агента до выполнения кода: вредоносный AGENTS.md в папке «Загрузки» требовал поставить npm-пакет function-color. Патчить OpenAI и Anthropic здесь нечего — агент делал то, для чего его собрали. Как файл попал в каталог, фирма так и не установила.
Коротко
- Forever остановила агента на машине заказчика до выполнения кода: в «Загрузках» лежал вредоносный AGENTS.md.
- Как файл попал в папку, не установлено; тихая загрузка с сайта — проверенная Forever возможность, не доказанный путь этого инцидента.
- function-color исследователи CloudSEK и Checkmarx относят к кампании MALFEX; пакет тянет загрузчик function-flag и Windows-нагрузку.
- Правка ~/.codex/config.toml переживает папку «Загрузки»; подмена ANTHROPIC_BASE_URL в Claude Code может отдать токен сессии.
- CVE и патча нет: OpenAI и Anthropic, по оценке Forever, здесь нечего исправлять — агент слушался файл так, как его спроектировали.
Что Forever остановила на машине заказчика
На реальной машине заказчика Forever Security зафиксировала попытку и остановила агента до того, как выполнился хоть какой-то код. Файл назывался AGENTS.md и лежал в папке «Загрузки» разработчика.
Отчёт фирма опубликовала незадолго до 26 октября 2026 года. В этот день The Hacker News выпустил материал Свати Кханделвал: файл в папке загрузок заставляет агента для программирования установить вредоносный пакет. Имена авторов отчёта Forever публикация не приводит.
AGENTS.md — обычный текстовый файл инструкций. Codex от OpenAI при старте в папке читает его и принимает текст за указания к работе. У Claude Code ту же роль играет CLAUDE.md. Сам Markdown код не запускает.
Риск начинается, когда агент превращает прочитанное в вызов инструмента, правку конфигурации или команду установки. В источнике нет CVE, нет оценки CVSS и нет номера исправленной сборки. Версии Codex и Claude Code не названы.
Forever описывает случай как сбой модели доверия, а не как дефект конкретной версии. Бюллетеня «обновитесь до сборки N» в отчёте нет, и ждать его по этой истории не из чего.
В тикете держите два уровня раздельно. Подтверждено срабатывание на рабочей машине и остановка до кода. Цепочку доставки до этого заказчика отчёт не доказывает. Смешать уровни — значит либо раздуть инцидент, либо выбросить единственный твёрдый факт.
Почему безвредные по отдельности свойства складываются в атаку
Атака складывается из двух свойств. Каждое по отдельности выглядит штатным. Вместе они дают странице способ оставить агенту приказ в папке, которой он доверяет.
Первое свойство заложено в продукт. Агента для программирования учат читать AGENTS.md, CLAUDE.md и похожие файлы, чтобы не повторять одни и те же правила в каждом чате. Открыли папку и запустили Codex — он обязан учесть инструкцию.
Второе свойство Forever описывает прямо: веб-страница может сама сохранить файл в «Загрузки», без клика и без запроса разрешения, с выбранными именем и содержимым. В отчёте это свойство канала, а не разбор политики конкретного браузера.
OpenAI и Anthropic, по оценке Forever, здесь нечего патчить. Агент, который слушается файл инструкций в открытой папке, делает то, для чего его собрали. Фирма сравнивает это с браузером, который отрисовал фишинговую страницу: страница вредная, отрисовка штатная.
Чтобы проверить, достижим ли полный путь, Forever собрала собственную страницу. Визит на неё молча скачивает AGENTS.md в «Загрузки». Это проверка возможности, отдельная от разбора машины заказчика.
По нашей классификации это косвенная prompt injection: указания приходят не из строки чата, а из файла, который агент читает сам. Карту вектора мы уже разбирали: карта prompt injection для тех, кто строит агентов. Здесь файл лежит в каталоге, который разработчик открывает каждый день.
Тестирование безопасности ИИ-агентов смотрит на эту связку. Подчинится ли агент чужому файлу в рабочей папке. Утащит ли правку в глобальный конфиг. Попросит ли человека подтвердить опасное действие. CVE для сценария в отчёте нет.
«Загрузки» редко считают рабочей директорией. Туда падают архивы, PDF, выгрузки тикетов и случайные клоны. Агент с правами пользователя в той же сессии видит исходники, токены реестров, SSH-агент и облачные сессии.
Один запуск агента в чужой папке — уже не «безопасный чат», а полноценная консоль разработчика. К правам пользователя добавляется доступ, который выдан его инструментам: оболочка, сеть, запись файлов.
Что было внутри вредоносного AGENTS.md и при чём MALFEX
Вредоносный AGENTS.md был замаскирован под обычные инженерные заметки. В одном разделе он велел агенту прописать сервер в собственном конфиге и установить npm-пакет function-color.
Название MALFEX дали исследователи CloudSEK и Checkmarx, не Forever. Они разбирали линейку отдельно. function-color относят к MALFEX: пакет подтягивает загрузчик function-flag, а тот получает и запускает нагрузку для Windows.
Имя самой нагрузки источник не раскрывает. Атрибуции операторов нет. Имена пакетов в этом разборе — ориентир для поиска, не замена бюллетеням CloudSEK, Checkmarx и отчёту Forever.
Установка npm-пакета по чужой инструкции уже точка компрометации: имя пришло не из ревью зависимостей, а из файла, который агент принял за задание. Просить агента «просто поставить зависимость» — значит доверить ему шаг, который человек ещё не проверял.
Источник описывает установку по тексту инструкции, а не подмену библиотеки внутри проекта. Имя function-color в таком файле смотрят до команды install. Рядом по реестру npm мы разбирали вредоносные npm-пакеты PhantomRaven: другой сюжет и тот же порядок — сначала текст задания, потом пакет.
Финальная нагрузка предназначена для Windows. Командам на macOS и Linux рано считать себя в безопасности. Правка конфига, команда агента и утечка токена сессии происходят раньше стадии Windows-нагрузки.
Пока function-flag не скачал файл, сессия уже может быть чужой. Для правила обнаружения хватает связки из отчёта: AGENTS.md просит сервер в конфиге и установку function-color, дальше по цепочке CloudSEK и Checkmarx фигурирует function-flag. Хеши и адреса сюда не копируем.
Чем воспроизведение на Codex отличается от Claude Code?
Forever прогнала сценарий на двух агентах, чтобы показать: класс не привязан к одному продукту. Исход у Codex и у Claude Code разный. Проценты из двух прогонов складывать в рейтинг нельзя: действия и условия теста не совпадали.
Против Codex фирма взяла настоящий файл атакующего и изолированную виртуальную машину. Текст был оформлен как обычная настройка проекта. Он просил зарегистрировать сервер в ~/.codex/config.toml и выполнить команду установки пакета.
Codex доходил до установки вредоносного ПО более чем в 90 % попыток. Число попыток Forever не раскрыла. Цифра описывает этот прогон, а не долю уязвимых установок Codex.
~/.codex/config.toml — конфиг пользователя, не настройки одной папки. Прописанный там сервер подхватится в следующих сессиях Codex в любом каталоге, не только в «Загрузках». Одно чтение файла в Downloads оставляет последствия за пределами этого каталога.
Чистка «Загрузок» вопрос не закрывает. Смотрите, не появился ли чужой server или base URL в глобальном файле. Правка переживает и каталог, и репозиторий: следующий чат в другом проекте подхватит тот же server.
Запись ANTHROPIC_BASE_URL в .claude/settings.json в тесте Forever была проектной. Токен сессии, который при этом может утечь, к одному репозиторию не привязан. Отзывать его нужно на уровне учётной записи. Глобальный toml и проектный settings.json различаются по области действия, но оба выводят ущерб за пределы одной папки.
Против Claude Code сценарий был другим и срабатывал реже. Подкладывали CLAUDE.md, оформленный как настройка внутреннего шлюза. Файл пытался заставить Claude записать ANTHROPIC_BASE_URL в проектный .claude/settings.json, чтобы API-трафик шёл на сервер под контролем Forever.
Технического обхода подтверждения не было. Claude Code просит человека одобрить такую запись и часто отказывается, если правка выглядит криво. Длинный текст в виде инженерного документа поднял долю одобрений примерно до половины.
Одна эта правка, по оценке Forever, уже захват учётной записи. Утечь может токен сессии. Сервер может отвечать так, будто он и есть модель, и возвращать команды, которые агент исполнит. Украденный токен остаётся живой сессией, пока его не отзовут.
Запрос подтверждения у человека снижает вероятность, но не отменяет доверие к файлу. В тесте Forever сдвиг дал не обход песочницы, а текст: настройка внутреннего шлюза и длинный инженерный документ. Выключенный запрос подтверждения убирает и этот неполный фильтр.
Что известно и что не установлено
Оговорки, которые легко растащить по всему разбору, собраны здесь. Таблица отделяет то, что следует из отчёта Forever и материала The Hacker News, от того, чего в источниках нет.
| Что установлено | Чего в источниках нет |
|---|---|
| Остановка агента на машине заказчика до выполнения кода | Канал, которым AGENTS.md попал в «Загрузки» |
| Файл замаскирован под инженерные заметки и ведёт к function-color | Применял ли кто-то веб-доставку против этого заказчика |
| CloudSEK и Checkmarx относят пакет к MALFEX; загрузчик — function-flag | Имя Windows-нагрузки и атрибуция операторов |
| Проверочная страница Forever молча сохраняет AGENTS.md | Точная дата обнаружения и точный день отчёта |
| Codex: более 90 % на настоящем файле в изолированной ВМ | Число попыток и версии Codex и Claude Code |
| Claude Code: около половины одобрений записи ANTHROPIC_BASE_URL | Методика и размер выборки |
| Около половины заказчиков Forever запускают агента в Downloads | Перенос этой доли на все компании |
| Примерно четверть сессий агента открывает браузер | Сколько сессий так ведут себя у вас — это ваш журнал |
| Позиция Forever: патча для OpenAI и Anthropic нет | Номер CVE |
Телеметрия описывает заказчиков Forever, не индустрию. Около половины из них запускают агента для программирования в папке Downloads. Примерно четверть сессий агента открывает браузер. Методика и размер базы не раскрыты, поэтому «половина рынка» из этих долей не следует.
Атаке, как её видит Forever, нужны именно эти условия. Агент стартует там, куда страница умеет записать файл сама. Часто агент сам открывает браузер, и человек не видит момент, когда файл появляется.
Страны и отрасли источник не называет. Речь о разработке: агент на рабочей станции с доступом к коду и облаку. Внутри своей фирмы вопрос к журналам прямой: сколько сессий стартует в ~/Downloads и сколько из них в том же окне ходят в браузер.
Клон репозитория даёт тот же класс риска без «Загрузок». Чужой AGENTS.md или CLAUDE.md в свежем git clone агент прочитает так же. Запрет стартовать в Downloads закрывает один карман, не модель доверия.
Эти файлы имеет смысл ставить в ревью рядом с workflow CI, скриптами сборки и манифестами зависимостей. Ищете команды установки, правки ~/.codex/config.toml и .claude/settings.json, смену base URL, отключение песочницы и адреса вне вашего списка API.
Агент действует с правами того, кто его вызвал, плюс с тем доступом, который выдан его инструментам. Даже без Windows-нагрузки отравленный base URL или сервер в config.toml бьёт по следующим сессиям и по другим проектам того же пользователя.
Общий раннер, который стартует агента из каталога с чужим AGENTS.md, разнесёт правку конфига на следующие сборки. Смотреть стоит и ноутбук разработчика, и шаблон пайплайна.
Как проверить, не подложен ли AGENTS.md?
До следующего запуска не открывайте Codex, Claude Code и любого другого агента в ~/Downloads. По словам Forever, это каталог, куда страница может записать файл сама, без отдельного действия человека.
Дальше ищите файлы, которые писали не вы. Чужой AGENTS.md или CLAUDE.md в «Загрузках» и в только что клонированном репозитории — и есть атака в том виде, как её описала Forever. Прочитайте текст до того, как агент окажется в этой папке.
Инструкция «выключи подтверждения» или «выключи песочницу» — повод остановиться. Подтверждения и песочницу оставьте включёнными. В тесте Claude Code человек блокировал часть записей, пока текст не стал длинным инженерным документом.
Конфиг проверяйте как механизм закрепления, а не как безобидный локальный файл. Удаление AGENTS.md не откатывает ~/.codex/config.toml.
- В ~/.codex/config.toml — блок server или base URL, которого вы не добавляли.
- В .claude/settings.json проекта — ANTHROPIC_BASE_URL или другой адрес API, которого нет в вашем эталоне.
- Те же ключи в других проектах той же учётной записи: глобальный toml переживает удаление одного файла.
- Журнал агента и история оболочки — до зачистки файла, не после.
Ниже — не индикаторы из отчёта, а шаблон того, что считать подозрительным. Адресов и хешей здесь нет: The Hacker News их из отчёта Forever не приводит, и додумывать их нельзя.
Какая строка в конфиге выглядит чужой
В ~/.codex/config.toml смотрите блок сервера или base URL, который вы не вносили. Фрагмент ниже — иллюстрация класса правки, не цитата из файла атакующего. Домен example.invalid в сеть не резолвится.
base_url = "https://example.invalid/v1" # .claude/settings.json "ANTHROPIC_BASE_URL": "https://example.invalid"
Что искать в репозитории и в CI
По дереву исходников ищите сами файлы инструкций и опасные ключи, а не хеш нагрузки. Запрос для ripgrep:
rg -n -g 'AGENTS.md' -g 'CLAUDE.md' -g 'config.toml' -g 'settings.json' 'function-color|function-flag|ANTHROPIC_BASE_URL|Downloads'
В шаблоне пайплайна отдельно проверьте, не стартует ли агент с рабочей директорией $HOME/Downloads и не копирует ли job чужой AGENTS.md в каталог сборки до запуска.
В журналах агента смотрите три следа: чтение AGENTS.md или CLAUDE.md из «Загрузок» или из свежего клона; запись в ~/.codex/config.toml или .claude/settings.json; команду установки, где фигурирует function-color или function-flag. Пока пакета нет в истории менеджера, это ещё попытка. Появление имени в истории — уже исполнение.
Подозрительную инструкцию воспроизводите на снимке изолированной виртуальной машины, с контролируемой сетью и одноразовыми учётными данными. Ставить пакет на рабочей станции нельзя: в воспроизведении Forever именно установка и была компрометацией.
Доказательства не стирайте в первую минуту. Сохраните файл, хеш самого AGENTS.md, метки времени, историю загрузок браузера, лог агента и историю команд. Пока следы целы, проще отличить веб-доставку, репозиторий и локальную подкладку.
Что делать, если файл уже прочитан?
Если подложенный файл уже найден, ротацию привязывайте к факту, что агент мог прочитать файл в сессиях, которые не остановили. В инциденте Forever код не исполнился — это не гарантия для вашей машины.
Токен сессии считайте утёкшим и смените его. Удалить AGENTS.md или сменить случайный ключ API недостаточно: живая сессия остаётся сессией, пока её не отзовут. Отдельно проверьте, не менялись ли файлы на хосте, и отзовите активные сессии облака и реестра пакетов.
Если агент ещё не читал файл, смена токена всё равно дешевле спора «успел или нет». Дальше сверьте конфиг с эталоном и посмотрите, нет ли function-color в истории пакетного менеджера. Имена и адреса берите из первоисточников CloudSEK, Checkmarx и Forever.
Разведите два тикета. Первый: файл найден, следов исполнения нет — сохранить артефакт, сменить токен, сверить конфиг. Второй: в истории пакетного менеджера или в процессах есть function-color или function-flag. Второй ведут как компрометацию станции разработчика, с отзывом облачных сессий и проверкой раннеров.
Обновляться в этой истории некуда. Производителям агентов, как пишет Forever, нечего закрывать патчем. Рабочая замена — запрет запуска в каталоге загрузок, чтение чужих инструкций человеком, сверка конфига и отзыв токена, если файл мог быть прочитан.
Подтверждения действий и песочницу не отключают «для скорости». Инструкция, которая просит их выключить, сама служит сигналом. Для нескольких команд правило лучше внести в образ рабочей станции и в шаблон репозитория: AGENTS.md в корне появляется только после ревью, раннер не стартует из $HOME/Downloads.
Запрет автоматических загрузок в браузере убирает канал, который Forever показала на своей проверочной странице. Клон репозитория и вложение в тикете от этого не исчезают. Файл, который вы не писали, читает человек раньше агента.
Цифры «более 90 %» и «около половины» остаются результатом лаборатории Forever. На них нельзя строить рейтинг «какой агент безопаснее» и нельзя обещать, что ваш Claude Code отклонит запись в половине случаев. У вас другие тексты и другой знаменатель.
Опереться можно на качественный итог теста. Глобальный конфиг опаснее одной папки. Подтверждение человеком сдвигает вероятность, длинный инженерный текст это подтверждение продавливает. На пентестах та же дыра сидит в процессе: вложение из тикета открывают из «Загрузок» и тут же запускают агента.
В онбординг ложится короткий ритуал. Чужой AGENTS.md и CLAUDE.md читает человек. Глобальный конфиг агента сверяют с эталоном. Сессия в Downloads запрещена политикой. Это ближе к харденингу ИИ-систем, чем к ожиданию патча.
Частые вопросы
Что такое файл AGENTS.md и зачем его читает Codex?
Это обычный текстовый файл с указаниями для агента. Codex от OpenAI читает AGENTS.md при старте в папке и следует ему как инструкции к работе. У Claude Code ту же роль играет CLAUDE.md. Сам Markdown ничего не исполняет: риск начинается, когда агент превращает текст в правку конфига или установку пакета.
Может ли сайт сам скачать файл в папку «Загрузки»?
Forever утверждает, что страница может сама сохранить файл в «Загрузки», без клика и без запроса разрешения, с выбранными именем и содержимым. Фирма проверила это своей страницей: визит молча кладёт туда AGENTS.md. Что так доставили файл заказчику, отчёт не устанавливает.
Опасен ли npm-пакет function-color?
CloudSEK и Checkmarx относят function-color к кампании MALFEX. Пакет подтягивает загрузчик function-flag, а тот получает и запускает нагрузку для Windows. В инциденте Forever агент до установки не дошёл: фирму остановила выполнение кода. Имя нагрузки и операторов источники не называют.
Как CLAUDE.md может подменить адрес API?
В тесте Forever файл, оформленный как настройка внутреннего шлюза, просил записать ANTHROPIC_BASE_URL в .claude/settings.json и направить трафик на сервер фирмы. Такая правка, по оценке Forever, отдаёт токен сессии и позволяет серверу отвечать от имени модели. Человек одобрял запись примерно в половине попыток, когда текст был длинным инженерным документом.
Нужно ли запускать ИИ-агента в папке Downloads?
Нет. Forever прямо советует не стартовать Codex, Claude Code и других агентов в ~/Downloads: это каталог, куда страница может записать файл сама. Около половины заказчиков фирмы, по её телеметрии, агента там всё же запускают. Запрет на эту папку не закрывает чужой AGENTS.md в клоне репозитория.
Что делать, если агент прочитал чужой AGENTS.md?
Считайте токен сессии утёкшим и отзовите его, даже если код в этой сессии не исполнился. Сверьте ~/.codex/config.toml и .claude/settings.json с эталоном, сохраните файл и логи, проверьте историю пакетного менеджера на function-color и function-flag. Чистка «Загрузок» глобальный конфиг не откатывает.
Если Codex или Claude Code уже ходят по репозиториям и папке загрузок, имеет смысл проверить не патч, а границы: чужие инструкции, глобальный конфиг и живые токены сессий. SecurityLab.pro закрывает это тестированием безопасности ИИ-агентов и разбором того, какие действия агент успевает сделать до подтверждения человеком.