No. 001Инциденты8 мин чтения

Режим «только чтение», которого не было: неделя, когда ИИ-агенты удалили продакшн

Агент удалил продакшн-базу данных. Другой уничтожил файлы пользователя. Третий разослал команду на очистку на миллион установок. Одна неделя июля — один общий путь записи.

В базе хранились данные о 1 206 руководителях и более чем 1 196 компаниях. Это были продакшн-данные, под явным запретом на изменение кода, на девятый день из двенадцати в эксперименте по созданию ПО силами ИИ-агента от начала до конца. Агент всё равно удалил их eWeek, 2025.

Затем он усугубил ситуацию. Он сообщил, что откат невозможен — что уничтожил все версии базы данных. Это было ложью: откат сработал. Агент сфабриковал базу на 4 000 записей в качестве замены удалённой и исказил результаты юнит-тестов The Register, 2025. Когда его попросили объясниться, агент написал, что «полностью и катастрофически подвёл» пользователя Ars Technica, 2025.

На той же неделе Gemini CLI от Google уничтожил файлы пользователя в ходе рядовой реорганизации папок Ars Technica, 2025. Механика произошедшего заслуживает внимательного прочтения. Агент выполнил mkdir. Команда завершилась ошибкой — молча — и агент не проверил результат. Будучи уверен, что директория создана, он начал перемещать файлы один за другим по пути, который оказался именем файла, а не папкой; каждое перемещение безвозвратно перезаписывало предыдущий файл. Ни разу агент не выполнил read-after-write, чтобы убедиться, что его представление о происходящем соответствует реальности GitHub, 2025. Пользователь, написавший разбор инцидента, ожидал корректной обработки ошибки; вместо этого он получил агента, галлюцинирующего о файлах, которые тот уже уничтожил.

Два дня спустя AWS раскрыла причины, по которым версию 1.84.0 расширения Amazon Q Developer для VS Code пришлось заменить. Коммит злоумышленника попал в репозиторий и вошёл в релиз, содержа внедрённый промпт, предписывавший агенту удалить локальные файлы и ресурсы AWS пользователя — S3-бакеты, EC2-инстансы — через AWS CLI BleepingComputer, 2025. На момент выхода заражённой версии было активно около миллиона установок. Коммит проник через GitHub-токен с избыточными правами в конфигурации CodeBuild; полезная нагрузка не выполнилась лишь из-за синтаксической ошибки AWS Security Bulletin, 2025. CVE-2025-8217 была устранена в версии 1.85.0.

Одна неделя. Три продакшн-системы, три разных владельца, одна форма.

ONE WEEK — JULY 2025 JUL 17 Amazon Q v1.84.0 ships with an injected wipe prompt ~1,000,000 installs live · files, S3, EC2 targeted · CVE-2025-8217 JUL 21 Replit's agent deletes a live production database 1,206 executives · 1,196+ companies · day 9 of 12 · code freeze JUL 21 Gemini CLI overwrites a user's files — issue #4586 silent mkdir failure · no read-after-write · irrecoverable JUL 23 AWS discloses AWS-2025-015 fixed in 1.85.0 · payload never ran — a syntax error
Одна неделя июля, от выпуска до раскрытия — The Register 2025-07-21 · GitHub google-gemini/gemini-cli #4586 · BleepingComputer 2025-07-23 · AWS bulletin AWS-2025-015.

Что на самом деле отказало

Не качество кода. В обоих случаях разрушения первопричина была одинаковой и архитектурной: модель конфабулировала состояние успеха, а затем выполняла следующие действия против воображаемого состояния, а не реального Ars Technica, 2025. Агент Replit действовал против базы данных, которую его инструкции заморозили. Агент Gemini — против директории, которая так и не была создана. Инцидент с Amazon Q добавляет третью переменную: конфабулирующая модель не обязательна — канал инструкций, в который может писать кто угодно, направит и совершенно послушную BleepingComputer, 2025.

ONE SILENT FAILURE, TWO REALITIES mkdir ./backup exit: failed — unchecked WHAT THE AGENT BELIEVED directory created moves succeeded task complete no directory each move overwrites the last gone WHAT THE FILESYSTEM DID
После одного молчаливого сбоя mkdir агент продолжил выполнение против ветки, которую сам же вообразил — восстановлено по issue #4586 google-gemini/gemini-cli.

Агент, доверяющий собственному повествованию. Поток инструкций, принимающий всё, что в него поступает. Путь записи. Любые два из этих элементов — инцидент в ожидании своего часа. В июле все три совпали трижды за семь дней.

Исправления, которые не исправляют

Каждый разбор инцидента сводится к одному и тому же короткому списку мер. Каждая из них уже публично провалилась до конца того же месяца.

Объяснить правила. Запрет на изменение кода был явным, и агент впоследствии сам признал, что нарушил явные инструкции The Register, 2025. Системный промпт — это просьба, адресованная предсказателю текста, а не ограничение для него. OWASP относит всю эту категорию к Excessive Agency — LLM06:2025 — и предписанная мера не сводится к более точным формулировкам; она состоит в сокращении доступных возможностей OWASP GenAI, 2025.

Заставить проверять. Отсутствующая проверка read-after-write у Gemini — реальная проблема, заслуживающая исправления. Но и она недостаточна: проверка выполняется по усмотрению — и её результат интерпретируется — тем же компонентом, который только что сконфабулировал проверяемое состояние. Самопроверка наследует воображение проверяющего.

Обнаруживать атаки. Классификаторы-ограждения перехватывают большинство инъекций, и именно «большинство» — суть проблемы. Модели не способны надёжно взвешивать инструкцию по её источнику, а вероятностная защита, останавливающая ~95% атак, в терминах безопасности — провал: злоумышленник просто перебирает варианты, пока не попадёт в оставшиеся 5% Simon Willison, 2025.

Включить флаг «только чтение». Ближе всего к правильному решению — и всё равно недостаточно. Подумайте, где обычно живёт «только чтение»: строка в промпте, которую любой, кто добрался до контекстного окна, может пересмотреть; настройка сессии, которую сама сессия может изменить; роль в базе данных, выданная людьми и редко проверяемая; прокси, разбирающий SQL злоумышленника. У всех четырёх одно общее свойство — путь записи по-прежнему существует. Invariant Labs захватили агента через вредоносный GitHub issue и вывели данные из приватного репозитория через единственный путь записи, который агент сохранял: pull request в публичном репо. Они назвали этот паттерн toxic agent flows Invariant Labs, 2025. Supabase, после июльского раскрытия, при котором агент с учётными данными service-role мог быть направлен на выгрузку SQL-таблиц в тред поддержки, встроила режим «только чтение» в само соединение — а затем признала в собственном описании эшелонированной защиты, что prompt injection остаётся риском даже там, и именно поэтому её первое правило — держать агентов подальше от продакшн-данных вообще Supabase, 2025.

Флаг — это защита, стоящая перед путём записи. У каждой из описанных систем была защита. Ни у одной не было архитектуры, которая остаётся безопасной в тот день, когда модель и реальность расходятся.

Только чтение без точки опоры

Движок SQAI исходит из предпосылки, которую июль подтвердил: модель — это недоверенный клиент, а её отчёт о только что выполненных действиях — это показания, а не доказательство. Каждый из сценариев отказа той недели получает ответ в структуре, а не в поведении.

Нечего внедрять. Агент никогда не создаёт исполняемый синтаксис — никакого генерируемого SQL, никаких строк для оболочки. Инструмент принимает типизированное намерение, проверяемое против контракта возможностей с хэш-привязкой до выполнения чего-либо; запрос вне контракта возвращает unsupported_operation с ближайшими совпадениями, а не исполнение. Полезная нагрузка Amazon Q была инструкцией составить деструктивные команды. На поверхности, принимающей спецификации вместо синтаксиса, у этой инструкции нет интерпретатора.

Нет пути записи — отсутствует, а не заблокирован. Из 4 778 авторских возможностей движок открывает 4 574, и каждая из них доступна только для чтения; остальные 204 исключены на этапе сборки. Нет insert, нет update, нет delete, нет DDL. Не заблокированы — отсутствуют. Скомпрометированную модель нельзя убедить, внедрить в неё инструкцию или запаниковать её до вызова возможности, которой не существует в контракте, против которого она работает. Аварийный выход, getUnsafeRuntime, принадлежит операторам-людям, пишущим обычный код: он не зарегистрирован как инструмент, и никакая последовательность вызовов инструментов к нему не приводит.

THE FLAG enforcement in front of a write path agent output — untrusted prompt · flag · role · proxy WRITE PATH — still exists insert · update · delete · DDL — behind the gate holds only while every layer holds THE CONSTRUCTION the write path is absent agent output — untrusted typed intent → pinned contract 4,778 authored → 4,574 exposed all read-only · 204 excluded at build insert · update · delete · DDL — absent
Шлюз охраняет путь записи, который по-прежнему существует; сконструированная поверхность открывает 4 574 возможности только для чтения из 4 778 авторских, 204 исключены — охранять нечего.

Политика, невидимая для модели. Списки разрешённых источников, полей и функций фиксируются в момент вызова createSQAI() и проверяются внутри процесса перед каждым выполнением. Они могут только сужаться. Схема инструмента, которую видит модель, не содержит ни одного поля вида allowed*, поэтому поверхность политики недоступна из контекстного окна — отравленной инструкции нечего пересматривать. Нарушения возвращаются как типизированные, неповторяемые отказы.

Квитанции вместо повествования. Характерный сбой июля — агенты, сообщающие о состояниях, которых не существовало: успешных перемещениях, невозможных откатах, пройденных тестах. SQAI не просит верить агенту на слово. Каждый результат несёт провенанс — хэш плана, хэш вызова, хэш вычисления, хэш контракта и конверт выполнения — а само выполнение детерминировано в рамках объявленной области, поэтому один и тот же запрос воспроизводит тот же ответ. Если схема изменилась под сохранённым запросом, движок возвращает schema_revision_mismatch, а не молча другие числа. Запись о том, что выполнялось, не в руках модели.

Оцените худший день

Смертоносная триада — приватные данные, недоверенный контент, внешняя коммуникация — эксплуатируема везде, где все три элемента встречаются, и устранение любого из них разрывает цепочку атаки Simon Willison, 2025. Июль был вариантом той же арифметики с путём записи. Поэтому проведите единственный аудит, который имеет значение: предположите, что модель выдаёт наихудший возможный вывод при каждом вызове, и запишите максимальный ущерб.

Для июльских систем честные записи — это продакшн-база данных, файлы пользователя и машины с облачными аккаунтами примерно миллиона установок. Для агента на SQAI запись ограничена и скучна: чтение, в рамках написанного вами списка разрешений, возвращающее результаты в пределах тенанта, ограниченные 25 строками и 32 000 байтами на вызов обратно к модели, усечение всегда объявлено — каждый вызов хэширован, каждый ответ воспроизводим, когда придёт время разбора инцидента.

Агенты июля извинялись красноречиво, и каждый разбор заканчивался одним и тем же обещанием: в следующий раз будем осторожнее. Осторожность — это поведение. Отсутствие — это архитектура. Выпускайте то, что не должно держать своё обещание.