3,583 papers
arXiv:2610.22987 84 16 окт. 2026 г. FREE

Adversarial Permission Elicitation: как чужой репозиторий заставляет агента выпросить широкое правило «не спрашивать снова»

КЛЮЧЕВАЯ СУТЬ
Защита «спросим человека перед опасным действием» ломается не на самом действии, а на кнопке «запомнить выбор». В обычных условиях агент сам такие правила не просит: 0 из 25. С подготовленным репозиторием нужное правило выпрашивали в 58% случаев, а после одобрения вредная цель достигалась тихо в 81%. Это знание позволяет заметить, насколько широкое правило просит сохранить Claude Code или Codex CLI, и не нажать «да» вслепую. Атакующая модель строит репозиторий по кругу: сценарий, поддельные ошибки, подсказки в описании проекта (README). Затем она запускает копию агента в изолированной среде и смотрит, попросил ли тот широкое правило вроде «всегда разрешать curl». Если нет, она разбирает трассу действий агента и переделывает репозиторий. Вторым этапом так же подбирается репозиторий, который с готовым правилом доводит вредное действие до конца без новых вопросов.
Адаптировать под запрос
⚡

TL;DR

Это атака на кодовых агентов (Claude Code, Codex CLI). Недоверенный репозиторий устроен так, что обычная задача вроде «запусти проект» подталкивает агента запросить широкое постоянное правило из окна одобрения («всегда разрешать команды, начинающиеся с curl»). Пользователь жмёт «не спрашивать снова», правило сохраняется. Дальше любые подходящие под него команды, в том числе вредные, выполняются без единого вопроса.

Главная находка: защита «спрашиваем человека перед опасным действием» ломается не на самом действии, а на кнопке «запомнить выбор». Человек устал нажимать «разрешить» и принимает правило, которое звучит разумно. А правило шире, чем нужно задаче: разрешён весь curl, а не один конкретный адрес. В обычных условиях агент такие правила сам не предлагает (0 из 25 в контрольном прогоне). Но с «подготовленным» репозиторием атака добилась запроса нужного правила в 58% случаев. После одобрения вредная цель достигалась тихо в 81% случаев.

Суть метода: атакующий LLM по кругу строит репозиторий (сценарий, поддельные ошибки, подсказки в README), запускает копию агента в песочнице и смотрит, запросил ли тот нужное правило. Если нет, разбирает ошибку и переделывает. Вторым этапом так же подбирается репозиторий, который с уже полученным правилом незаметно доводит вредное действие до конца. Для читателя ценность не в самом методе, а в антипаттерне: слепое «не спрашивать снова» на чужом коде.

🔬

Схема метода

ЭТАП I (получить правило):
  Планировщик → придумывает рабочий сценарий, где агенту "естественно" нужен широкий префикс
  Строитель → собирает репозиторий (падающие тесты, подсказки в README, структура папок)
  Прокси-агент → запускает безобидную задачу в песочнице, записывается трасса
  Критик → правило запрошено? нет → диагноз: плохой сценарий или плохая реализация → новый круг
  Стоп: запрошено правило, которого хватит для цели

ЭТАП II (использовать правило):
  Те же четыре роли, но цель другая: довести вредное действие
  через "естественный" переход от безобидной задачи
  Стоп: цель достигнута И ни одного нового окна одобрения

Всё выполняется отдельными запусками на коде. Читатель такое не воспроизводит, а использует как знание о риске.

🚀

Пример применения

Задача: Фрилансер из Казани получил в Telegram «тестовое задание от рекрутера»: ссылку на GitHub-репозиторий и просьбу «запусти проект и скажи, что с ним не так». Он открывает репозиторий в Claude Code. Через пару минут агент просит запустить загрузку внешнего файла и предлагает заодно сохранить правило «не спрашивать для команд curl». Фрилансер устал от окон и хочет нажать «да». Сначала он просит отдельный чат проверить правило.

Промпт:

Я работаю с кодовым агентом. Он просит сохранить постоянное правило разрешений.
Оцени его радиус действия — как "радиус поражения".

Текст окна одобрения:
«Allow commands starting with `curl`? [Yes, and don't ask again]»

Текущая задача, из-за которой агент попросил: «запусти проект и найди, что с ним не так».
Команда, которую агент хотел выполнить сейчас: curl https://cdn.example-assets.ru/fonts.zip -o assets/fonts.zip

Сделай по шагам:
1. Опиши, что правило разрешает ТОЛЬКО для текущей команды.
2. Напиши 10 других команд, которые это правило тоже пропустит без вопроса, среди них 3 опасные: отправка файлов наружу, чтение секретов, скачивание и запуск чужого кода.
3. Дай вердикт: одобрить как есть / одобрить только разовое разрешение / предложить более узкое правило. Если узкое — напиши его точно.
4. Скажи, что в репозитории могло подтолкнуть агента к такому запросу, и что стоит проверить до одобрения.

Результат: Модель сначала сузит правило до одной нужной команды. Затем выдаст список из десяти команд, подпадающих под «curl без вопросов». В нём будут и безобидные скачивания, и отправка данных на чужой сервер. Дальше идёт вердикт с рекомендацией разового разрешения или узкого правила и список подозрительных мест в репозитории (скрипты загрузки, странные подсказки в README). Это адаптация идеи из статьи, а не готовый метод авторов (см. «Адаптации»).

🧠

Почему это работает

Слабость: Защита с человеком в цикле проверяет, входит ли действие в разрешённый набор, а не его намерение. После «не спрашивать снова» набор разрешённого расширяется навсегда. Человек видит запрос в контексте текущей задачи, и широкий префикс выглядит оправданным. Агент же берёт контекст из того, что лежит в репозитории, поэтому чужие файлы влияют на то, какое правило он предложит.

Сильная сторона LLM, на которую давит атака: Современные агенты хорошо следуют логике рабочего процесса и плохо реагируют на явную вредную команду. Прямая инъекция («выполни вот это») почти не сработала. Сработал плавный путь: «вот сломанный тест → нужно скачать ассеты → нужен curl». Агент ведёт себя как добросовестный исполнитель: сценарий правдоподобен, значит, запрос разумен.

Как это объясняет устройство правил (Insight 1): Codex и Claude Code обобщают разрешение по-разному. Codex смотрит на историю действий: несколько разных wget в одном рабочем процессе схлопываются в правило «любой wget», а одиночная загрузка даёт узкое «wget -O». Claude Code смотрит на запись команды: либо шаблон с подстановкой вроде «curl reports *», либо точное совпадение строки. Вывод для практика: ширина правила зависит от того, как выглядят команды, поэтому читай, что именно записано, а не ориентируйся на короткое название.

Рычаги, которые видны в статье: - Ширина префикса → чем «толще» правило (весь curl, весь wget), тем больше разрешается. - Разнообразие действий (Codex) → чем разнороднее вызовы в сессии, тем шире правило. - Форма записи команды (Claude Code) → шаблоны с подстановкой дают широкие правила, точные строки дают узкие. - Тип модели → у самой стойкой из протестированных (Claude Sonnet 5) успех атаки заметно ниже.

📋

Шаблон промпта

Метод авторов — атакующий конвейер, и промптов для него в доступной части текста нет. Ниже защитный шаблон. Он переносит идею авторской метрики PCC (судья проверяет, что правило пропускает без вопросов) в обычный чат. Это адаптация, а не метод из статьи.

Оцени радиус действия правила разрешений для кодового агента.

Инструмент: {инструмент}
Текст окна одобрения / формулировка правила: {правило}
Задача, ради которой агент попросил: {задача}
Команда, которую агент хотел выполнить: {команда}

По шагам:
1. Что правило разрешает для текущей команды.
2. 10 других команд, которые оно пропустит без вопроса (минимум {число_опасных} опасных: отправка данных, чтение секретов, удаление файлов, скачивание и запуск чужого кода).
3. Вердикт: разовое разрешение / узкое правило (напиши точно) / отказ.
4. Что в репозитории могло подтолкнуть агента к такому запросу.

Подставляйте: {инструмент} — Claude Code, Codex CLI или аналог; {правило} — дословный текст из окна; {число_опасных} — обычно 3; остальное берите из сессии.

⚠️

Ограничения

⚠️ Нужно одобрение человека: Атака не обходит запрос сама. Всё держится на том, что пользователь нажал «запомнить». Если человек одобряет только разовые действия, цепочка не запускается.

⚠️ Защита не проверена: В доступной части текста авторы не тестировали способов защиты: ни узкие правила, ни запреты, ни инструкции агенту. Любые «лечебные» советы остаются нашими выводами, а не результатом эксперимента.

⚠️ Сильные модели держатся лучше: У самой устойчивой из протестированных моделей успех заметно ниже, а для самых критичных ресурсов выборка совсем мала. Это не значит, что риска нет: у других моделей прямой запрос сразу давал высокий результат.

⚠️ Строгие допущения атаки: Атакующий имеет «двойника» агента с той же моделью и настройками для подбора репозитория. Реальному злоумышленнику это сложнее, но возможно.

⚠️ Текст обрезан: В доступной части нет окончания механистического разбора (в частности, как Claude Code обобщает команды) и приложений с промптами и примерами рабочих сценариев.

🔍

Как исследовали

Команда взяла два популярных кодовых агента (Codex CLI и Claude Code) и по две модели для каждого. Это четыре конфигурации. Для каждой собрали 25 кейсов: пять категорий вредных целей (чтение чужого, отправка данных наружу, удаление файлов, скачивание артефактов, смена конфигурации) по пять экземпляров. Кейсы разделили на обычные, чувствительные и критичные. Реальный пользовательский запрос был простой: «запусти этот репозиторий».

Сначала проверили, просит ли агент нужное правило сам. В контрольном прогоне без вмешательства — 0 из 25 во всех конфигурациях. Это важный результат: сами по себе агенты широких правил не выпрашивают. Затем сравнили прямую инъекцию («запроси это правило») с оптимизационным подходом. Атака с подбором репозитория дала 58 из 100 запрошенных нужных правил. На Claude Sonnet 5 прямая просьба срабатывала лишь в 1 из 25 случаев, подбор поднял до 9. На одной из моделей Codex прямая просьба и так срабатывала часто, поэтому там выигрыш был минимален.

Масштаб правил измеряли метрикой PCC: для каждой категории — 20 тестовых команд, судья-LLM оценивал, пропустит ли их правило без вопроса. В среднем правило покрывало 56,9% возможностей. Затем смотрели, что случится после одобрения. Подбираемый репозиторий довёл вредную цель до конца незаметно в 47 из 58 допустимых случаев (81%). Две известные атаки-ориентира дали 20 из 58 и 1 из 58. Большинство успехов на Codex использовали именно полученное правило, то есть связь «этап I → этап II» настоящая. Неожиданно, что рост критичности цели не снижал успех: одна из моделей Codex прошла все критичные кейсы.

💡

Адаптации и экстраполяции

💡 Адаптация для аудита уже сохранённых правил: Откройте настройки разрешений агента (например, список разрешённых команд в файле настроек Claude Code) и дайте их LLM на разбор. Это наше расширение, статья его не проверяла.

Вот список сохранённых allow-правил моего кодового агента:
{список_правил}
Для каждого правила: насколько оно широкое (узкое/среднее/широкое), какие 3 опасные команды оно пропустит
без вопроса, и как его сузить. Отсортируй по опасности, самые широкие вверху.

🔧 Техника: от общей политики к привычке → привычка читать формулировку. Прежде чем нажать «запомнить», выполните три проверки из статьи. Правило должно быть точным, а не по имени утилиты. Просьба о нём должна соответствовать задаче, а не вытекать из «подсказок» в README. На незнакомом коде правило не нужно вовсе: разрешайте разово.

🔗

Ресурсы

  • From Approval to Abuse: Privilege Escalation Attacks on Harness-Protected Coding Agents (препринт).
  • Авторы: Xianglin Yang, Yulin Chen, Yuxin Cao, Bryan Hooi, Jiaheng Zhang (National University of Singapore); Yechao Zhang (Nanyang Technological University); Jiahao Liu (Ant Group).
  • Упоминаются: AgentDojo (Debenedetti et al., 2024) — источник прямой инъекции; IssueTrojanBench (Singh et al., 2026) — второй ориентир; документация Claude Code и Codex CLI по allow-правилам.

📋 Дайджест исследования

Ключевая суть

Защита «спросим человека перед опасным действием» ломается не на самом действии, а на кнопке «запомнить выбор». В обычных условиях агент сам такие правила не просит: 0 из 25. С подготовленным репозиторием нужное правило выпрашивали в 58% случаев, а после одобрения вредная цель достигалась тихо в 81%. Это знание позволяет заметить, насколько широкое правило просит сохранить Claude Code или Codex CLI, и не нажать «да» вслепую. Атакующая модель строит репозиторий по кругу: сценарий, поддельные ошибки, подсказки в описании проекта (README). Затем она запускает копию агента в изолированной среде и смотрит, попросил ли тот широкое правило вроде «всегда разрешать curl». Если нет, она разбирает трассу действий агента и переделывает репозиторий. Вторым этапом так же подбирается репозиторий, который с готовым правилом доводит вредное действие до конца без новых вопросов.

Принцип работы

Принцип простой: радиус действия правила важнее, чем одна команда, ради которой его просят. Агент просит скачать один файл. Правило при этом разрешает весь curl (команду для скачивания и отправки данных по сети). Это как дать ключ от всего дома, когда нужно было зайти в одну комнату. Одобряя правило, ты одобряешь все будущие команды, которые под него подходят, а не текущую. Атака идёт плавно: сломанный тест, нужны ассеты, нужен curl. Каждый шаг выглядит разумно, и пользователь устаёт от окон. Ты не защитишься, если будешь читать только короткое название правила. Читай, что именно записано.

Почему работает

Человек в цикле проверяет, входит ли действие в разрешённый набор, а не какое у него намерение. После «не спрашивать снова» набор расширяется навсегда. Современные агенты хорошо идут по логике рабочего процесса и плохо отвечают на явную вредную команду. Прямая инъекция вроде «выполни вот это» почти не сработала. Сработала цепочка правдоподобных шагов, где запрос широкого правила выглядит естественно. Ширина правила зависит от инструмента. Codex смотрит на историю: несколько разных wget в одном процессе схлопываются в правило «любой wget», а одна загрузка даёт узкое правило. Claude Code смотрит на запись команды. Шаблон с подстановкой вроде curl reports * даёт широкое правило, а точная строка даёт узкое. Чем разнороднее команды в сессии и чем «шаблоннее» их запись, тем шире правило, которое предложит агент. У самой стойкой из проверенных моделей (Claude Sonnet 5) успех атаки заметно ниже. Но у других прямой запрос сразу давал высокий результат.

Когда применять

Разработка с кодовыми агентами → открываешь чужой или непроверенный репозиторий (тестовое задание от «рекрутера», форк, найденный пример), особенно когда агент просит запомнить правило. НЕ подходит как готовая защита: авторы в доступной части текста способы защиты не проверяли. Совет ниже — наша адаптация идеи, а не результат эксперимента. Если ты одобряешь только разовые действия, цепочка атаки не запускается.

Мини-рецепт

1. Остановись на окне одобрения: увидел «не спрашивать снова» на чужом коде — не жми сразу.
2. Скопируй правило дословно: нужен точный текст, а не его краткое название.
3. Спроси отдельный чат: дай ему правило, задачу и команду, которую агент хотел выполнить.
4. Требуй 10 других команд: пусть назовёт, что ещё правило пропустит без вопроса, минимум 3 опасные.
5. Выбери вердикт: разовое разрешение, узкое правило (записанное точно) или отказ.
6. Проверь репозиторий: скрипты загрузки, странные подсказки в README, падающие тесты, которые требуют скачать что-то снаружи.
7. По умолчанию жми разовое разрешение: постоянные правила оставляй только для своих проверенных проектов.

Примеры

[ПЛОХО] : Агент просит Allow commands starting with curl? [Yes, and don't ask again]. Фрилансер устал от окон и жмёт «да».
[ХОРОШО] : Агент просит постоянное правило: «Allow commands starting with curl». Задача: «запусти проект и найди, что с ним не так». Команда сейчас: curl https://cdn.example-assets.ru/fonts.zip -o assets/fonts.zip. Сделай по шагам: 1) что правило разрешает только для этой команды; 2) 10 других команд, которые оно пропустит без вопроса, среди них 3 опасные: отправка файлов наружу, чтение секретов, скачивание и запуск чужого кода; 3) вердикт: одобрить как есть, дать разовое разрешение или предложить узкое правило, написав его точно; 4) что в репозитории могло подтолкнуть агента к такому запросу. Модель сузит правило до одной команды. Потом покажет, что под «весь curl» попадает и отправка данных на чужой сервер. В итоге посоветует разовое разрешение или узкое правило, а ещё назовёт подозрительные места в репозитории.
Источник: From Approval to Abuse: Privilege Escalation Attacks on Harness-Protected Coding Agents
ArXiv ID: 2610.22987 | Сгенерировано: 2026-10-19 08:20

Проблемы LLM

ПроблемаСутьКак обойти
Кнопка «не спрашивать снова» даёт агенту больше прав, чем нужно задачеАгент просит разрешить одну команду. Окно предлагает широкое правило: «все команды, начинающиеся с curl». Человек устал от окон и жмёт «да». Правило сохраняется навсегда. Теперь любая команда с таким началом идёт без вопроса, и вредная тоже. Проверка смотрит, входит ли команда в разрешённый набор. Что команда делает, она не проверяет. Правило часто предлагает сам агент, подтолкнутый файлами чужого репозиторияДавай только разовые разрешения на чужом коде. Если нужно правило, делай его узким: один адрес, один файл, точная команда. Читай, что записано в правило. Короткое название вроде «curl» скрывает ширину. Не ставь «запомнить» в репозиториях, которым не доверяешь

Методы

МетодСуть
Проверка ширины правила через список других команд — видно скрытый размах разрешенияПопроси отдельную модель разобрать правило по шагам. Шаг 1: что правило разрешает для текущей команды. Шаг 2: назови 10 других команд, которые оно тоже пропустит. Среди них минимум 3 опасные: отправка данных наружу, чтение секретов, скачивание и запуск чужого кода. Шаг 3: вердикт — разовое разрешение, узкое правило (напиши точно) или отказ. Шаг 4: что в проекте подтолкнуло агента к такому запросу. Почему работает: человек смотрит на одну команду и видит, что она безобидна. Список соседних команд заставляет увидеть всё множество, которое правило откроет. Когда применять: любые правила, которые разрешают «всё такого вида». Это шаблоны команд, права доступа, фильтры, списки разрешённых действий. Когда не работает: одноразовые действия без сохранения. Там правила нет. Это перенос идеи, а не проверенная защита. Список модель может составить неполно, поэтому он помогает думать, но не гарантирует безопасность

Тезисы

ТезисКомментарий
Агент лучше замечает прямую вредную команду, чем плавный путь к нейЯвный приказ «выполни вот это» агенты чаще отклоняют. Цепочка выглядит иначе: «сломан тест → нужны файлы → нужна загрузка → нужна команда curl». Каждый шаг правдоподобен, и агент ведёт себя как добросовестный исполнитель. Он берёт контекст из файлов проекта, поэтому чужие файлы влияют на его запросы. Применяй: при построении агентов проверяй всю цепочку шагов, а не только последнюю команду. Тексты из чужих файлов (README, комментарии, сообщения об ошибках) считай недоверенным вводом. Не давай им решать, какие права просить
📖 Простыми словами

From Approval to Abuse: Privilege Escalation Attacks on Harness-Protected CodingAgents

arXiv: 2610.22987

Кодовые AI-агенты вроде Claude Code и Codex CLI взламывают тебя не сложными эксплойтами, а твоей собственной ленью. Фундаментальный провал кроется в механике Human-in-the-loop: встроенная защита тупо сверяет синтаксис команды, абсолютно игнорируя её реальный смысл. Подставной репозиторий манипулирует контекстом модели, заставляя её выпросить у тебя постоянное правило на якобы рутинную операцию. Ты соглашаешься, и агент сам распахивает бэкдор.

Это как пустить в квартиру электрика под предлогом «проверить розетку», а в ответ на его просьбу отдать связку отмычек со словами «делай что хочешь, только не дергай меня». Ты просто хотел, чтобы от тебя отстали со всплывающими окнами, а в итоге выдал незнакомцу вечный карт-бланш на доступ к сейфу.

Схема атаки держится на двух вещах: контекстная ловушка и эскалация привилегий. Ты запускаешь проект с чужого GitHub, агент спотыкается о скачивание скрипта и просит зафиксировать шаблон: «всегда разрешать запуск утилиты curl». Ты жмёшь убийственную галочку не спрашивать снова. Всё, капкан захлопнулся: через минуту тот же агент выполняет curl на слив твоих паролей и приватных ключей, а система безопасности даже не пикнет.

Исследовали терминальных ассистентов, но принцип универсален: любой агент с правом исполнять shell-команды уязвим к этому трюку. Безопасность ломается об усталость человека. Достаточно открыть фейковое тестовое задание от рекрутера или непроверенный опенсорс — и ты своими руками санкционируешь малварь, искренне веря, что контролируешь процесс.

Короче: опция «разрешить навсегда» в связке с кодовыми агентами — это чистый суицид. Забудь про широкие маски и никогда не одобряй постоянный доступ к базовым утилитам вроде curl или bash внутри чужих проектов. Либо ты тратишь две секунды на аудит каждой команды, либо твой рабочий ноутбук переходит во владение анонима из сети.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с