Ограничения и уход от astra-shim

Ограничения и уход от astra-shim#

astra-shim закрывает узкий класс проблем: неверные пути и вызовы хостовых команд. Всё остальное он не решает, и рассчитывать на него как на общий обход ограничений песочницы не стоит.

Где работает#

Слой LD_PRELOAD работает на любой программе, которая динамически слинкована с libc и обращается к файлам через её функции. Это подавляющее большинство перепакованных deb-программ, включая приложения на Electron. Слой доступен на всех линиях и версиях ядра.

Слой seccomp дополнительно закрывает загрузку разделяемых библиотек через ld.so, статические программы и программы на Go. У него два условия:

  • архитектура x86_64. Супервизор реализован только под неё, на других архитектурах расширение не собирается;

  • ядро 5.9 или новее. Механизм передачи дескриптора в целевой процесс появился в 5.9; на более старом ядре слой не поднимается, и работает только LD_PRELOAD.

Второе условие важно для линии 1.7, где встречаются ядра 5.4. Запуск с ASTRA_SHIM_SECCOMP=1 на такой системе не падает, но seccomp-слой молча не поднимается: перехват сводится к LD_PRELOAD, а всё, что закрывалось только seccomp, снова ломается. Проверить ядро можно командой uname -r.

Где не работает#

Слой LD_PRELOAD не действует на программы, которые загрузчик запускает без предзагрузки библиотек. Это программы с установленным битом setuid и с файловыми возможностями: для них ядро игнорирует LD_PRELOAD. Внутри песочницы Flatpak такие программы и так работать не будут, поэтому от них избавляются на этапе упаковки.

Ни один из слоёв не помогает, если проблема не в пути и не в запуске процесса. astra-shim не выдаёт доступ к устройствам, сети и файлам за пределами песочницы, не регистрирует имена на шине D-Bus, не поднимает системные службы, не загружает модули ядра и не снимает ограничения seccomp-профиля самого Flatpak. Всё это решается разрешениями приложения, а часть не решается вовсе.

Правило ремапа переписывает только сам путь. Если по новому пути файла нет, программа получит ошибку открытия так же, как получила бы её без перехвата. Каталоги astra-shim не создаёт и содержимое не копирует.

Ремап широких префиксов ломает приложение. Правило /usr/lib = /app/lib уводит в /app/lib и обращения к общим библиотекам среды выполнения, которых там нет. Правила задаются на каталог конкретного приложения, а не на общий корень.

Чем платит сборка#

Каждый перехваченный вызов проходит через сравнение с таблицей правил. На типичном наборе из нескольких правил это незаметно, но таблица на сотни записей уже сказывается на программах, которые часто работают с файлами.

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

Приложение получает зависимость от расширения среды выполнения. Без смонтированного расширения лаунчер не найдёт обёртку, и приложение не запустится.

Как уйти от astra-shim#

astra-shim не входит в нормальное устройство Flatpak-приложения и остаётся временной мерой. Приложение, которое работает без него, проще, быстрее и не зависит от расширения среды.

Зашитые пути убираются одним из трёх способов. Программа ищет свои файлы относительно собственного расположения, определяя его через /proc/self/exe. Программа читает путь из переменной окружения, а нужное значение выставляется в секции permissions.env манифеста. Программа собирается с другим префиксом: для источника sourcedir префикс /app задаётся в командах сборки, и абсолютные пути сразу получаются правильными.

Текстовые файлы через astra-shim править не нужно. Скрипты, конфиги и desktop-файлы aft-app переписывает при упаковке сам, заменяя /usr на /app. Правила ремапа нужны там, где правка текста невозможна, то есть внутри скомпилированных бинарников.

Вызовы хостовых команд убираются вместе с функциональностью, которая в песочнице всё равно не имеет смысла. Обновление кэша иконок, базы desktop-файлов и базы MIME-типов выполняет сам Flatpak при установке. Управление службами и установка пакетов из приложения в песочнице неуместны, и подмена их на flatpak-spawn --host переносит действие на хост целиком, вместе с правами.