Skip to content

Flatpakでファイルシステム参照を制限する方法

This content is a draft and will not be included in production builds.

サプライチェーン攻撃が非常に流行しているので、マルウェアに感染したパッケージを誤ってインストールしたとしても影響が小さくなるようになっておきたい。

特にObsidianやVSCodeはプラグインが狙われやすく、実例もあるためソースコード以外は参照できなくなりたい。

上記で挙げたツールはどちらもFlatpak版があるので、これを使ってサンドボックスに閉じ込めることはできないかと考えた。公式ドキュメントのSandbox Permissionsによると、オプションとサフィックスで色々な制御ができるらしい。

Terminal window
flatpak run --filesystem=home/src --nofilesystem=home

このようなエラーになるが、xdg-configを通せば動く。

Portal call failed: Invalid sandbox a11y own name: 'org.webkit.app-8544b3b66cebbf8d4bc96652e6245fc8bdfdf722f63bdaa4790110c167815f0e.Sandboxed.WebProcess-b719c3e8-59bd-4073-80ed-1a2351d6cb4d' doesn't match app id

これは ~/.var/app/xxx/config 以下の glib-2.0 が見れないから。なので事前に ~/.config/glib-2.0 ディレクトリを作っておいて、—filesystem=xdg-config/glib-2.0 を渡さなければならない。

[Context]
sockets=wayland;
filesystems=!host;~/src;

—persist= オプションは、永続化したいディレクトリのパスをコンテナ内のホームディレクトリから指定する。そうすると、例えば —persist=.dir とした場合、該当のディレクトリはホスト側の ~/.var/app/appid/.dir に永続化される。

しかしどうやら ~/.config などは ~/.var/app/xxx/config に吸い込まれるようだ。これは環境変数で設定されている。ただしenterしても環境変数がみれないので、—command=bash で実行しなければならない。

Terminal window
host$ flatpak run --command=bash ...
$ env | grep XDG
XDG_CONFIG_DIRS=/app/etc/xdg:/etc/xdg
XDG_BACKEND=wayland
XDG_DATA_HOME=/home/lufia/.var/app/org.gnome.gitlab.johannesjh.favagtk/data
XDG_CONFIG_HOME=/home/lufia/.var/app/org.gnome.gitlab.johannesjh.favagtk/config

https://github.com/flatpak/flatpak/issues/6053

オーバーライドを ~/.local/share/flatpak/overrides/global に書けばグローバルに設定できる。

サプライチェーン攻撃が怖いのでどうしたものかと思っていたところに、LinuxにはFlatpakというコンテナがあるので、これを使うといいんじゃないかと思った。Flatpakでvscodeをそのまま実行すると、コンテナ内のHOMEはこのようにホストのHOMEがそのまま見られる状態になっている。
>||
[📦 com.visualstudio.code accounting]$ ls /opt/
CrowdStrike/ awsvpnclient/ containerd/
[📦 com.visualstudio.code accounting]$ ls -a ~
. .aws .bash_profile .cache .identity .ivy2 .mozilla .sbt .var .yarnrc Downloads bin lib pkg
.. .bash_history .bashrc .config .identity-blob .local .pki .ssh .vscode Documents backups cfg opts src
||<
Flatpakにはファイルシステム隔離オプションがあるので、こうする。
>|sh|
$ flatpak --user override --nofilesystem=host --filesystem=home/src
||<
これでvscodeを実行したときは、許可したファイルツリーしか参照できなくなる。
>||
[📦 com.visualstudio.code accounting]$ ls /opt
ls: '/opt' にアクセスできません: そのようなファイルやディレクトリはありません
📦 com.visualstudio.code accounting]$ ls -a ~
. .. .local .var src
||<
開発環境が必要な場合は追加できる。
>|sh|
$ flatpak install org.freedesktop.Sdk.Extension.golang
[📦 com.visualstudio.code accounting]$ ls /usr/lib/sdk/golang/
CONTRIBUTING.md PATENTS SECURITY.md api codereview.cfg enable.sh lib misc share test
LICENSE README.md VERSION bin doc go.env manifest.json pkg src
||<
内部的には、Flatpakによってファイルシステムが隔離される。設定ファイルはXDG_CONFIG_HOMEなどの環境変数をFlatpakが.var/app以下に向けているので、ここに保存されるようになる。設定以外でも永続化したいディレクトリがあるなら--persist=オプションを与えるとそれも.var以下にマウントされるようになる。
今のところ、手元ではなんとなく動いてそうくらいの確認しかできていないし、vscodeの環境にシークレットを与えてしまったら破綻するけれど、これで気持ちは多少楽になった。

vscodeでは、SDKを有効にするときはFLATPAK_ENABLE_SDK_EXT=dotnet,golangとかく。そうすると初期化スクリプトにおいて /usr/lib/sdk/golang/enable.sh が実行される。

環境変数に関しては —clear-env, —env=, —unset-env= がある。必要なものだけ渡すポリシーが安全でいいと思うが、今のところ環境変数にシークレットを持っていないので何も対策していない。