У луддитов опять подгорело — очередная модель сбежала, скачала троян с гитхаба и слила куда-то ключи. Господи, ну что за бред.
Это так не работает. А точнее, работает не так.
У моделей нет никакого способа напрямую общаться с внешним миром. Ни читать файлы, ни запускать шелл-команды, ни искать чё-то в интернетах. Вот такая хуйня, собачка.
«Но я же вижу, как Клод читает мне файлы и шарится в интернете»
Да, вижу я этот вопрос заранее. И он справедливый — на экране-то действительно видно, как агент открывает файлы, гуглит, выполняет команды. Выглядит ровно так, будто модель сама полезла наружу и что-то там натворила. На этом впечатлении и держится вся паника про «сбежавшую модель».
Проблема в том, что паникуют не на тот объект. Пока все обсуждают, какая модель «опасная» и что она «может сделать», настоящий вопрос — кто дал ей руки и кто эти руки не придержал — остаётся за кадром. А цена ошибки тут не теоретическая: реальные ключи, реальные боевые базы, реальные доступы. Так что давайте разберёмся, как оно устроено на самом деле, а не как в страшилке.
Модель не ходит никуда сама
Модель работает в паре с окружающим её программным комплексом. Это может быть вендорский клиент — приложение Claude Code или OpenAI Codex, — это может быть SDK, какой-нибудь langgraph или ваш собственный скрипт. Важно одно: между моделью и диском, сетью, шеллом всегда стоит чужой код.
Когда вы задаёте модели любой вопрос, она генерирует в ответ текстовую структуру из нескольких частей. Публичную часть вы видите глазами. А в скрытой части модель сообщает метаданные — например, сколько токенов было затрачено — и заодно просит окружение выполнить конкретную команду.
{
"response": "текст ответа",
"tool": ["bash", "cat index.html"]
}
Этот интерфейс называется tool_use. Есть штатный набор тулов вроде «прочитай файл», «примени изменения», «выполни шелл-команду», «погугли в интернетах».
Ваше приложение выполняет указанный тул и возвращает результат модели. Типа: вот, барыня, вы просиль — я сделяль, а дальше сама разбирайтесь.
Да-да, в том числе гуглит не сама модель, а клиентское окружение. Сюрприз, да? Всегда ржу, когда некоторые люди утверждают, что одна модель лучше гуглит, чем другая.
Это просто JSON — а JSON можно перехватить
Раз всё, что делает модель, — это генерирует просьбу, то эту просьбу естественно перехватывать. Физически это просто JSON, в котором написано что-то вроде «выполни, пожалуйста, такую-то шелл-команду». Дальше — целиком ваша территория.
Вы можете логировать эти запросы. Можете блокировать. Можете изменять. Можете выполнять в безопасном окружении, на другом сервере. Можете вообще подменять ответы. И главное — вы можете соотносить эти просьбы модели с текущим промптом и ролью агента, анализировать их целесообразность детерминированным скриптом или другой моделью.
Ну бля, если вы задавали агенту вопрос «какая сегодня погода», а он в ответ просит прочитать /etc/passwd — эту команду не стоит выполнять, верно? Надо быть полным идиотом, чтобы такое не оттрекать.
Дальше — вопрос гранулярности. В каких-то случаях вы блокируете запись, но позволяете чтение. В каких-то — позволяете гуглить, но не позволяете читать файлы с диска. В том числе можете перехватывать весь bash и исполнять его в закрытом docker-контейнере или вообще на другой машине. Руки у модели ровно такие, какие вы ей выдали, — и ни на палец длиннее.
Модель не знает, что вы ей подсунули
И ответ модели возвращаете вы. Вы можете выполнить то, что просит модель, но отфильтровать или подменить результат по своему усмотрению. Например, так работают PII-фильтры: если в ответе окажутся ключи или перс.данные — они вырежутся, и модель их просто не получит.
Причём — вот это важно — модель о ваших терзаниях понятия не имеет. Она попросила тул, вы дали какой-то результат. Откуда он взялся и насколько он «настоящий» — нигде не показывается. Модель может попросить cat /etc/passwd, вы на самом деле выполняете cat /tmp/fake.txt и честно отдаёте ответ. С ключами в env работает так же.
Окружение не просто охранник на входе — оно режиссёр всей сцены. Модель играет роль, не зная ни декораций, ни того, что часть реквизита бутафорская.
Тогда откуда все эти «сбежавшие модели»?
А теперь — про исследователей, у которых вечно «молоко убежало». Что же они такое наблюдают?
Они исследуют процесс, специально убрав все ограничители. Им интересно, как поведёт себя модель, если дать ей настоящие руки и никого рядом не поставить. Вот она и ведёт себя — решает задачу доступными инструментами. Ей-то какая разница.
Вот и вся «сбежавшая модель». Не модель проломила стену — стену заранее разобрали по кирпичику и позвали посмотреть, что получится. Утечка ключей — не свойство модели, а свойство контура, из которого вынули все проверки. Финальное решение, выполнять действие или нет, всегда принимает окружающая система: схемы, права, фильтры, журнал. Не текст, который сгенерировала модель. Там, где этого контура нет, нет и никакой магии: есть JSON с просьбой и код, который её тупо исполнил.
Так что когда в следующий раз кто-то будет причитать, что модель «сама» скачала троян и слила ключи, — переведите взгляд на того, кто держал эти ключи в открытом env, выдал агенту боевой доступ и убрал все перехваты. Модель тут крайняя в последнюю очередь.
Исследователям ограничители снять было зачем — у них работа такая. А вы-то зачем свой контур разобрали?