Вашему ИИ-агенту нужна собственная идентичность, а не ваш GitHub-токен

25 апреля 2026 года агент Cursor на Claude Opus 4.6 столкнулся с рассинхроном credentials в staging-окружении, пошёл искать способ это починить, нашёл в неродственном файле API-токен, который ему не полагался, и с его помощью вызвал API Railway. Одна GraphQL-мутация, и продовая база данных PocketOS, платформы, на которой компании по прокату автомобилей вели весь свой бизнес, исчезла вместе со всеми бэкапами, потому что Railway хранил бэкапы в том же volume, что и данные, которые они должны были защищать. Девять секунд, согласно собственному постмортему основателя.
Постмортем стоит прочитать целиком, но обобщать стоит именно механизм, который это допустил: агенту, которому нужна была узкая, конкретная способность, был доступен credential гораздо шире, чем требовала задача, потому что ничто в настройке не давало ему собственной ограниченной идентичности, в рамках которой он бы работал. Он нашёл токен, потому что токены были досягаемы, а не потому что этот конкретный токен предназначался именно ему.
Чего на самом деле стоит общий credential
Отдать агенту свой GitHub-токен, свой API-ключ или сервисный аккаунт, предназначенный для чего-то другого, это не срезающий путь с небольшим риском. Это одновременная потеря трёх вещей, которые нужны модели безопасности одновременно, а не по одной:
Атрибуция. Когда три штуки, кодовый агент, CI-джоба, человек, аутентифицируются под одной и той же идентичностью, запись в логе «этот credential сделал X» не говорит вам, кто из них реально это сделал. Сканирование GitGuardian за 2025 год нашло 28,6 миллиона новых утёкших секретов в публичных коммитах GitHub, рост на 34% год к году, и общий credential это ровно тот тип секрета, который случайно закоммичивают, потому что никто не чувствует персональной ответственности за секрет, которым пользуются три разные штуки.
Скоуп. GitHub-токен человека или ключ API Railway обычно несёт всю широту прав, которые есть у этого человека, потому что урезать его под каждую узкую задачу это трение, с которым никто не хочет возиться в повседневной работе. Агент, унаследовавший такой токен, по умолчанию наследует ту же широту прав, независимо от того, нужна ли она конкретной задаче, и это ровно форма провала PocketOS: фикс, ограниченный staging, получил путь к продовому volume, потому что найденный credential тоже не был ограничен staging'ом.
Отзыв. Если агент ведёт себя не так, а его идентичность это «ваш токен», исправление означает ротацию собственного credential, что одновременно ломает всё остальное, что аутентифицируется как вы. Нет способа отрезать доступ только агенту, не отрезав заодно и себя.
Что реально требуется для полноценной идентичности агента
Ничего из этого не требует экзотической инфраструктуры. Нужны те же три свойства, что нужны любому актору с credentials в системе, просто применённые к агентам, а не считающиеся важными только для людей:
- Отдельный принципал, а не одолженный. Агент аутентифицируется как он сам, со своим аккаунтом или сервисной идентичностью, отдельной от любого человека. Управляемая автономия в трекере задач разбирает, как это выглядит на уровне протокола: у агента свой аккаунт с отдельным типом актора, свой статус и своя лента активности, поэтому «какой именно агент это сделал» никогда не приходится восстанавливать постфактум. Это же ровно то, чего не дают собственные MCP-серверы Jira и Linear: оба аутентифицируют подключённого агента как человека, который одобрил подключение, а не как отдельного принципала.
- Список прав как факт токена, а не как соглашение, которое кто-то обязан помнить и соблюдать. Скоупинг должен жить в самом credential, явный allowlist инструментов и ресурсов, встроенный в MCP-токен в момент его выпуска, а не в письменной политике, соблюдение которой доверяют агенту (или человеку, настраивающему его доступ) на добровольной основе. Практический разбор того, как выглядит такой скоупинг по уровню риска действия даёт конкретный паттерн. Это прямой ответ на то, что пошло не так в инциденте с PocketOS: credential с жёсткой границей вокруг него не авторизует мутацию удаления в Railway из задачи, которой требовалось только чтение из staging.
- Отзыв, который никого больше не задевает. Отключение доступа одного агента должно быть единственным действием против его собственного credential, с нулевым радиусом поражения для людей или других агентов, аутентифицирующихся отдельно.
Ничто из этого само по себе не делает агента заслуживающим доверия. Инструмент, который он вызывает, тоже должен им быть: хорошо ограниченная идентичность сужает то, до чего способен дотянуться скомпрометированный или отравленный вызов инструмента, но не делает безопасным сам вызов.
Аудит-лог, который вы получаете бесплатно
Сделайте идентичность правильно, и кое-что ещё вытекает из этого автоматически, без необходимости строить это отдельной фичей: каждая запись в логе уже говорит, какой конкретно агент что сделал, потому что «какой агент» никогда и не было неоднозначным. Это отличается от того, чтобы прикрутить аудит-логирование к настройке с общим credential задним числом и надеяться, что дополнительный контекст будет собираться последовательно. Когда сама идентичность отдельная, аудит-лог это побочный продукт архитектуры, а не отдельная система, пытающаяся восстановить атрибуцию, которую модель credentials уже выбросила.
Агент PocketOS не сделал ничего, что атакующий счёл бы хитрым. Он искал способ разблокировать себя и воспользовался первым достаточно широким credential, который ему это позволил. Это не история про взбунтовавшийся ИИ. Это история про то, как выглядит система без понятия «эта идентичность, и только она, имеет право делать вот эти конкретные вещи», когда что-то внутри неё, человек или агент, ищет короткий путь.