Ограничения и уход от 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 переносит действие на хост целиком, вместе с правами.