「Bubblewrap」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎トラブルシューティング: ネストされた名前空間を翻訳して追加)
(情報を整理)
4行目: 4行目:
 
[[en:Bubblewrap]]
 
[[en:Bubblewrap]]
 
{{Related articles start}}
 
{{Related articles start}}
  +
{{Related|Bubblewrap/例}}
 
{{Related|セキュリティ}}
 
{{Related|セキュリティ}}
 
{{Related|Flatpak}}
 
{{Related|Flatpak}}
62行目: 63行目:
 
-rwxr-xr-x 1 nobody nobody 811752 2017-01-01 04:20 /usr/bin/bash
 
-rwxr-xr-x 1 nobody nobody 811752 2017-01-01 04:20 /usr/bin/bash
   
  +
== トラブルシューティング ==
===dhcpcd===
 
シンプルな [[dhcpcd]] のサンドボックスを作成:
 
* 利用可能なカーネル名前空間を確認:
 
$ ls /proc/self/ns
 
cgroup ipc mnt net pid uts
 
{{Note|{{Ic|user}} が存在しない場合、{{ic|1=CONFIG_USER_NS=n}} でカーネルのユーザー名前空間が無効になっているか使用が制限されています。}}
 
   
  +
=== X11 を使う ===
* ホストの {{ic|/}} ディレクトリ全体を読み書き可能でサンドボックスの {{ic|/}} にバインド。
 
* 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。
 
* 新しい [[wikipedia:Inter-process_communication|IPC]] 名前空間と[[Cgroups|コントロールグループ]]名前空間を作成。
 
* 新しい UTS 名前空間を作成して {{ic|dhcpcd}} をホストネームとして設定。
 
 
# /usr/bin/bwrap --bind / / --dev /dev --unshare-ipc --unshare-cgroup --unshare-uts --hostname dhcpcd /usr/bin/dhcpcd -q -b
 
   
===Unbound===
 
粒度の細かい複雑な [[Unbound]] のサンドボックスを作成:
 
* システムの {{ic|/usr}} ディレクトリを読み取り専用でサンドボックスの {{ic|/usr}} にバインド。
 
* システムの {{ic|/usr/lib}} ディレクトリからサンドボックスの {{ic|/lib64}} に対してシンボリックリンクを作成。
 
* システムの {{ic|/etc}} ディレクトリを読み取り専用でサンドボックスの {{ic|/etc}} にバインド。
 
* サンドボックスの中に空の {{ic|/var}} と {{ic|/run}} ディレクトリを作成。
 
* 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。
 
* 新しい IPC 名前空間と [[wikipedia:Process_identifier|PID]] 名前空間とコントロールグループ名前空間を作成。
 
* 新しい UTS 名前空間を作成して {{ic|unbound}} をホストネームとして設定。
 
 
# /usr/bin/bwrap --ro-bind /usr /usr --symlink usr/lib /lib64 --ro-bind /etc /etc --dir /var --dir /run --dev /dev --unshare-ipc --unshare-pid --unshare-cgroup --unshare-uts --hostname unbound /usr/bin/unbound -d
 
 
{{Tip|{{ic|unbound.service}} などの systemd ユニットファイルを bubblewrap する方法は[[systemd#ユニットファイルの編集]]を見てください。}}
 
 
===デスクトップ===
 
[[デスクトップエントリ]]で bubblewrap を活用:
 
* ホストの {{ic|/}} ディレクトリ全体を読み書き可能でサンドボックスの {{ic|/}} にバインド。
 
* サンドボックスの {{ic|/var}} と {{ic|/etc}} ディレクトリを読み取り専用で再バインド
 
* 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。
 
* サンドボックスの {{ic|/run}} ディレクトリに tmpfs ファイルシステムを作成。
 
* 新しいネットワーク名前空間を作成してネットワークアクセスを無効化。
 
 
[Desktop Entry]
 
Name=nano Editor
 
Exec=bwrap --bind / / --dev /dev --tmpfs /run --unshare-net st -e nano -o . %f
 
Type=Application
 
MimeType=text/plain;
 
{{Note|{{Ic|/dev/pty}} に書き込むには {{Ic|--dev /dev}} が必要です。}}
 
 
* {{Ic|mupdf.sh}} シェルラッパーを組み込んだ MuPDF のデスクトップエントリの例:
 
 
[Desktop Entry]
 
Name=MuPDF
 
Exec=mupdf.sh %f
 
Icon=application-pdf.svg
 
Type=Application
 
MimeType=application/pdf;application/x-pdf;
 
 
{{Note|{{Ic|mupdf.sh}} は PATH が通った場所に配置してください。例: {{Ic|1=PATH=$PATH:$HOME/bwrap}}。}}
 
 
===MuPDF===
 
''bwrap'' の能力と柔軟性が一番良くわかるのはシェルラッパーの中に環境を作成するときです:
 
 
* ホストの {{ic|/usr/bin}} ディレクトリを読み取り専用でサンドボックスの {{ic|/usr/bin}} にバインド。
 
* ホストの {{ic|/usr/lib}} ディレクトリを読み取り専用でサンドボックスの {{ic|/usr/lib}} にバインド。
 
* システムの {{ic|/usr/lib}} ディレクトリからサンドボックスの {{ic|/lib64}} に対してシンボリックリンクを作成。
 
* サンドボックスの {{ic|/usr/lib/gcc}} の上に [[tmpfs]] ファイルシステムを作成。
 
** 上記の設定でサンドボックスから {{ic|/usr/lib/gcc}} の中身を効率的に[[wikipedia:Blacklist_(computing)|遮蔽]]できます。
 
* 新しい tmpfs ファイルシステムをサンドボックスの {{ic|$HOME}} ディレクトリとして作成。
 
* {{Ic|.Xauthority}} ファイルと ''Documents'' ディレクトリをサンドボックスに読み取り専用としてバインド。
 
** 上記の設定で {{Ic|.Xauthority}} ファイルと ''Documents'' ディレクトリが再帰的にホワイトリストに追加されます。
 
* 新しい tmpfs ファイルシステムをサンドボックスの {{ic|/tmp}} ディレクトリとして作成。
 
* [[wikipedia:X_Window_System|X11]] ソケットをサンドボックスに読み取り専用としてバインドしてホワイトリストに追加。
 
* 実行中のカーネルによってサポートされている全ての名前空間に対してプレイベートなコンテナを複製・作成。
 
** カーネルが非特権のユーザー名前空間をサポートしてなかった場合、作成がスキップされます。
 
* ネットワークコンポーネントをプライベート名前空間に配置しない。
 
** 上記の設定で URI ハイパーリンクを辿ってネットワークにアクセスできます。
 
 
#!/bin/sh
 
#~/bwrap/mupdf.sh
 
(exec bwrap \
 
--ro-bind /usr/bin /usr/bin \
 
--ro-bind /usr/lib /usr/lib \
 
--symlink usr/lib /lib64 \
 
--tmpfs /usr/lib/gcc \
 
--tmpfs $HOME \
 
--ro-bind $HOME/.Xauthority $HOME/.Xauthority \
 
--ro-bind $HOME/Documents $HOME/Documents \
 
--tmpfs /tmp \
 
--ro-bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 \
 
--unshare-all \
 
--share-net \
 
/usr/bin/mupdf "$@")
 
 
{{Tip|既存の実行ファイルを {{ic|/usr/bin/sh}} に置き換えてシェルラッパーを実行することでサンドボックスの中身やファイルシステムのデバッグや確認ができます。}}
 
 
$ bwrap \
 
--ro-bind /usr/bin /usr/bin \
 
--ro-bind /usr/lib /usr/lib \
 
--symlink usr/lib /lib64 \
 
--tmpfs /usr/lib/gcc \
 
--tmpfs $HOME \
 
--ro-bind $HOME/.Xauthority $HOME/.Xauthority \
 
--ro-bind $HOME/Desktop $HOME/Desktop \
 
--tmpfs /tmp \
 
--ro-bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 \
 
--unshare-all \
 
--share-net \
 
/usr/bin/sh
 
bash-4.4$ ls -AF
 
.Xauthority Documents/
 
 
bubblewrap によるファイルシステムを作成するときに一番重要なルールは実行されるコマンドの順番です。上記の [https://mupdf.com/ MuPDF] の例の場合:
 
 
* tmpfs ファイルシステムを作成してから {{Ic|.Xauthority}} ファイルと ''Documents'' ディレクトリをバインドマウントした場合:
 
--tmpfs $HOME \
 
--ro-bind $HOME/.Xauthority $HOME/.Xauthority \
 
--ro-bind $HOME/Documents $HOME/Documents \
 
 
bash-4.4$ ls -a
 
. .. .Xauthority Documents
 
 
* {{Ic|.Xauthority}} をバインドマウントしてから tmpfs ファイルシステムを作成して上書きするとサンドボックスからは ''Documents'' ディレクトリだけが見えます:
 
 
--ro-bind $HOME/.Xauthority $HOME/.Xauthority \
 
--tmpfs $HOME \
 
--ro-bind $HOME/Documents $HOME/Documents \
 
 
bash-4.4$ ls -a
 
. .. Documents
 
 
===p7zip===
 
[https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-9296 既知の脆弱性] に対してパッチが適用されていないアプリケーションは特に bubblewrap を使用する価値があります:
 
 
* ホストの {{ic|/usr/bin/7za}} 実行パスを読み取り専用でサンドボックスにバインド。
 
* システムの {{ic|/usr/lib}} ディレクトリからサンドボックスの {{ic|/lib64}} に対してシンボリックリンクを作成。
 
* tmpfs オーバーレイでサンドボックス化した {{ic|/usr/lib/modules}} と {{ic|/usr/lib/systemd}} の中身をブラックリストに追加。
 
* 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。
 
* ホストの {{ic|/sandbox}} ディレクトリを読み書き可能でサンドボックスの {{ic|/sandbox}} ディレクトリにバインド。
 
** シェルラッパーから呼び出すことで ''7za'' はホストの {{ic|/sandbox}} ディレクトリとそのサブディレクトリの中でしか実行されなくなります。
 
* アプリケーションとプロセスのために新しい cgroup/IPC/ネットワーク/PID/UTS 名前空間を作成。
 
** カーネルが非特権のユーザー名前空間をサポートしていなかった場合、作成はスキップされます。
 
** 新しいネットワーク名前空間を作成することでサンドボックスからネットワークにアクセスできなくなります。
 
* {{ic|p7zip}} という[[ネットワーク設定#ホストネームの設定|ホストネーム]]をサンドボックスに追加。
 
* {{ic|XAUTHORITY}} [[環境変数]]の設定を解除して X11 の接続クッキーの場所を遮蔽。
 
** ''7za'' を動作させるのに X11 ディスプレイサーバーに接続する必要はありません。
 
* 新しいターミナルセッションを起動してキーボードの入力がサンドボックス外に流出することを防止。
 
 
#!/bin/sh
 
#~/bwrap/pz7ip.sh
 
(exec bwrap \
 
--ro-bind /usr/bin/7za /usr/bin/7za \
 
--symlink usr/lib /lib64 \
 
--tmpfs /usr/lib/modules \
 
--tmpfs /usr/lib/systemd \
 
--dev /dev \
 
--bind /sandbox /sandbox \
 
--unshare-all \
 
--hostname p7zip \
 
--unsetenv XAUTHORITY \
 
--new-session \
 
/usr/bin/7za "$@")
 
 
{{Note|サンドボックスのファイルシステムを横断・確認するには実行パスに ''/usr/bin/sh'' と ''/usr/bin/ls'' が必要です。}}
 
 
bwrap \
 
--ro-bind /usr/bin/7za /usr/bin/7za \
 
'''--ro-bind /usr/bin/ls /usr/bin/ls \'''
 
'''--ro-bind /usr/bin/sh /usr/bin/sh \'''
 
--symlink usr/lib /lib64 \
 
--tmpfs /usr/lib/modules \
 
--tmpfs /usr/lib/systemd \
 
--dev /dev \
 
--bind /sandbox /sandbox \
 
--unshare-all \
 
--hostname p7zip \
 
--unsetenv XAUTHORITY \
 
--new-session \
 
/usr/bin/sh
 
bash: no job control in this shell
 
bash-4.4$ ls -AF
 
dev/ lib64@ usr/
 
bash-4.4$ ls -l /usr/lib/modules
 
total 0
 
bash-4.4$ ls -l /usr/lib/systemd
 
total 0
 
bash-4.4$ ls -AF /dev
 
console full null ptmx@ pts/ random shm/ stderr@ stdin@ stdout@ tty urandom zero
 
bash-4.4$ ls -A /usr/bin
 
7za ls sh
 
 
===ファイルシステムの分離===
 
 
{{Warning|bubblewrap のユーザーはファイルシステムツリーを定期的に更新しなければなりません。}}
 
 
({{ic|/var}}, {{ic|/usr/bin}}, {{ic|/usr/lib}} の中身など) ファイルシステムの中身を遮蔽しながらソフトウェアのインストールをサンドボックス化したい場合、pacman で Arch のパッケージを分離したファイルシステムツリーにインストールすることができます。
 
 
pacman を使ってソフトウェアをファイルシステムツリーにインストールするには、{{Pkg|fakeroot}} と {{Pkg|fakechroot}} のインストールが必要です。
 
 
例として pacman で {{ic|xterm}} パッケージを隔離ファイルシステムツリーにインストールしたいとすると、ツリーを以下のように準備します:
 
 
$ MYPACKAGE=xterm
 
$ mkdir -p ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman
 
$ mkdir -p ~/sandboxes/${MYPACKAGE}/files/etc
 
$ cp /etc/pacman.conf ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf
 
 
{{ic|~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf}} を編集して使用する pacman の設定を調整すると良いでしょう:
 
 
* 不必要なカスタムリポジトリやホスト環境でしか必要ない {{ic|IgnorePkg}}, {{ic|IgnoreGroup}}, {{ic|NoUpgrade}}, {{ic|NoExtract}} の設定を削除。
 
* {{ic|CheckSpace}} オプションを削除して pacman がディスク容量をチェックするために root ファイルシステムを検索するときのエラーを消す。
 
 
{{ic|base}} グループと必須の fakeroot を分離ファイルシステムツリーにインストール:
 
 
$ fakechroot fakeroot pacman -Syu \
 
--root ~/sandboxes/${MYPACKAGE}/files \
 
--dbpath ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman \
 
--config ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf \
 
base fakeroot
 
 
同じオプションを使って bubblewrap を何度も呼び出すことになるので、以下のようにエイリアスを作成:
 
 
$ alias bw-install='bwrap \
 
--bind ~/sandboxes/${MYPACKAGE}/files/ / \
 
--ro-bind /etc/resolv.conf /etc/resolv.conf \
 
--tmpfs /tmp \
 
--proc /proc \
 
--dev /dev \
 
--chdir / '
 
 
[[ロケール]]を設定してください:
 
 
$ nano -w ~/sandboxes/${MYPACKAGE}/files/etc/locale.gen
 
$ bw-install locale-gen
 
 
pacman のキーリングを設定:
 
 
$ bw-install fakeroot pacman-key --init
 
$ bw-install fakeroot pacman-key --populate archlinux
 
 
以下のように {{ic|xterm}} パッケージをインストール:
 
 
$ bw-install fakeroot pacman -S ${MYPACKAGE}
 
 
pacman コマンドが失敗する場合、キーリングを生成するコマンドをもう一度実行してみてください。
 
 
これで {{ic|xterm}} を含む分離ファイルシステムツリーが作られました。{{ic|bw-install}} を使ってファイルシステムツリーをアップグレードすることができます。
 
 
bubblewrap でソフトウェアを実行することができます (上記の例では {{ic|''command''}} は {{ic|xterm}} になります):
 
 
$ bwrap \
 
--ro-bind ~/sandboxes/${MYPACKAGE}/files/ / \
 
--ro-bind /etc/resolv.conf /etc/resolv.conf \
 
--tmpfs /tmp \
 
--proc /proc \
 
--dev /dev \
 
--chdir / \
 
''command''
 
 
一部のファイルをパッケージ間で共有することもできます。既存のファイルシステムツリーのファイルのハードリンクを作成して新しいツリーで再利用することが可能です:
 
 
$ cp -al ~/sandboxes/${MYPARENTPACKAGE} ~/sandboxes/${MYPACKAGE}
 
 
{{ic|bw-install fakechroot fakeroot pacman ...}} から pacman を呼び出して通常通りにインストールを行ってください。
 
 
== トラブルシューティング ==
 
===X11 を使う===
 
 
ホストの X11 ソケットを別の X11 ソケットにバインドマウントしても上手く行かないことがあります:
 
ホストの X11 ソケットを別の X11 ソケットにバインドマウントしても上手く行かないことがあります:
 
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X8 --setenv DISPLAY :8
 
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X8 --setenv DISPLAY :8

2023年2月22日 (水) 05:54時点における版

関連記事

bubblewrapFlatpak から発展した軽量な setuid サンドボックスアプリケーションです。インストール容量が小さくリソース要件は最小限です。アプリケーションパッケージ自体は bubblewrap と呼ばれますが、実際の実行バイナリや man ページで使われている名前は bwrap(1) です。bubblewrap は将来的に Tor Browser (Linux 版) の サンドボックス機構 として使われることが期待されています。特徴として cgroup/IPC/マウント/ネットワーク/PID/ユーザー/UTS 名前空間seccomp フィルタリングをサポートしています。bubblewrap はサンドボックス内の全てのケイパビリティを破棄して子タスクが親以上の権限を得られないようにします。ファイルパスベースのブラックリストやホワイトリストは対応していません。

警告: ユーザーやログインセッションの分離とは異なり、bubblewrap はカーネルのセキュリティ脆弱性の他にウィンドウコンポジタの脆弱性の影響を受けます。信頼できないコードを bubblewrap を実行しないようにユーザーは注意する必要があります。

インストール

bubblewrap または bubblewrap-gitAURインストールしてください。

ノート:

設定

bubblewrap はコマンドラインから直接起動したり、複雑なラッパー に含まれる シェルスクリプト で呼び出すことができます。サンドボックス内の /var/etc を自動的に読み取り専用に設定する Firejail などのアプリケーションと違って、bubblewrap はそのような操作を行いません。サンドボックス化したいアプリケーションにあわせてどのような設定オプションを指定するかはユーザー次第です。setuid 特権で実行された場合でも bubblewrap は自動的にユーザー名前空間を作成しないので $HOME$USER などの環境変数を利用することが可能です。

strace をダウンロードして、サンドボックス化しようとしているプログラムがどのファイルにアクセスする必要があるかを確認することを強くお勧めします。

bubblewrap の設定マネージャー

引数を手動で設定する代わりに、設定マネージャーを使用して、単純な設定から自動的に bubblewrap を構成できます。

Bubblejail — リソースベースのパーミッションモデルを備えた bubblewrap ベースのサンドボックス (パーミッションを微調整するための GUI を提供)

https://github.com/igo95862/bubblejail || bubblejailAUR, bubblejail-gitAUR

Crabjail — Simple bubblewrap launcher

https://codeberg.org/crabjail/crabjail ||

使用例

bubblewrap の使用例については、Examples を参照してください。

また bubblewrap を一般的なアプリケーションに使用する方法を示すさまざまなプロジェクトがあります。

No-op

以下のように何もせずに bubblewrap を呼び出すことができます:

$ bwrap --dev-bind / / bash

サンドボックスの外のように振る舞う bash プロセスが生成されます。サンドボックス化したプログラムがおかしくなってしまう場合、上記の no-op から段々と設定をセキュアにしていくことができます。

ノート: 所有者またはグループが現在のものでない場合、この操作はすべての所有者とグループを nobody に変更します。これは、sudo のようなプログラムを実行すると正しく動作しないことを示唆しています。

Bash

シンプルな Bash のサンドボックスを作成:

  • 利用可能なカーネル名前空間を確認:
$ ls /proc/self/ns 
cgroup  ipc  mnt  net  pid  user uts
ノート: user が存在する場合、CONFIG_USER_NS=y によってカーネルのユーザー名前空間のサポートが有効になっています。
  • ホストの / ディレクトリ全体を読み取り専用としてサンドボックスの / にバインド。
  • 新しいユーザー名前空間を作成してユーザー ID256 に、グループ ID512 に設定。
$ bwrap --ro-bind / / --unshare-user --uid 256 --gid 512 bash
bash-4.4$ id
uid=256 gid=512 groups=512,65534(nobody)
bash-4.4$ ls -l /usr/bin/bash
-rwxr-xr-x 1 nobody nobody 811752 2017-01-01 04:20 /usr/bin/bash

トラブルシューティング

X11 を使う

ホストの X11 ソケットを別の X11 ソケットにバインドマウントしても上手く行かないことがあります:

--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X8 --setenv DISPLAY :8

ホストの X11 ソケットをサンドボックス内の同じソケットにバインドマウントすることで解決します:

--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 --setenv DISPLAY :0

X11 のサンドボックス化

bwrap はアプリケーションをサンドボックス化するための素晴らしい隔離機能を備えていますが、X11 ソケットにアクセスできてしまえば簡単に離脱することができます。X11 にはアプリケーション間の分離が存在しないためセキュリティ的に危険です。サンドボックスから X サーバーにアクセスできないようにする方法として Wayland コンポジタに切り替える方法があります。

また、xpraxephyr を使って新しい X11 環境で実行させるという方法もあります。この方法で bwrap を使うこともできます。

X11 の隔離化をテストするには、xinput test <id> を実行してください (<id> は xinput list で確認できるキーボード ID に置き換えてください)。X11 が分離化されていない場合、X11 にアクセスできるアプリケーションはキーロガーのように他のアプリケーションのキーボード入力を盗聴することができてしまいます。

ラッピングしたアプリケーションから URL を開く

ラッピングした IRC やメールクライアントで URL を開くと、起動するブラウザプロセスも同じサンドボックス内で動作します。アプリケーションの分離が強固な場合、うまく機能しないことがあります。Firejail では ラッピングしたアプリケーションにブラウザと同じ権限を与える ことで解決しますが、パーミッションがゆるくなってしまいます。

開いた URL をサンドボックスの外と通信するほうが良手です。以下のように snapd-xdg-open を使ってください:

  1. snapd-xdg-open-gitAUR をインストール
  2. bwrap コマンドラインで以下を追加:
$ bwrap ... \
  --ro-bind /run/user/$UID/bus /run/user/$UID/bus \
  --ro-bind /usr/lib/snapd-xdg-open/xdg-open /usr/bin/xdg-open \
  --ro-bind /usr/lib/snapd-xdg-open/xdg-open /usr/bin/chromium \
  ...

/usr/bin/chromium のバインドは Mozilla Thunderbird など XDG に準拠していないプログラムでのみ必要です。

新規セッション

TIOCSTI にはサンドボックスから脱出できるセキュリティ問題が存在します (CVE-2017-5226)。この問題に対応するために、bubblewrap には setsid() を呼び出す新しいオプション '--new-session' が追加されています。ただしこのオプションはときとして扱いにくい挙動上の問題を起こすことがあります。例えば bwrap コマンドでシェルのジョブ制御が機能しなくなります。

可能であればオプションを使用することが推奨されていますが、そうでない場合は別の方法で問題を解決することが推奨されます。例えば flatpak は SECCOMP を使用します: https://github.com/flatpak/flatpak/commit/902fb713990a8f968ea4350c7c2a27ff46f1a6c4

ネストされた名前空間

Chromium などの特定のアプリケーションは、suid ヘルパーファイルを使って独自のサンドボックス環境をすでに実装しています。この仕組みは、bubblewrap container 内で実行されるとブロックされます。

1つの解決策は、アプリケーションに bubblewrap によって作成された名前空間を使用させることです。これは zypakAUR によって実現できます。これは flatpak でも使われていて、追加の名前空間の中で電子ベースのアプリを実行します。Chromium/Electron で zypak を使用する方法を示すサンプルコードは [1] で見ることができます。

参照