Перейти к основному содержимому

Stapler v0.0.27

· 6 мин. чтения

Выпущена версия Stapler v0.0.27.

В этом релизе мы сделали упор на повышении безопасности сборок и улучшили сам формат Staplerfile.

Коротко (tl;dr)

  • Улучшена безопасность: строгий режим сборки с set -euo pipefail, отказ от setcap и bindfs, возможность использования в контейнерах без --privileged.
  • Новые возможности в Staplerfile: поддержка nonfree для несвободных пакетов, disable_network для отключения сети, переопределения по версиям дистрибутивов, новый метод dirty для зависимостей.
  • Контроль поведения: настройки forbidSkipInChecksums и forbidBuildCommand для строгой проверки целостности и ограничения сборки.
  • Улучшения и исправления: новые хелперы files-find-*, исправлены ошибки локализации, улучшены тесты, обновлены зависимости.

Улучшение безопасности

В этом релизе мы сделали большой шаг к тому, чтобы сборка пакетов в Stapler была безопаснее, предсказуемее и менее зависела от привилегий.

Для пользователей это означает:

  • 📦 меньше зависимостей (не нужны bindfs, setcap)
  • 🛡️ меньше потенциальных уязвимостей, связанных с получением root-доступа
  • 🐳 возможность использованиея Stapler в Docker/Podman без --privileged

Хоть это и потребовало изменения некоторой логики, но все эти изменения не должны сильно повлиять на привычный пользовательский опыт.

Технические детали (для любопытных)

Раньше в stplr использовались:

  • setcap cap_setuid,cap_setgid+ep — нужны были для переключения на пользователя при сборке. Это позволяло:

    1. ограничить доступ к /home
    2. использовать общий кэш.

    Однако наличие исполняемого файла с capability само по себе повышает риски безопасности.

  • bindfs — применялся для сборки, когда нужно было “подмонтировать” рабочую директорию и директорию со скриптом (часто лежащим в /home). Без этого “обхода” stapler-builder не имел бы доступа к нужным файлам.


Теперь схема изменилась:

  • От setcap мы отказались.
    При выполнении build теперь не происходит переключения на stapler-builder.
    Вместо этого используется комбинация:

    • ограничения на уровне user namespace (CLONE_NEWNS и mount),
    • правила для хендлеров интерпретатора mvdan.cc/sh.

    При выполнении stplr install (который требует root) происходит переключение на stapler-builder и применяются те же правила.

    Такой подход позволил не только скрывать /home во время сборки, но и изолировать от доступа другие важные каталоги самого Stapler.

  • Отказ от переменной $scriptdir устранил необходимость в bindfs. Так как все используемые в сборке файлы теперь явно перечислены в Staplerfile, мы можем просто копировать их — без дополнительных слоёв монтирования.


Итог: меньше зависимостей, меньше точек атаки. А для пользователей это выражается в более безопасной сборке пакетов.

Работа с несвободными пакетами (nonfree=1)

Некоторые пакеты содержат несвободные компоненты — например, проприетарные драйверы или ПО с ограниченными условиями лицензии. Чтобы пользователи осознанно устанавливали такой софт, в формате Staplerfile появилась опция nonfree=1, которая помечает пакет как несвободный и требует явного согласия с лицензией.

Как это работает

  • При сборке или установке пакета с nonfree=1 в интерактивном режиме пользователю показывается предупреждение и текст лицензии.
  • Чтобы продолжить, нужно явно подтвердить согласие. В случае отказа (n, q или Esc) процесс прерывается.
  • В неинтерактивном режиме (например, CI/CD или автоматическая установка) по умолчанию считается, что пользователь принимает условия.
к сведению

Для пользователей это значит, что теперь установка несвободного софта стала прозрачнее и безопаснее: всегда понятно, с какими условиями вы соглашаетесь. Для авторов пакетов — это способ явно задокументировать лицензионные ограничения.

Настройки forbidSkipInChecksums и forbidBuildCommand

Stapler теперь позволяет пользователям жёстко контролировать поведение при установке и сборке пакетов через конфигурацию:

  • forbidSkipInChecksums — запрещает устанавливать пакеты, если в массиве checksums указан хотя бы один элемент SKIP.

    Это полезно для тех, кто хочет быть уверен, что все исходники проходят проверку целостности.

  • forbidBuildCommand — полностью запрещает выполнение команды build.

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

    к сведению

    Даже без этой опции команда build доступна только пользователям из группы wheel

Эти настройки применяются через конфиг Stapler:

stplr config set forbidSkipInChecksums true
stplr config set forbidBuildCommand true

Изменения в Staplerfile

🚨 Breaking changes

Удаление переменной scriptdir

Раньше в секции sources нужно было писать так:

sources=(
$scriptdir/file
)

Теперь путь задаётся через local:///file:

sources=(
local:///file
)

Это изменение позволило упростить работу и отказаться от bindfs.

Сборка стала строже

Теперь сборка выполняется в “строгом” режиме (set -euo pipefail). Если раньше скрипт “тихо проглатывал” ошибки, то теперь они будут останавливать сборку.

к сведению

Это повысит предсказуемость и надёжность пакетов, но может потребовать исправления старых рецептов.

Новые возможности

Переопределения по версии дистрибутива

Теперь в Staplerfile можно задавать переопределения не только для разных дистрибутивов, но и для их конкретных версий.

Это решает проблему, когда зависимости пакета меняются между мажорными версиями одного дистрибутива. Например, вы можете указать разные зависимости или настройки для Fedora 40 и Fedora 41, обеспечивая большую гибкость и точность при сборке.

Подробнее читайте в документации.

dirty метод для поиска зависимостей

Появилась возможность выбора метода определения зависимостей с помощью auto_reqprov_method. Раньше использовался только метод rpm, который часто требовал установки -devel пакетов, что не всегда удобно.

Новый метод dirty решает эту проблему. Он сканирует ELF-файлы (исполняемые файлы и библиотеки) в пакете, определяя зависимости и предоставляемые библиотеки напрямую, без системных утилит RPM. Метод менее точен, чем rpm, и может пропустить сложные зависимости, поэтому если нужна максимальная совместимость и более точное определение зависимостей — выбирайте rpm.

disable_network

disable_network=1 полностью отключает сетевой доступ во время сборки (после получения sources). Это один из шагов, который может приблизить воспроизводимые сборки с использованием Stapler.

nonfree

  • nonfree=1 — помечает пакет как несвободный. При установке пользователь должен явно согласиться с лицензией.

  • nonfree_msg — можно указать произвольный текст лицензионного соглашения прямо в Staplerfile:

    nonfree_msg="This software contains proprietary software from Google. Redistribution and modification may be restricted."
  • nonfree_msgfile — путь к файлу с текстом соглашения (например, LICENSE.txt). Имеет приоритет над nonfree_msg.

  • nonfree_url — ссылка на полный текст лицензии или на репозиторий проекта. Она будет показана внизу экрана подтверждения.

    nonfree_url="https://www.google.com/intl/ru/chrome/terms/"

Подробнее можно ознакомиться в документации.

Расширение набора files-find-*

В версии Stapler v0.0.27 добавлены новые хелперы для упрощения поиска и обработки файлов в Staplerfile. Теперь набор files-find-* включает такие функции, как files-find-binary, files-find-systemd-user, files-find-systemd и другие. Эти хелперы лучше соответствуют функционалу install-*, что делает настройку сборки более удобной и последовательной.

Подробнее со всеми хелперами можно ознакомиться в документации.

Мелкие исправления

  • firejail и rpm-build добавляются в качестве зависимостей при firejail=1 и auto_req=1 соответственно.
  • Исправлены ошибки в локализации, которые нашли пользователи.
  • Исправлена работа на ALT Linux при установленном пакете eepm-apt (#31).
  • Добавлена подсказка при просмотре Staplerfile с комбинациями клавиш.
  • Удалена незадокументированная команда gen.
  • Улучшены тесты, небольшой рефакториг кода, обновлены зависимости и ряд других мелких исправлений.