Контейнеры, виртуальные машины и песочницы: что на самом деле изолирует, а что только выглядит изолированным

konstrukt
Оффлайн

konstrukt

.
.
.
Регистрация
19.09.18
Сообщения
191
Реакции
82
Репутация
1
Добрый день, друзья.


Линия Мажино, цепь укреплений 1930-х годов, считалась образцом неприступности: бетон, орудия, подземные казармы, железные дороги внутри. В 1940-м её не штурмовали, а обошли, пройдя через лес, который сочли непроходимым для танков. Стена оказалась безупречной, только шла она не там, где пошёл противник.


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


Как вообще оценивать изоляцию


Два вопроса решают почти всё.


Первый: что общего у «внутри» и «снаружи»? Ядро, сетевой стек, буфер обмена, файловая система, графический сервер, время, устройства. Чем больше общего, тем больше дорог между мирами.


Второй: сколько кода нужно сломать, чтобы выйти? Граница, которую держат сотни системных вызовов ядра, шире той, что держит небольшой гипервизор с тщательно урезанным набором устройств. Размер поверхности атаки важнее громкого названия технологии.


Теперь пройдём по ступеням снизу вверх.


Ступень 0. То, что только выглядит изоляцией


Отдельный профиль браузера, контейнерные вкладки Firefox, виртуальные рабочие столы, второй значок на панели. Эти вещи разделяют куки и историю, но не больше. Один процесс-пользователь, одно ядро, один IP, один отпечаток браузера, общая система за ними. Контейнерные вкладки Firefox для приватности защищают только от кросс-сайтового слежения по cookies, они не скрывают адрес и не отделяют одну личность от другой.


Отдельная учётная запись в системе уже честнее: у неё свои права и файлы. Но это та же работающая система, то же ядро, тот же сетевой выход, часто общий графический сеанс. Если у вас X11, любое приложение в сеансе может читать нажатия клавиш и снимать экран других: у X11 нет внутренней границы между клиентами. Wayland устроен иначе, но и там многое зависит от портала и настроек.


Ступень 1. Песочницы приложений


Flatpak и bubblewrap, песочница Android, браузерная песочница, Firejail. У них одно ядро с хозяином, а граница строится из пространств имён, фильтрации системных вызовов и прав. Это реальная защита от обычных атак, но её сила определяется настройкой.


Типичная ловушка: пакет Flatpak с разрешением на всю домашнюю папку, на сокет X11 или на системную шину. Формально песочница есть, практически дыра. Проверить можно командой flatpak info --show-permissions имя.приложения: если увидишь filesystem=host или home, о защите можно забыть.


Firejail стоит отдельно. Он работает с повышенными привилегиями, и в прошлом в нём находили уязвимости с получением root. Инструмент безопасности с большой поверхностью атаки сам становится целью.


Ступень 2. Контейнеры


Docker, Podman, LXC. Контейнер не виртуальная машина: это обычный процесс с урезанным видом на систему (пространства имён), лимитами (cgroups), фильтром системных вызовов (seccomp) и набором прав (capabilities). Ядро одно на всех. Значит, любая уязвимость ядра, дающая повышение прав, пробивает границу. Известный предел: если ты не доверяешь коду внутри, контейнера недостаточно.


Показательный пример совсем недавний. В ноябре 2025 раскрыли три уязвимости runc (CVE-2025-31133, CVE-2025-52565 и CVE-2025-52881), компонента, на котором стоят Docker и Kubernetes. Они позволяют вредоносному образу или конфигурации выйти из контейнера, причём, как отмечали разбиравшие их специалисты, без обращения к ядру или гипервизору: достаточно подменить файл на символьную ссылку в момент создания контейнера. Затронуты были все известные на тот момент версии runc. Урок простой: даже сам «замок» может иметь дефект.


Конфигурация решает ещё больше, чем версия:


  • Монтирование сокета Docker внутрь контейнера равно выдаче root на хосте.
  • Режим --privileged почти полностью снимает изоляцию.
  • --network host отдаёт сетевой стек хозяина, а значит, и выход в сеть без разделения.
  • Монтирование домашней папки или / превращает границу в формальность.

Быстрая проверка запущенного контейнера: docker inspect --format '{{.HostConfig.Privileged}} {{.HostConfig.NetworkMode}}' имя и docker inspect -f '{{json .Mounts}}' имя. Для Podman важно, что он умеет работать без root: podman info --format '{{.Host.Security.Rootless}}' должен вернуть true. Rootless заметно сужает последствия побега.


Ступень 3. Усиленные контейнеры и микровиртуалки


Здесь компромисс между удобством контейнера и крепостью виртуальной машины. gVisor перехватывает системные вызовы в собственном ядре в пространстве пользователя, и до настоящего ядра доходит куда меньше. Kata Containers и Firecracker запускают каждый контейнер в лёгкой виртуальной машине с собственным ядром. Граница получается ближе к настоящей аппаратной. Платой служат ресурсы и сложность. Для запуска недоверенных документов и файлов это хороший выбор.


Ступень 4. Виртуальные машины


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


Побеги из виртуальных машин существуют: они регулярно разбираются на соревнованиях и в разборах. В списке премии Pwnie Awards среди отмеченных значится побег гостя на хост в KVM на arm64 (CVE-2026-46316), а в 2025 году на Pwn2Own показывали выход из VMware Workstation. Основной источник проблем это эмуляция устройств (дисков, сетевых карт, видео, USB), потому что это большой объём кода, который хозяин исполняет по команде гостя. Отсюда практическое правило: чем меньше устройств, тем лучше. Лишний USB-контроллер, звук, общий буфер или проброс USB-устройства расширяют границу.


Ещё один класс проблем: утечки по сторонним каналам между машинами на одном процессоре (семейство Spectre). Они не отменяют изоляцию, но показывают, что общая физическая память и кэши связывают миры.


Сильнее всего ослабляют ВМ собственные удобства: общие папки, общий буфер обмена, перетаскивание файлов, гостевые дополнения, проброс USB и GPU. Каждая такая функция это канал между «внутри» и «снаружи».


Ступень 5. Qubes и сильная компартментализация


Qubes строится на гипервизоре Xen с управляющей системой, у которой нет сети, и с отдельными машинами под каждую задачу. Сетевая и USB-стеки вынесены в свои изолированные виртуальные машины, устройства ограничены защитой памяти (IOMMU), а одноразовые виртуалки создаются и уничтожаются под открытие одного файла. Это самый зрелый подход к тому, чтобы граница была частью архитектуры, а не надстройкой. Цена: ресурсы, поддерживаемое железо и привычка.


Ступень 6. Отдельное железо


Если нужна уверенность выше всего, ничего не заменит отдельного компьютера, не подключённого к остальному. Любая программная граница выглядит проще, когда стоит физический воздушный зазор.


Что всё это значит для анонимности


Вот главное, что обычно упускают. Побег из песочницы это только один из рисков. Для анонимности чаще важнее другое: что протекает через общее, даже когда границу никто не ломал.


Сеть. Контейнер и виртуальная машина по умолчанию выходят в сеть через хозяина. Если у хозяина обычное соединение, гость тоже выходит напрямую, и ни Tor, ни VPN сами не появятся. Если VPN включён на хозяине, а гостю разрешён доступ к реальному интерфейсу, возможны утечки. Поэтому в Whonix сетевая изоляция устроена на уровне двух машин: рабочая станция физически видит только шлюз и не имеет другой дороги.


Отпечаток. Гость видит виртуализированное железо, но часто не слишком отличающееся от настоящего: модель процессора, видеокарту, разрешение, часовой пояс, язык, шрифты. Браузер внутри машины остаётся браузером со своим отпечатком, и ни контейнер, ни ВМ его не маскируют. Защита от фингерпринтинга это задача самого браузера (как в Tor Browser), а не изоляции.


Идентификаторы. Имя хоста, серийные номера дисков и сетевых карт, MAC-адрес, идентификаторы виртуального устройства. Если не менять их или клонировать образ, разные «личности» окажутся с одним и тем же набором.


Время и ресурсы. Синхронизация времени с хозяином, общий часовой пояс, одни и те же часы активности связывают разные машины.


Общие каналы. Буфер обмена, общие папки, перетаскивание, снимки состояния, резервные копии образов. Один клик, и данные одной личности лежат в другой.


Хозяин видит всё. Любая изоляция односторонняя в смысле доверия: хозяин имеет доступ к памяти и диску гостя. Если хозяйская система скомпрометирована, анонимность гостя не спасёт ничто. Поэтому и стоят отдельные отношения доверия: гипервизор в Qubes специально тонкий, а управляющая система без сети.


Журналы и следы. История команд на хосте, логи гипервизора, снимки дисков, свободное место с остатками удалённых образов. Это следы, которые остаются в хозяйской системе, даже когда гость уничтожен.


Как выбирать под задачу


  • Открыть чужой документ или файл. Одноразовая виртуальная машина или инструмент с контейнерной изоляцией (вроде Dangerzone, который перерисовывает документ в изолированной среде). Не открывай подозрительное в той же системе, где работаешь.
  • Анонимная сессия. Whonix на изолированной схеме или Tails. Контейнер для этого не подходит: в нём нет принудительной сетевой изоляции.
  • Разделение личностей. Отдельные виртуальные машины с разными идентификаторами или разные устройства. Профили браузера недостаточны.
  • Разработка и сервисы. Rootless-контейнеры с минимальными правами и без монтирования лишнего.
  • Недоверенный код. Виртуальная машина или микровиртуалка, а не простой контейнер.
  • Критичное. Отдельное железо.

Чек-лист «что проверить у себя»


  1. Есть ли в контейнере привилегированный режим, сокет Docker, режим host для сети, монтирование домашней папки?
  2. Какие разрешения у Flatpak-приложений (flatpak info --show-permissions)?
  3. Работает ли Podman или Docker без root?
  4. Какие устройства проброшены в виртуальные машины, включён ли общий буфер, общие папки, USB?
  5. Через что гость выходит в сеть и что будет, если соединение оборвётся?
  6. Различаются ли идентификаторы разных машин и обновлены ли runc, ядро и гипервизор?
  7. Не работают ли чувствительные задачи под графическим сервером без изоляции между приложениями?

Итог


Изоляция это не свойство технологии, а свойство конкретной настройки против конкретной атаки. Профиль браузера защищает от слежки по cookies и больше ни от чего. Контейнер защищает от ошибок, но не от враждебного кода. Виртуальная машина крепче, если вы не пробили в ней дыр собственными удобствами. А Qubes и отдельное железо ближе всего к настоящей стене.


Для анонимности же главный вывод такой: прежде чем спрашивать, можно ли выбраться из песочницы, спроси, что в неё вообще попадает и что из неё выходит. Линию Мажино обошли не потому, что бетон был плох, а потому что противник выбрал другую дорогу.
 
Сверху Снизу