Secure computing mode

seccomp
作者 Andrea Arcangeli
初版 2005年3月8日(21年前) (2005-03-08)
プログラミング
言語
C言語
対応OS Linux
種別 サンドボックス
ライセンス GPL
公式サイト code.google.com/archive/p/seccompsandbox/wikis/overview.wiki
テンプレートを表示

secure computing mode (略 seccomp) は、Linuxカーネル における コンピュータセキュリティ機構の一つである。プロセスがカーネルに対して発行できるシステムコールを制限することで、そのプロセスの攻撃対象領域を縮小する。

解説

seccomp は、プロセスが危険なシステムコールを呼び出せない「安全」な状態に不可逆的に移行させる。ただし、exit(), sigreturn(), 既に開いているファイルディスクリプタに対する read()/ write() を除く。

それ以外のシステムコールが実行されると、カーネルはそのイベントをログに記録するだけでシステムコールを実行しないか、SIGKILL もしくは SIGSYS でプロセスを強制終了させる。

すなわち、seccomp はシステムリソースの仮想化を行うのではなく、プロセスをリソースから完全に独立させる。

seccomp は 引数に PR_SET_SECCOMP を指定した prctl(2) システムコールによって実現される。または Linuxカーネル 3.17 以降 では、seccomp(2) システムコール が使われる。

動作モード

seccomp には2つの動作モードがある。

フィルタモードを使用するには、呼び出しスレッドがそのユーザー名前空間で CAP_SYS_ADMIN ケーパビリティを持つか、あるいは事前に prctl(PR_SET_NO_NEW_PRIVS, 1) を呼び出して no_new_privs ビットをセットしておく必要がある。これは、非特権プロセスが悪意あるフィルタを適用した上で set-user-ID プログラム等を execve(2) で起動し、その特権プログラムを危険な動作に誘導することを防ぐためである。

フィルタの返り値

seccomp フィルタは32ビット値を返し、上位16ビットが「アクション」を表す。複数のフィルタが存在する場合、評価結果として最も優先度の高いアクションが採用される。優先度の高い順に、主なアクションは次のとおり。

seccomp-bpf

seccomp-bpf は seccomp の拡張機能であり、Berkeley Packet Filter (BPF) ルールを用いて実装された設定可能なポリシーによって、システムコールのフィルタリングを可能にする。これは、もはや Linux ではサポートされなくなった古い systrace と同等の機能を、より高い柔軟性とパフォーマンスで実現する。

これは以下のようなソフトウェア等で利用されている:

ユーザー空間通知 (seccomp user notification)

Linux 5.0 で SECCOMP_RET_USER_NOTIF アクションおよび SECCOMP_FILTER_FLAG_NEW_LISTENER フラグが追加された。これにより、フィルタが対象のシステムコールを検知した際に、そのシステムコールを別のユーザー空間プロセス(監視プロセス)に転送し、監視プロセスがどう扱うかを決定できるようになった。

仕組みとしては、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)を返すことができる。

この機能は、非特権コンテナにおいて従来は失敗していた mknod(2) や mount(2) などのシステムコールを、コンテナマネージャがユーザー空間でエミュレートして安全に実行可能にする目的で LXD/LXC に統合された。アイデアは2017年初頭に LXD チームで具体化され、最初の公開発表は Stéphane Graber により Linux Plumbers Conference 2017 で行われた。カーネルへの実装の取り込みは Tycho Andersen によって行われた。

なお、SECCOMP_USER_NOTIF_FLAG_CONTINUE フラグを用いてシステムコールの続行を許可することもできるが、ポインタ引数を介した TOCTOU(time-of-check-time-of-use)攻撃のリスクがあるため、ユーザー空間でのセキュリティポリシー実装には利用すべきではない。関連して、後続のカーネルでは pidfd_getfd(2)(他タスクのファイルディスクリプタ取得)や、対象タスクへファイルディスクリプタを注入する SECCOMP_IOCTL_NOTIF_ADDFD(Linux 5.14)といった拡張も追加されている。

/proc インターフェースと監査ログ

Linux 4.14 以降、/proc/sys/kernel/seccomp ディレクトリ以下に追加情報・設定用ファイルが提供される。

また Linux 4.14 以降、カーネルは seccomp フィルタが返したアクションを監査ログ(audit log)に記録する機能を備える。記録の可否はアクションの種類、actions_logged への登録有無、カーネル監査の有効化(例: ブートオプション audit=1)に基づいて決定される。なお、プロセスの seccomp モードは /proc/[pid]/status の Seccomp フィールドで確認できる。

歴史

seccomp は、2005年1月に Andrea Arcangeli によって最初のバージョンが開発された。これは、パブリックグリッド・コンピューティングで使用するために開発され、当時は信頼されていない compute-bound なプログラムを安全に実行する手段として意図されていた。

seccomp は、2005年3月8日にリリースされたカーネルバージョン 2.6.12 の Linuxカーネルメインライン にマージされた。

その後、seccomp は段階的に機能拡張された。主な変遷は次のとおり。

2009年2月時点では、Arcangeli の CPUShare がしばらくの間 seccomp を使う既知の唯一のソフトウェアであった[訳語疑問点]。同月、Linus Torvalds は seccomp が実際に何かによって利用されているかどうかについて疑問を表明している。しかし Google のエンジニアは、Google が Google Chrome ウェブブラウザをサンドボックス化するために seccomp の利用を検討していると回答した。

seccomp または seccomp-bpf を利用するソフトウェア

脚注

[脚注の使い方]

注釈

  1. ↑ Linux ではもはやサポートされなくなった

出典

  1. 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日閲覧。
  2. ↑ Corbet, Jonathan (2015年9月2日). “A seccomp overview”. 2023年3月29日閲覧。
  3. ↑ “Documentation/prctl/seccomp_filter.txt”. 2023年3月29日閲覧。
  4. 1 2 “Linux kernel 3.17, Section 11. Security”. kernelnewbies.org (2014年10月5日). 2026年6月16日閲覧。
  5. ↑ “seccomp: add "seccomp" syscall”. kernel/git/torvalds/linux.git - Linux kernel source tree. kernel.org (2014年6月25日). 2023年3月29日閲覧。
  6. ↑ Corbet, Jonathan (2012年1月11日). “Yet another new approach to seccomp”. lwn. 2023年3月31日閲覧。
  7. 1 2 “Openssh 6.0 release notes”. 2023年4月2日閲覧。
  8. ↑ Tinnes, Julien (2012年11月19日). “A safer playground for your Linux and Chrome OS renderers”. The Chromium Blog. 2023年3月31日閲覧。
  9. 1 2 3 4 5 Brauner, Christian (2020年7月23日). “Seccomp Notify – New Frontiers in Unprivileged Container Development”. 2026年6月16日閲覧。
  10. ↑ “[PATCH seccomp: secure computing support]”. Linux kernel history. Kernel.org git repositories (2005年3月8日). 2013年4月15日時点のオリジナルよりアーカイブ。2013年8月2日閲覧。
  11. ↑ 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日閲覧。
  12. ↑ Torvalds, Linus (2009年2月28日). “Re: [PATCH 2/2 x86-64: seccomp: fix 32/64 syscall hole]”. Linux Kernel Mailing List. 2013年8月2日閲覧。
  13. ↑ Gutschke, Markus (2009年5月6日). “Re: [PATCH 2/2 x86-64: seccomp: fix 32/64 syscall hole]”. 2013年8月2日閲覧。
  14. ↑ Gutschke, Markus (2009年5月6日). “Re: [PATCH 2/2 x86-64: seccomp: fix 32/64 syscall hole]”. Linux Kernel Mailing List. 2013年8月2日閲覧。
  15. ↑ “Seccomp filter in Android O”. Android Developers Blog. 2023年4月1日閲覧。
  16. ↑ “systemd.exec — Execution environment configuration”. freedesktop.org. 2023年4月1日閲覧。
  17. ↑ Otubo, Eduardo (2017年9月15日). “QEMU Sandboxing new model pull request”. qemu-devel mailing list archive. 2023年4月1日閲覧。
  18. ↑ “Seccomp security profiles for Docker”. Docker Docs. 2026年6月16日閲覧。
  19. ↑ “Firejail” (英語). Firejail. 2023年4月6日閲覧。
  20. ↑ Evans, Chris (2012年7月4日). “Chrome 20 on Linux and Flash sandboxing”. 2023年4月3日閲覧。
  21. ↑ “UPDATE: Adobe Flash Player end of support on December 31, 2020”. Microsoft Learn. 2026年6月16日閲覧。
  22. ↑ Tinnes, Julien (2012年9月6日). “Introducing Chrome's next-generation Linux sandbox”. cr0 blog. 2023年4月2日閲覧。
  23. ↑ “Snap security policy”. 2017年2月4日時点のオリジナルよりアーカイブ。2023年4月2日閲覧。
  24. ↑ Evans, Chris (2012年4月9日). “vsftpd-3.0.0 and seccomp filter sandboxing is here!”. 2023年4月3日閲覧。
  25. ↑ “MBOX”. 2014年5月20日閲覧。
  26. ↑ “LXD an "hypervisor" for containers (based on liblxc)” (2014年11月4日). 2014年11月8日閲覧。
  27. ↑ “Security/Sandbox/Seccomp”. Mozilla Wiki. 2023年4月4日閲覧。
  28. ↑ “Tor ChangeLog”. 2023年4月4日閲覧。
  29. ↑ “Lepton image compression: saving 22% losslessly from images at 15MB/s”. Dropbox Tech Blog. 2023年4月3日閲覧。
  30. ↑ “Kafel: A language and library for specifying syscall filtering policies”. 2023年4月1日閲覧。
  31. ↑ “Subgraph OS”. Subgraph. 2023年4月2日閲覧。
  32. ↑ “The flatpak security model – part 1: The basics”. 2017年1月21日閲覧。
  33. ↑ “bubblewrap”. 2018年4月14日閲覧。
  34. ↑ “Chromium OS Sandboxing - the Chromium Projects”. 2023年4月1日閲覧。
  35. ↑ “Minijail [LWN.net]”. lwn.net. 2017年4月11日閲覧。
  36. ↑ “core/trace/use_seccomp”. dev.exherbo.org. 2021年5月31日閲覧。
  37. ↑ “File application Sandboxing”. GitHub. 2023年4月7日閲覧。
  38. ↑ “Zathura seccomp implementation”. 2023年4月8日閲覧。
  39. ↑ “Gnome tracker seccomp implementation”. 2023年4月8日閲覧。