Каждый чинит одну и ту же дыру, только с разной стороны:
— команду можно было спрятать внутри условия в zsh, и в диалоге подтверждения она не показывалась;
— агент из «изолированного» worktree мог выполнять разрушительные git-команды в основном репозитории;
— команду можно было набить табами и невидимыми символами, и часть её в диалог не попадала;
— запрет читать папку не срабатывал, если в пути стоял слэш на конце.
Четыре разных механизма, один дефект: вам показывают не то, что исполнится.
Вот это и есть приём, ради которого я притащил историю.
Потому что на той же неделе вышел замер, который закрывает второй конец трубы.
Один разработчик сделал браузерную игру, где вы садитесь на место того самого диалога. Агент шлёт команды одну за другой, время идёт, надо жать «разрешить» или «запретить».
Часть команд обычные —
git status, npm test. Часть вроде cat ~/.aws/credentials, то есть ваши ключи уезжают на чужой сервер. Сыграли 40 тысяч раз, набралось 409 тысяч решений.Люди пропускают каждую третью угрозу.
rm -rf / ловят почти всегда, а команду, которая крадёт ключи, пропускают втрое чаще — она выглядит нестрашно.Хуже всего с
npm run analyze: её разрешили 64,7% игроков, первое место среди тридцати семи угроз. При том, что прямо над кнопкой в логе видно, как скрипт гонит вывод через curl на чужой домен. Вывод автора: знакомое имя скрипта удваивает шансы вредоноса, даже когда содержимое показано.
Теперь сложите два конца. Машина показывает не то, что исполнится. Человек не читает то, что показано.
Что сделать сегодня. Откройте свой список разрешённых команд и вычеркните всё, что запускает файл из репозитория:
npm run, make, just. Это не команды, а имена — за ними лежит произвольный шелл, который тот же агент и правит.Честности ради: в игре угрозами были 34% команд, а в жизни их доли процента. Автор считает, что тогда внимание падает ещё сильнее, но это его допущение, а не измерение.
Какую команду вы разрешаете не глядя, потому что видели её тысячу раз?


