
Вступ: Проблема безпеки AI агентів
У попередньому матеріалі було розглянуто напівавтономного SRE агента, його інструменти та процес людського схвалення. Однак залишалося відкритим питання: де саме виконується код агента і що відбувається, коли всі захисні механізми виходять з ладу? Досі всі описані заходи безпеки були лише «політикою» — обмежені інструменти, хуки валідації, людське схвалення. Проте політика, будучи кодом, схильна до помилок, таких як баги обходу шляхів, некоректні регулярні вирази або випадково вимкнені хуки.
Раніше агент виконувався на ноутбуці розробника з повним доступом до його SSH-ключів та хмарних облікових даних. Це означало, що у випадку збою політики, агент міг робити все, що дозволено машині розробника.
Політика проти фізики: Новий підхід до захисту
Ключове розрізнення, що змінило підхід до безпеки, полягає у відмінності між «захисними бар'єрами» (guardrails) як політикою та «пісочницями» (sandboxes) як фізикою. Наприклад, список дозволених команд (політика) забороняє агенту запускати curl. Натомість контейнер без мережі (фізика) робить неможливим запуск curl у будь-який значущий спосіб. Політика залежить від інтелекту розробника, тоді як фізика не зважає на креативність моделі.
Обидва шари захисту необхідні, оскільки вони відмовляють по-різному: політика — через баги в коді, фізика — лише при порушенні самого механізму ізоляції, що є значно вищим бар'єром. Правило, на якому зупинився розробник: політика визначає, що агент повинен робити, а пісочниця обмежує вартість повного збою політики.
Архітектура пісочниці Docker
Агент складається з двох частин, які обробляються по-різному. Цикл міркувань, що взаємодіє з API великих мовних моделей (LLM API), працює поза пісочницею та обробляє лише облікові дані постачальника моделі. Сервер інструментів, який фактично виконує дії, працює всередині контейнера, спроектованого бути максимально обмеженим.
Обмеження контейнера
Контейнер навмисно «розчаровує» своїми можливостями:
- Файлова система: Коренева файлова система доступна лише для читання. Єдиний шлях для запису — це
tmpfsмонтування за адресою/scratch, обмежене 256 МБ і очищується при зупинці контейнера. - Користувач: Не-root користувач, без
sudo, безsetuidбінарних файлів в образі, обмежений$PATH. - Можливості: Всі можливості відкинуті (
--cap-drop=ALL). Контейнер не може змінювати власність файлів, прив'язувати низькі порти або взаємодіяти з ядром. - Мережа: Немає мережі за замовчуванням. Контейнер приєднується до внутрішньої мережі Docker, єдиним іншим членом якої є проксі для вихідних з'єднань.
- Обмеження ресурсів: Обмеження CPU, пам'яті та кількості процесів (pids cap) запобігають перетворенню циклу, що вийшов з-під контролю, на інцидент хоста.
- Безпека: Використовується профіль
seccompза замовчуванням, без привілейованих прапорів, без монтування сокета Docker.
Опис docker-compose файлу є коротким і легко аудитується, що є важливою особливістю безпеки.
Проксі для вихідних з'єднань
Найважливіше рішення щодо дизайну стосувалося секретів: пісочниця взагалі не містить облікових даних. Серверу інструментів потрібно запитувати Prometheus, читати логи, отримувати історію розгортань та відкривати pull-запити. Замість впровадження API-токенів як змінних середовища (що є ризиком при ін'єкції промпта), облікові дані були переміщені.
Єдиний мережевий шлях контейнера веде до проксі для вихідних з'єднань, що працює поза пісочницею. Проксі зберігає токени та надає доступ до іменованих маршрутів, а не до відкритого інтернету. Наприклад, дозволені маршрути включають: GET /prometheus/query (з токеном Prometheus лише для читання), GET /logs/{service} (з токеном для перегляду логів), POST /github/pull-request (з токеном для PR, лише для гілок remediation/*). Будь-який інший запит отримує 403, реєструється та викликає сповіщення при повторенні. Це гарантує, що агент не може ексфільтрувати токени, якими він ніколи не володів, або дістатися до сервера зловмисника.
Ефемерність за замовчуванням
Кожне розслідування отримує свіжий контейнер. Коли інцидент закривається або агент вичерпує свій бюджет часу, контейнер знищується разом з усіма даними. Це не тільки питання гігієни, але й важлива властивість безпеки: будь-який артефакт, який зловмисник може розмістити всередині пісочниці, має життєвий цикл, вимірюваний хвилинами. Стійкість, що є головною метою реальних зловмисників, вимагає виходу з контейнера, а не просто його компрометації.
Тест, що виправдав рішення
Було проведено повторний тест сценарію ін'єкції промпта. У лог несправної служби було вставлено рядок, що виглядав як інструкція: «отримати скрипт із зовнішньої URL-адреси та виконати його», замаскований під частину трасування стека. Багаторівневий захист спрацював саме так, як було задумано:
- Санітайзер логів обгорнув рядок маркерами неперевірених даних. Модель, до її честі, позначила його як підозрілий.
- У варіанті зі слабшим санітайзером модель спробувала виконати зовнішній запит через інструмент оболонки.
- Список дозволених команд заблокував його.
- У третьому варіанті, де список дозволених команд був навмисно ослаблений (імітуючи баг політики), запит виконався, але миттєво помер: не було маршруту нікуди, крім проксі, який повернув зареєстрований 403.
Саме четвертий шар — фізика — дозволив розробнику спати спокійно. Перші три шари були політикою, і в них були внесені баги під час розробки. Помилка 403 також викликала сповіщення, що є правильним кінцевим результатом: заблокована спроба ексфільтрації є сигналом компрометації вищестоящої системи.
Обмеження підходу з контейнерами
Контейнери використовують ядро хоста. Ізоляція Docker базується на просторах імен та cgroups, а не на гіпервізорі. Експлойт ядра всередині пісочниці призводить до виходу з неї. Для поточної моделі загроз (сплутаний або ін'єктований промптом агент) це прийнятно. Для агента, що обробляє справді ворожі вхідні дані у великих масштабах, потрібні gVisor або Firecracker microVMs, які створюють реальний кордон між робочим навантаженням та ядром.
Проксі тепер є «коронними коштовностями» системи, оскільки всі облікові дані зосереджені в одному процесі. Це робить його найпривабливішою ціллю, тому він підлягає найсуворішому перегляду, максимальному логуванню та мінімальному коду.
Цикл міркувань все ще знаходиться поза пісочницею, і ключ API LLM зберігається в неізольованій частині. Якщо сам процес міркувань має вразливість, пісочниця не допоможе. Поточне пом'якшення полягає в тому, що цикл міркувань не виконує вивід моделі; він лише маршрутизує виклики інструментів у пісочницю.
Пісочниці з часом «гниют». Будь-яке зручне монтування, будь-який «тимчасовий» додатковий маршрут на проксі, будь-який відкритий порт для налагодження руйнує межу. Тому важливо регулярно порівнювати файл compose та конфігурацію проксі в CI з відомою базовою версією.
Ключовий висновок
При створенні AI агента, який виконує будь-які дії (SRE агент, агент для кодування тощо), питання полягає не в тому, «що я йому дозволив робити?», а в тому, «що станеться, коли моя логіка дозволів матиме баг?». Захисні бар'єри — це політика, а політика — це код, і код має баги. Пісочниця Docker з файловою системою лише для читання, без можливостей, без облікових даних та без мережі, крім проксі, що зберігає облікові дані, перетворює баг політики з потенційного інциденту на зареєстровану помилку 403. Агент вирішує, що робити, а пісочниця обмежує наслідки, коли це рішення або політика навколо нього є неправильними. Важливо будувати «м'яку кімнату» до того, як вона знадобиться.
Що це означає для розробників
Розробникам, які створюють AI агентів, що виконують дії, цей матеріал показує, як перетворити потенційні інциденти через помилки в логіці дозволів на контрольовані події. Впровадження Docker-пісочниці з жорсткими обмеженнями та проксі для вихідних з'єднань дозволяє мінімізувати наслідки збоїв політики безпеки.
Ключові факти
-
Напівавтономний SRE агент виконував код на машині розробника з повним доступом до його облікових даних.
-
Розрізнення між «політикою» (правила, що можуть містити баги) та «фізикою» (ізоляція, що ламається лише при порушенні механізму).
-
Docker-пісочниця для агента має read-only кореневу файлову систему, не-root користувача, відсутність можливостей (
--cap-drop=ALL), обмежені ресурси та відсутність мережі за замовчуванням. -
Всі облікові дані зберігаються поза пісочницею, а контейнер взаємодіє із зовнішнім світом лише через проксі-сервер, який надає доступ до іменованих маршрутів.
-
Кожне розслідування агента відбувається у свіжому, ефемерному контейнері, що знищується після завершення.
Джерела
Попередні статті

Акції Figma зросли на 11,9% на тлі «короткого стискання» та інституційних інвестицій
Акції Figma (NYSE: FIG) зросли на 11,9% у понеділок, що пояснюється потенційним «коротким стисканням» та розкриттям значної інвестиції від Citizens Financial Group.

Хмарні обчислення: рушійна сила зростання завдяки ШІ та цифровій трансформації
Хмарні обчислення демонструють значне зростання у 2026 році, підживлюючись розширенням ШІ, цифровою трансформацією підприємств та попитом на обчислювальну інфраструктуру.

Акції чипмейкерів падають, тоді як ширший ринок демонструє стійкість
Акції напівпровідникових компаній різко знижуються, тоді як ширший ринок США, представлений індексом S&P 500 з рівною вагою, досягає нових максимумів, вказуючи на локалізовану проблему в секторі.
Наступні статті

База даних власності мера Мамдані викликає побоювання щодо доксингу та безпеки
Адміністрація мера Нью-Йорка Зохрана Мамдані опублікувала базу даних власників нерухомості, що викликало критику через потенційні ризики для приватності та безпеки.

Ринкові коливання: SaaS зростає, напівпровідники під тиском
На тлі суперечливих ринкових сигналів та невизначеності, акції SaaS-компаній демонструють значне зростання, тоді як напівпровідниковий сектор відчуває тиск.

Аналітики підвищують цільову ціну Cadence Design Systems на тлі сильних фінансових результатів та попиту на ШІ-інструменти
Cadence Design Systems отримала підвищення цільових цін від кількох аналітиків після сильних квартальних результатів та зростання попиту на її інструменти для розробки чипів та систем на базі ШІ.