Secure computing mode
| 作者 | Andrea Arcangeli |
|---|---|
| 初版 | 2005年3月8日 |
| プログラミング 言語 | C言語 |
| 対応OS | Linux |
| 種別 | サンドボックス |
| ライセンス | GPL |
| 公式サイト |
code |
secure computing mode (略 seccomp) は、Linuxカーネル における コンピュータセキュリティ機構の一つである。プロセスがカーネルに対して発行できるシステムコールを制限することで、そのプロセスの攻撃対象領域を縮小する[1]。
解説
[編集]seccomp は、プロセスが危険なシステムコールを呼び出せない「安全」な状態に不可逆的に移行させる。ただし、exit(), sigreturn(), 既に開いているファイルディスクリプタに対する read()/ write() を除く。
それ以外のシステムコールが実行されると、カーネルはそのイベントをログに記録するだけでシステムコールを実行しないか、SIGKILL もしくは SIGSYS [2] [3] でプロセスを強制終了させる。
すなわち、seccomp はシステムリソースの仮想化を行うのではなく、プロセスをリソースから完全に独立させる。
seccomp は 引数に PR_SET_SECCOMP を指定した prctl(2) システムコールによって実現される。または Linuxカーネル 3.17 以降 [4] では、seccomp(2) システムコール [5] が使われる。
動作モード
[編集]seccomp には2つの動作モードがある[1]。
- SECCOMP_MODE_STRICT(厳格モード)— 呼び出しスレッドが許可されるシステムコールは read(2)、write(2)、_exit(2)(exit_group(2) は不可)、sigreturn(2) の4つのみである。それ以外のシステムコールを呼び出すと、呼び出しスレッドが終了し、スレッドが1つしかない場合は SIGKILL シグナルでプロセス全体が終了する。このモードは、パイプやソケットから読み込んだ信頼できないバイトコードを実行する必要のある数値計算(number-crunching)アプリケーション向けに有用である[1]。
- SECCOMP_MODE_FILTER(フィルタモード)— 許可されるシステムコールを BPF プログラム(struct sock_fprog)で定義する。任意のシステムコールおよびその引数に基づくフィルタリングが可能である[1]。
フィルタモードを使用するには、呼び出しスレッドがそのユーザー名前空間で CAP_SYS_ADMIN ケーパビリティを持つか、あるいは事前に prctl(PR_SET_NO_NEW_PRIVS, 1) を呼び出して no_new_privs ビットをセットしておく必要がある。これは、非特権プロセスが悪意あるフィルタを適用した上で set-user-ID プログラム等を execve(2) で起動し、その特権プログラムを危険な動作に誘導することを防ぐためである[1]。
フィルタの返り値
[編集]seccomp フィルタは32ビット値を返し、上位16ビットが「アクション」を表す。複数のフィルタが存在する場合、評価結果として最も優先度の高いアクションが採用される。優先度の高い順に、主なアクションは次のとおり[1]。
- SECCOMP_RET_KILL_PROCESS(Linux 4.14 以降)— プロセス全体を即座に終了させる(コアダンプ付き)。スレッドグループ内の全スレッドが終了する。
- SECCOMP_RET_KILL_THREAD(旧 SECCOMP_RET_KILL)— 呼び出しスレッドのみを終了させる。同一スレッドグループの他スレッドは実行を継続する。
- SECCOMP_RET_TRAP — 呼び出しスレッドに SIGSYS シグナルを送る(システムコールは実行されない)。
- SECCOMP_RET_ERRNO — システムコールを実行せず、指定の errno 値をユーザー空間に返す。
- SECCOMP_RET_USER_NOTIF(Linux 5.0 以降)— システムコールをユーザー空間の監視プロセスに転送する(後述)。
- SECCOMP_RET_TRACE — システムコール実行前に ptrace(2) ベースのトレーサに通知する。
- SECCOMP_RET_LOG(Linux 4.14 以降)— アクションをログに記録した上でシステムコールを実行する。
- SECCOMP_RET_ALLOW — システムコールを実行する。
seccomp-bpf
[編集]seccomp-bpf は seccomp の拡張機能であり[6]、Berkeley Packet Filter (BPF) ルールを用いて実装された設定可能なポリシーによって、システムコールのフィルタリングを可能にする。これは、もはや Linux ではサポートされなくなった古い systrace[注釈 1] と同等の機能を、より高い柔軟性とパフォーマンスで実現する。
これは以下のようなソフトウェア等で利用されている:
ユーザー空間通知 (seccomp user notification)
[編集]Linux 5.0 で SECCOMP_RET_USER_NOTIF アクションおよび SECCOMP_FILTER_FLAG_NEW_LISTENER フラグが追加された[1]。これにより、フィルタが対象のシステムコールを検知した際に、そのシステムコールを別のユーザー空間プロセス(監視プロセス)に転送し、監視プロセスがどう扱うかを決定できるようになった。
仕組みとしては、SECCOMP_FILTER_FLAG_NEW_LISTENER フラグ付きでフィルタをインストールするとカーネルが通知用ファイルディスクリプタ(seccomp notify fd)を返す。このファイルディスクリプタをより特権の高いプロセス(例: コンテナマネージャ)に引き渡すことで、そのプロセスが epoll(7) 等で対象タスクのシステムコールを待ち受け、SECCOMP_IOCTL_NOTIF_RECV で引数(struct seccomp_notif)を読み取り、SECCOMP_IOCTL_NOTIF_SEND で応答(struct seccomp_notif_resp)を返すことができる[9]。
この機能は、非特権コンテナにおいて従来は失敗していた mknod(2) や mount(2) などのシステムコールを、コンテナマネージャがユーザー空間でエミュレートして安全に実行可能にする目的で LXD/LXC に統合された。アイデアは2017年初頭に LXD チームで具体化され、最初の公開発表は Stéphane Graber により Linux Plumbers Conference 2017 で行われた。カーネルへの実装の取り込みは Tycho Andersen によって行われた[9]。
なお、SECCOMP_USER_NOTIF_FLAG_CONTINUE フラグを用いてシステムコールの続行を許可することもできるが、ポインタ引数を介した TOCTOU(time-of-check-time-of-use)攻撃のリスクがあるため、ユーザー空間でのセキュリティポリシー実装には利用すべきではない[9]。関連して、後続のカーネルでは pidfd_getfd(2)(他タスクのファイルディスクリプタ取得)や、対象タスクへファイルディスクリプタを注入する SECCOMP_IOCTL_NOTIF_ADDFD(Linux 5.14)といった拡張も追加されている[9]。
/proc インターフェースと監査ログ
[編集]Linux 4.14 以降、/proc/sys/kernel/seccomp ディレクトリ以下に追加情報・設定用ファイルが提供される[1]。
- actions_avail — カーネルがサポートする seccomp フィルタ返り値アクションの一覧(読み取り専用、優先度の高い順に並ぶ)。
- actions_logged — ログ記録を許可するアクションの一覧(読み書き可能)。
また Linux 4.14 以降、カーネルは seccomp フィルタが返したアクションを監査ログ(audit log)に記録する機能を備える。記録の可否はアクションの種類、actions_logged への登録有無、カーネル監査の有効化(例: ブートオプション audit=1)に基づいて決定される[1]。なお、プロセスの seccomp モードは /proc/[pid]/status の Seccomp フィールドで確認できる[1]。
歴史
[編集]seccomp は、2005年1月に Andrea Arcangeli によって最初のバージョンが開発された。これは、パブリックグリッド・コンピューティングで使用するために開発され、当時は信頼されていない compute-bound なプログラムを安全に実行する手段として意図されていた。
seccomp は、2005年3月8日にリリースされたカーネルバージョン 2.6.12 の Linuxカーネルメインライン にマージされた[10]。
その後、seccomp は段階的に機能拡張された。主な変遷は次のとおり。
- Linux 3.5(2012年)— seccomp-bpf(フィルタモード)が x86-64・i386・x32 でサポート開始[1]。
- Linux 3.8(2013年)— ARM・s390 でのアーキテクチャサポート追加[1]。
- Linux 3.17(2014年)— 専用の seccomp(2) システムコールが追加され(従来は prctl(2) 経由のみ)、あわせて呼び出しプロセスの全スレッドへ同一フィルタを同期する SECCOMP_FILTER_FLAG_TSYNC が実装された[4]。
- Linux 4.14(2017年)— SECCOMP_RET_KILL_PROCESS、SECCOMP_RET_LOG、/proc/sys/kernel/seccomp インターフェースおよび監査ログ機能が追加[1]。
- Linux 5.0(2019年)— ユーザー空間通知(SECCOMP_RET_USER_NOTIF)が追加[1]。
2009年2月時点では、Arcangeli の CPUShare がしばらくの間 seccomp を使う既知の唯一のソフトウェアであった[訳語疑問点][11]。同月、Linus Torvalds は seccomp が実際に何かによって利用されているかどうかについて疑問を表明している[12]。しかし Google のエンジニアは、Google が Google Chrome ウェブブラウザをサンドボックス化するために seccomp の利用を検討していると回答した[13][14]。
seccomp または seccomp-bpf を利用するソフトウェア
[編集]- Android は、Android 8.0 Oreo 以降において、zygote で seccomp-bpf フィルタを利用する[15]。
- systemd のサンドボックスオプションは、seccomp に基づいている[16]。
- QEMU (Quick EMUlator) は、KVM と組み合わせた仮想化のコアコンポーネントにおいて、
--sandboxパラメータで seccomp を利用する[17]。 - Docker は、隔離されたコンテナ内部でアプリケーションを実行できるようにするソフトウェアである。Docker は
--security-optパラメータを利用して、seccomp プロファイルをコンテナに関連付け可能である[18]。 - Firejail はオープンソースの Linux サンドボックスプログラムである。Firejail は、Linux 名前空間、seccomp およびその他のカーネルレベルのセキュリティ機能を、Linux アプリケーションや Wine アプリケーションのサンドボックス化のために利用する[19]。
- Chrome はバージョン 20 の時点で、seccomp-bpf を Adobe Flash Player のサンドボックス化に利用していた[20]。ただし Adobe Flash Player は2017年7月の予告を経て2020年12月31日にサポート終了(EOL)を迎えており、現在この用途は歴史的なものである[21]。
- Chrome はバージョン 23 の時点で、レンダラーのサンドボックス化に seccomp-bpf を利用している[22]。
- Snap はアプリケーションサンドボックスの形状を指定する。そのために snapd が seccomp, AppArmor、その他のセキュリティ構造に変換するインターフェイスを利用する[訳語疑問点][23]。
- vsftpd はバージョン 3.0.0 の時点で、seccomp-bpf サンドボックスを利用している[24]。
- OpenSSH はバージョン 6.0 以降で、seccomp-bpf をサポートしている[7]。
- Mbox は seccomp-bpf とともに ptrace を使う。これにより、ptrace 単体よりも少ないオーバーヘッドで安全なサンドボックスを作成する[25]。
- LXD はコンテナ用の Canonical/Linux Containers のシステムコンテナマネージャである[26]。LXD/LXC は seccomp および seccomp ユーザー空間通知を利用する[9]。
- Firefox は seccomp-bpf を利用している。なお Firefox OS も seccomp-bpf を利用していたが、同プロジェクトは2016年に開発終了している[27]。
- Tor は、バージョン 0.2.5.1-alpha 以降で、seccomp をサポートしている[28]。
- Dropbox が開発した JPEG 画像を圧縮するツール Lepton は seccomp を利用している[29]。
- Kafel は、可読なポリシー[訳語疑問点]を seccomp-bpf のバイトコードに変換する構成言語[訳語疑問点]である[30]。
- Subgraph OS は seccomp-bpf を利用している[31]。
- Flatpak は seccomp を利用してプロセス分離を行う[32]。
- Bubblewrap は Flatpak から派生した軽量サンドボックスアプリケーションである[33]。
- minijail はプロセス分離のために seccomp を利用する[34][35]。
- SydBox は、ptrace サンドボックスのランタイムとセキュリティを向上させるために seccomp-bpf を利用する。これは Exherbo Linux ディストリビューションにおいて、パッケージビルドをサンドボックス化するのに使われる[36]。
- File(ファイルタイプを判定する Unix プログラム)は、seccomp を利用してランタイム環境を制限する[37]。
- Zathura(最小限のドキュメントビューワ)は、seccomp フィルタを利用して異なるサンドボックスモードを実装している[38]。
- GNOME Tracker(GNOME デスクトップ環境用のインデックス・プレビューアプリケーション)は、seccomp を利用してメディアファイルの解析脆弱性が自動的に悪用されることを防止する[39]。
脚注
[編集]注釈
[編集]出典
[編集]- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 “seccomp(2) — Linux manual page”. Linux man-pages 6.18. 2026年6月16日閲覧。
- ↑ Corbet, Jonathan (2015年9月2日). “A seccomp overview”. 2023年3月29日閲覧。
- ↑ “Documentation/prctl/seccomp_filter.txt”. 2023年3月29日閲覧。
- 1 2 “Linux kernel 3.17, Section 11. Security”. kernelnewbies.org (2014年10月5日). 2026年6月16日閲覧。
- ↑ “seccomp: add "seccomp" syscall”. kernel/git/torvalds/linux.git - Linux kernel source tree. kernel.org (2014年6月25日). 2023年3月29日閲覧。
- ↑ Corbet, Jonathan (2012年1月11日). “Yet another new approach to seccomp”. lwn. 2023年3月31日閲覧。
- 1 2 “Openssh 6.0 release notes”. 2023年4月2日閲覧。
- ↑ Tinnes, Julien (2012年11月19日). “A safer playground for your Linux and Chrome OS renderers”. The Chromium Blog. 2023年3月31日閲覧。
- 1 2 3 4 5 Brauner, Christian (2020年7月23日). “Seccomp Notify – New Frontiers in Unprivileged Container Development”. 2026年6月16日閲覧。
- ↑ “[PATCH seccomp: secure computing support]”. Linux kernel history. Kernel.org git repositories (2005年3月8日). 2013年4月15日時点のオリジナルよりアーカイブ。2013年8月2日閲覧。
- ↑ van de Ven, Arjan (2009年2月28日). “Re: [stable [PATCH 2/2] x86-64: seccomp: fix 32/64 syscall hole]”. Linux Kernel Mailing List. 2023年4月6日閲覧。
- ↑ Torvalds, Linus (2009年2月28日). “Re: [PATCH 2/2 x86-64: seccomp: fix 32/64 syscall hole]”. Linux Kernel Mailing List. 2013年8月2日閲覧。
- ↑ Gutschke, Markus (2009年5月6日). “Re: [PATCH 2/2 x86-64: seccomp: fix 32/64 syscall hole]”. 2013年8月2日閲覧。
- ↑ Gutschke, Markus (2009年5月6日). “Re: [PATCH 2/2 x86-64: seccomp: fix 32/64 syscall hole]”. Linux Kernel Mailing List. 2013年8月2日閲覧。
- ↑ “Seccomp filter in Android O”. Android Developers Blog. 2023年4月1日閲覧。
- ↑ “systemd.exec — Execution environment configuration”. freedesktop.org. 2023年4月1日閲覧。
- ↑ Otubo, Eduardo (2017年9月15日). “QEMU Sandboxing new model pull request”. qemu-devel mailing list archive. 2023年4月1日閲覧。
- ↑ “Seccomp security profiles for Docker”. Docker Docs. 2026年6月16日閲覧。
- ↑ “Firejail” (英語). Firejail. 2023年4月6日閲覧。
- ↑ Evans, Chris (2012年7月4日). “Chrome 20 on Linux and Flash sandboxing”. 2023年4月3日閲覧。
- ↑ “UPDATE: Adobe Flash Player end of support on December 31, 2020”. Microsoft Learn. 2026年6月16日閲覧。
- ↑ Tinnes, Julien (2012年9月6日). “Introducing Chrome's next-generation Linux sandbox”. cr0 blog. 2023年4月2日閲覧。
- ↑ “Snap security policy”. 2017年2月4日時点のオリジナルよりアーカイブ。2023年4月2日閲覧。
- ↑ Evans, Chris (2012年4月9日). “vsftpd-3.0.0 and seccomp filter sandboxing is here!”. 2023年4月3日閲覧。
- ↑ “MBOX”. 2014年5月20日閲覧。
- ↑ “LXD an "hypervisor" for containers (based on liblxc)” (2014年11月4日). 2014年11月8日閲覧。
- ↑ “Security/Sandbox/Seccomp”. Mozilla Wiki. 2023年4月4日閲覧。
- ↑ “Tor ChangeLog”. 2023年4月4日閲覧。
- ↑ “Lepton image compression: saving 22% losslessly from images at 15MB/s”. Dropbox Tech Blog. 2023年4月3日閲覧。
- ↑ “Kafel: A language and library for specifying syscall filtering policies”. 2023年4月1日閲覧。
- ↑ “Subgraph OS”. Subgraph. 2023年4月2日閲覧。
- ↑ “The flatpak security model – part 1: The basics”. 2017年1月21日閲覧。
- ↑ “bubblewrap”. 2018年4月14日閲覧。
- ↑ “Chromium OS Sandboxing - the Chromium Projects”. 2023年4月1日閲覧。
- ↑ “Minijail [LWN.net]”. lwn.net. 2017年4月11日閲覧。
- ↑ “core/trace/use_seccomp”. dev.exherbo.org. 2021年5月31日閲覧。
- ↑ “File application Sandboxing”. GitHub. 2023年4月7日閲覧。
- ↑ “Zathura seccomp implementation”. 2023年4月8日閲覧。
- ↑ “Gnome tracker seccomp implementation”. 2023年4月8日閲覧。