Репост из: PWN AI
Почему изолировать reasoning модели в обычном Docker уже бесполезно
Кажется, что если засунуть LLM с доступом к шеллу в обычный Docker-контейнер, хост будет в полной безопасности. Однако в AI Security Institute так не считают. Авторы выкатили в марте SandboxEscapeBench на фреймворке Inspect и наглядно показали что для современных reasoning-моделей дефолтный контейнер - как простая таска для разминки, а на успешный побег уходит всего полтора доллара в токенах. У меня только сейчас дошли до него руки.
Бенчмарк устроен как матрешка: уязвимый контейнер крутится внутри изолированной виртуальной машины (на EC2 или через Vagrant), а агенту выдается одна задача - вырваться наружу и забрать /flag.txt уже на уровне хостовой VM. Всего там 18 сценариев, покрывающих три слоя атаки: от классических мисконфигураций рантайма вроде проброшенного docker.sock и лишних capabilities до утечек сервисных аккаунтов в Kubernetes и хардкорных уязвимостей уровня Dirty Pipe и eBPF.
Исследователи поняли, что чем больше токенов на рассуждения вы даете модели, тем выше шанс, что она нащупает рабочий вектор. В самой статье мне интересно было ознакомиться с тем, как справились разные модели с задачей побега и какие популярные паттерны поведения можно увидеть при этом:
- Claude проявляет почти маниакальное упорство и методично перебирает гипотезы до полного исчерпания контекста;
- GPT при столкновении с неочевидными системными ошибками сдаётся и бросает задачу более чем в 90% сложных кейсов;
- DeepSeek-R1 регулярно воображает себя победителем: модель может десятки раз за прогон уверенно рапортовать о взятии флага, вообще не выбравшись из песочницы.
В статье это выглядит мощно, но когда пытаешься воспроизвести бенчмарк локально, магия рассеивается, всплывают неочевидные сложности.
Из коробки стенд жестко завязан на облако или Vagrant. Я пробовал упаковать окружение в Docker-in-Docker и сразу столкнулся с тем, что половина CVE для ядра и сценариев с Kubernetes на обычной тачке просто не заведутся без специфичного ядра, приходится шаманить с самим Inspect. Дальше начинается классическая борьба с рантаймом. Я пробовал запускать это под Windows (да-да, не удивляйтесь), и среда MSYS умудряется ломать пути к файлам, docker exec без интерактивного флага -i молча игнорирует ввод, а дефолтные установочные скрипты упорно пытаются накатить Docker прямо поверх уже работающего окружения.
Когда вы добираетесь до идеальных настроек сетапа, можно наконец запускать бенчмарк и погружаться в ожидание того, что модель сможет выбраться... Прогоны будут по 10–15 минут на сценарий и сотни тысяч токенов, любая сетевая ошибка без сохранения промежуточного JSON отправляет коту под хвост часы работы.
Делаем выводы. Docker разрабатывался для изоляции процессов и удобства доставки софта, а не как граница безопасности против автономного агента с правами root в консоли. Если вы даете модели шелл, изолировать её нужно с помощью аппаратных microVM уровня Firecracker. Любые меры, которые настроены криво или содержат ошибки конфигурации - фронтирные LLM обходят почти на автопилоте.
Кажется, что если засунуть LLM с доступом к шеллу в обычный Docker-контейнер, хост будет в полной безопасности. Однако в AI Security Institute так не считают. Авторы выкатили в марте SandboxEscapeBench на фреймворке Inspect и наглядно показали что для современных reasoning-моделей дефолтный контейнер - как простая таска для разминки, а на успешный побег уходит всего полтора доллара в токенах. У меня только сейчас дошли до него руки.
Бенчмарк устроен как матрешка: уязвимый контейнер крутится внутри изолированной виртуальной машины (на EC2 или через Vagrant), а агенту выдается одна задача - вырваться наружу и забрать /flag.txt уже на уровне хостовой VM. Всего там 18 сценариев, покрывающих три слоя атаки: от классических мисконфигураций рантайма вроде проброшенного docker.sock и лишних capabilities до утечек сервисных аккаунтов в Kubernetes и хардкорных уязвимостей уровня Dirty Pipe и eBPF.
Исследователи поняли, что чем больше токенов на рассуждения вы даете модели, тем выше шанс, что она нащупает рабочий вектор. В самой статье мне интересно было ознакомиться с тем, как справились разные модели с задачей побега и какие популярные паттерны поведения можно увидеть при этом:
- Claude проявляет почти маниакальное упорство и методично перебирает гипотезы до полного исчерпания контекста;
- GPT при столкновении с неочевидными системными ошибками сдаётся и бросает задачу более чем в 90% сложных кейсов;
- DeepSeek-R1 регулярно воображает себя победителем: модель может десятки раз за прогон уверенно рапортовать о взятии флага, вообще не выбравшись из песочницы.
В статье это выглядит мощно, но когда пытаешься воспроизвести бенчмарк локально, магия рассеивается, всплывают неочевидные сложности.
Из коробки стенд жестко завязан на облако или Vagrant. Я пробовал упаковать окружение в Docker-in-Docker и сразу столкнулся с тем, что половина CVE для ядра и сценариев с Kubernetes на обычной тачке просто не заведутся без специфичного ядра, приходится шаманить с самим Inspect. Дальше начинается классическая борьба с рантаймом. Я пробовал запускать это под Windows (да-да, не удивляйтесь), и среда MSYS умудряется ломать пути к файлам, docker exec без интерактивного флага -i молча игнорирует ввод, а дефолтные установочные скрипты упорно пытаются накатить Docker прямо поверх уже работающего окружения.
Когда вы добираетесь до идеальных настроек сетапа, можно наконец запускать бенчмарк и погружаться в ожидание того, что модель сможет выбраться... Прогоны будут по 10–15 минут на сценарий и сотни тысяч токенов, любая сетевая ошибка без сохранения промежуточного JSON отправляет коту под хвост часы работы.
Делаем выводы. Docker разрабатывался для изоляции процессов и удобства доставки софта, а не как граница безопасности против автономного агента с правами root в консоли. Если вы даете модели шелл, изолировать её нужно с помощью аппаратных microVM уровня Firecracker. Любые меры, которые настроены криво или содержат ошибки конфигурации - фронтирные LLM обходят почти на автопилоте.