bubblewrap

提供: ArchWiki
2023年2月22日 (水) 05:54時点におけるKgx (トーク | 投稿記録)による版 (情報を整理)
ナビゲーションに移動 検索に移動

関連記事

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] で見ることができます。

参照