Програма на основі Chromium аварійно завершується: «The SUID sandbox helper binary was found, but is not configured correctly»
Discord та інші програми на основі Electron або Chromium можуть зупинитися одразу під час запуску з таким повідомленням:
FATAL:sandbox/linux/suid/client/setuid_sandbox_host.cc:166] The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I'm aborting now. You need to make sure that /home/user/.config/discord/app-1.0.157/chrome-sandbox is owned by root and has mode 4755.Chromium поміщає сторінки, які він відображає, у пісочницю і підтримує два способи її побудувати: простір назв користувача (user namespace) або, якщо в просторі назв користувача відмовлено, допоміжну програму з setuid chrome-sandbox, що постачається разом із програмою. Коли захисний механізм активний, будь-якій програмі, якої немає в його списку, відмовлено в просторі назв, і Chromium переходить на допоміжну програму. Якщо допоміжну програму встановлено без біта setuid, Chromium завершує роботу, а не продовжує її без пісочниці.
Тож чи зачіпає це програму, залежить від її допоміжної програми. Arch встановлює допоміжну програму з setuid для chromium, для кожного пакунка electron і для signal-desktop, і brave-bin з AUR робить те саме, тож ці програми запускаються, як і раніше. Це зачіпає програми, які мають власний Chromium зі звичайною допоміжною програмою, що поширено серед пакунків -bin з AUR, а також кожну програму, яка запускається з вашого домашнього каталогу. Discord — одна з них: пакунок discord зі сховища Arch встановлює лише програму запуску, яка завантажує Discord у ~/.config/discord і запускає його звідти.
Щоб переконатися, що відмовив саме захисний механізм, запитайте про це сам захисний механізм. sudo ditana-userns-guard --status перелічує програми, яким він відмовив, — від найновішої, для кожної з користувачем, який її запустив, і кількістю разів; рядок на зразок refused 3x uid 1000 Discord, 12 s ago вказує на винуватця. Версія 1.00 захисного механізму лише веде підрахунок: у ній виконайте цю команду до і після запуску програми, і якщо значення denied зросло, то це був захисний механізм.
Для програми з вашого домашнього каталогу натомість скористайтеся її пакунком Flatpak:
sudo flatpak install flathub com.discordapp.Discordsudo pacman -Rns discordFlatpak будує свою пісочницю за допомогою bubblewrap, який є в списку, а власна пісочниця Discord тоді працює всередині неї. У цьому випадку не робіть того, про що просить повідомлення. Файл із setuid root у вашому домашньому каталозі надає права root двійковому файлу, який завантажив власний засіб оновлення програми і який ніхто не перевіряв, а наступне оновлення покладе поруч із ним новий.
Програма на основі Chromium із пакунка
Розділ «Програма на основі Chromium із пакунка»Більшість програм на основі Chromium або Electron, які встановлено з пакунка, запускаються нормально, бо їхній пакунок встановлює допоміжну програму пісочниці з setuid root, як це роблять пакунки chromium і electron з Arch. Повідомлення з’являється лише тоді, коли пакунок встановлює допоміжну програму без цього біта, а це трапляється рідко й здебільшого стосується пакунків -bin з AUR, які мають власний Electron. Усіх інших пакунків це не стосується: такої допоміжної програми в них немає. Виправлення полягає в тому, щоб надати допоміжній програмі цей біт. Тоді Chromium узагалі не потребує простору назв користувача, і саме тому це краще, ніж додавати програму до списку захисного механізму. Так можна вивести всі допоміжні програми в системі, яким бракує цього біта:
find /usr /opt -type f \( -name chrome-sandbox -o -name chrome_sandbox \) \( ! -user root -o ! -perm -4001 \)Встановити біт один раз недостатньо, бо наступне оновлення пакунка знову запише файл таким, яким він був. Хук pacman встановлює біт знову після кожного оновлення. Для кожного шляху, який вивела команда, присвойте його змінній helper і виконайте:
helper=/opt/example/chrome-sandboxsudo mkdir -p /etc/pacman.d/hookssudo tee "/etc/pacman.d/hooks/$(pacman -Qqo "$helper")-chrome-sandbox.hook" > /dev/null <<HOOK[Trigger]Type = PathOperation = InstallOperation = UpgradeTarget = ${helper#/}
[Action]Description = Making the Chromium sandbox helper in ${helper%/*} setuid root...When = PostTransactionExec = /usr/bin/chmod 4755 $helperHOOKsudo chmod 4755 "$helper"На відміну від допоміжної програми у вашому домашньому каталозі, ця є частиною пакунка, який pacman встановив і перевірив, і саме з допоміжною програмою з setuid Arch постачає сам Chromium.
Допоміжна програма без цього біта — це дефект пакування. Файл існує лише для того, щоб бути setuid root, і без цього нічого не може, а власна програма пакунка підтверджує це в повідомленні вище. І це не особливість Ditana: ядро linux-hardened від самого Arch типово вимикає непривілейовані простори назв користувача, а Arch Wiki зазначає, що застосункам на основі Chromium тоді потрібен біт setuid на chrome-sandbox. Повідомте про цей дефект, щоб наступне оновлення виправило його для всіх і хук більше не був потрібен. pacman -Si <package> показує сховище, з якого походить пакунок; пакунок, який показує pacman -Qm, натомість походить з AUR:
- Сховище Arch: звернення за адресою
https://gitlab.archlinux.org/archlinux/packaging/packages/<package>/-/issues. - AUR: коментар за адресою
https://aur.archlinux.org/packages/<package>. - Сховище Ditana: звернення в ditana-build. Ditana збирає ці пакунки з рецептів AUR і сама передає звіт туди.
Корисно згадати виправлення: встановлювати допоміжну програму з режимом 4755, як це роблять пакунки chromium і electron з Arch.
Це машинний переклад. Читачі вдосконалюють його на Weblate.