Перейти до вмісту

gVisor

Матеріал з Вікіпедії — вільної енциклопедії.
gVisor
Типпісочниця для контейнерів
РозробникGoogle
Перший випуск2 травня 2018
Операційна системаLinux
Мова програмуванняGo
ЛіцензіяApache License 2.0
Репозиторійhttps://github.com/google/gvisor
Вебсайтgvisor.dev

gVisor (gVisor) — відкрита пісочниця для контейнерів, яку розробила Google. Наголос зроблено на безпеці, ефективності й простоті використання.[1][2] Вона дає ізоляцію, подібну до віртуалізації, і водночас зберігає ощадливість звичайних контейнерів. gVisor перехоплює системні виклики застосунку і реалізує велику частину ABI системних викликів Linux у просторі користувача. Це додатковий захист порівняно зі звичайними контейнерами, які працюють просто на ядрі Linux і відділені лише просторами імен.[3][4] На відміну від ядра Linux, gVisor написано мовою Go, безпечною щодо пам’яті, щоб уникати типових помилок програм на C.[5] Серед новіших можливостей — контрольна точка й відновлення, а також підтримка графічних процесорів Nvidia з CUDA і TPU Google Cloud для навантажень штучного інтелекту.[2][6][7]

За даними Google[8] і Бреда Фіцпатрика,[9] gVisor широко використовують у промисловому середовищі Google, зокрема в стандартному середовищі App Engine, у Cloud Functions і в Google Cloud Run.[10] Його також вбудовано в Google Kubernetes Engine (GKE Sandbox), тож поди Kubernetes можна ізолювати для випадків на зразок SaaS і багатоквартирності.[11] У жовтні 2026 року Google оголосила, що передає gVisor до Cloud Native Computing Foundation (CNCF) як проєкт пісочниці.[12]

Поза Google gVisor використовують Ant Group, DigitalOcean (для App Platform), Cloudflare (для збирань Cloudflare Pages), Snowflake і інструмент Dangerzone від Freedom of the Press Foundation. OpenAI і Anthropic запускають у gVisor ненадійний або згенерований штучним інтелектом код. Docker (у Docker Desktop для Mac) і Tailscale використовують бібліотеку netstack для мережі в просторі користувача.[13] У липні 2026 року OpenAI повідомила команді gVisor про проблему пісочниці. Команда сказала, що випустила виправлення наступного тижня і що для експлуатації потрібна нестандартна конфігурація, від якої документація відраджує.[14]

Архітектура

[ред. | ред. код]

gVisor працює як ядро застосунку: перехоплює системні виклики й відмови сторінок самої пісочниці, а не передає їх ядру Linux хоста.[15]

  • runsc — виконуваний файл середовища виконання контейнерів OCI. Він стикується з Docker, containerd і Kubernetes, щоб запускати пісочниці й керувати ними.[15]
  • Sentry — ядро gVisor у просторі користувача, написане мовою Go. Воно реалізує велику підмножину інтерфейсу системних викликів Linux, а також керування процесами, сигнали й мережу через власний стек netstack.[16] Логіка виконується в коді gVisor, безпечному щодо пам’яті, а не в ядрі хоста.[15]
  • Gofer — необов’язковий окремий процес із трохи більшими правами. Він посередникує доступ до файлової системи хоста і спілкується з Sentry протоколом LISAFS, який замінив 9P. Типово, коли ввімкнено directfs, Gofer передає Sentry файлові дескриптори монтувань контейнера, і той сам робить обмежені системні виклики відносно дескриптора. Якщо directfs вимкнено, усі файлові операції йдуть через Gofer.[15][17][18]

Щоб зменшити поверхню атаки на хост, Sentry працює під жорстким фільтром seccomp і в ізольованих просторах імен користувача й монтування. Навіть невеликий набір системних викликів хоста, які йому дозволено, сильно обмежено.[15] Це другий шар захисту: самої вади в Sentry не досить, щоб вийти на хост.[15][19] Як і інші пісочниці, gVisor загалом не захищає від апаратних атак бічними каналами, зокрема Spectre. Їх має пом’якшувати ядро хоста або обладнання.[15][20]

Платформи

[ред. | ред. код]

gVisor має перехопити системні виклики застосунку в пісочниці й спрямувати їх у Sentry. Це приховано за інтерфейсом «платформи». Зараз їх дві.

  • Systrap використовує можливість SECCOMP_RET_TRAP підсистеми seccomp-bpf: системний виклик у пісочниці породжує сигнал SIGSYS, і керування переходить до gVisor. Апаратна віртуалізація не потрібна, тож платформа працює навіть усередині віртуальних машин і є найпереноснішою. У середині 2023 року Systrap замінив старішу платформу ptrace як типову.[21]
  • KVM використовує KVM ядра: Sentry водночас є гостьовим ядром і монітором віртуальної машини. На «голому» залізі це найшвидший варіант, але вкладена віртуалізація його уповільнює, а без відповідних розширень віртуалізації він недоступний.[21]

Початкова платформа ptrace на основі PTRACE_SYSEMU лишається в коді, але більше не підтримується.[21]

Можливості

[ред. | ред. код]
  • Контрольна точка й відновлення. runsc може зберегти на диск стан ядра й пам’яті працюючої пісочниці і відновити його в новому контейнері, зокрема для навантажень на графічних процесорах CUDA через утиліту cuda-checkpoint від NVIDIA.[22]
  • Прокидання GPU і TPU. Драйвери nvproxy і tpuproxy перехоплюють виклики ioctl і mmap на віртуальних файлах прискорювача, перекладають вказівники й файлові дескриптори з адресного простору пісочниці і передають дозволену підмножину викликів драйверам прискорювача на хості. Ці виклики обробляє драйвер ядра хоста, а не емуляція в Sentry, тож вади тих драйверів лишаються частиною поверхні атаки.[6][7]

Продуктивність

[ред. | ред. код]

Оскільки Sentry перехоплює системні виклики в просторі користувача, накладні витрати найбільші на навантаженнях із багатьма системними викликами і вводом-виводом і майже не помітні на обчисленнях, які виконуються у власному адресному просторі. Документація зазначає, що після встановлення відображень саме виконання на процесорі, доступ до пам’яті й дисковий ввід-вивід не мають істотних структурних накладних витрат.[23] Щоб зменшити витрати на файлову систему, gVisor типово вмикає записуваний кореневий оверлей tmpfs і directfs, щоб не ходити щоразу до Gofer.[17][18]

Примітки

[ред. | ред. код]
  1. ↑ Lacasse, Nicolas (2 травня 2018). Open-sourcing gVisor, a sandboxed container runtime. Google Cloud Blog (англ.). Процитовано 21 жовтня 2026.
  2. 1 2 The Container Security Platform. gvisor.dev (англ.). Процитовано 21 жовтня 2026.
  3. ↑ Updates in container isolation. LWN.net (англ.). Процитовано 18 лютого 2019.
  4. ↑ Sandboxing with gVisor (англ.). 17 червня 2018. Процитовано 18 лютого 2019.
  5. ↑ Cutler, Cody; Kaashoek, M. Frans; Morris, Robert T. (2018). The benefits and costs of writing a POSIX kernel in a high-level language (англ.). с. 89—105. ISBN 978-1-939133-08-3.
  6. 1 2 GPU Support. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  7. 1 2 TPU Support. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  8. ↑ GKE Sandbox: Bring defense in depth to your pods. Google Cloud Blog (англ.). Архів оригіналу за 21 травня 2019. Процитовано 28 травня 2019.
  9. ↑ @bradfitz (4 травня 2018). Brad Fitzpatrick Twitter (Твіт) (англ.). Процитовано 18 лютого 2019 — через Твіттер.
  10. ↑ Container runtime contract. Google Cloud (англ.). Процитовано 10 квітня 2019.
  11. ↑ GKE Sandbox. Google Cloud Documentation (англ.). Процитовано 27 жовтня 2026.
  12. ↑ gVisor is being donated to CNCF. gvisor.dev (англ.). 2 жовтня 2026. Процитовано 20 жовтня 2026.
  13. ↑ Who's Using gVisor. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  14. ↑ Emerson Redding (23 жовтня 2026). Exclusive: gVisor says OpenAI's sandbox issue required a discouraged configuration. RuntimeWire (англ.). Процитовано 29 жовтня 2026.
  15. 1 2 3 4 5 6 7 Introduction to gVisor security. gvisor.dev (англ.). Процитовано 25 червня 2026.
  16. ↑ Networking Guide. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  17. 1 2 Filesystem. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  18. 1 2 Faster filesystem access with Directfs. gvisor.dev (англ.). 27 червня 2023. Процитовано 20 жовтня 2026.
  19. ↑ Security and Vulnerability Reporting. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  20. ↑ Security Model. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  21. 1 2 3 Platform Guide. gvisor.dev (англ.). Процитовано 25 червня 2026.
  22. ↑ Checkpoint/Restore. gvisor.dev (англ.). Процитовано 20 жовтня 2026.
  23. ↑ Performance Guide. gvisor.dev (англ.). Процитовано 20 жовтня 2026.

Посилання

[ред. | ред. код]