
2026/09/21 3:42
ソフトウェアサンドボックスの基礎(2025)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
このドキュメントは、本質的なパフォーマンスを維持しながら非特権ユーザーとして安全に Docker コンテナを実行することを可能にするカスタマイズされた seccomp ポリシシーの導入について記述しています。アプローチは Docker のデフォルトのプロファイルに大きく影響を受けており、ルートが必要となる syscalls や指紋採取・プロファイリングに有用な syscalls(例:
mincore, cachestat)を回避するための追加チューニングが施されています。Syscall ポリシーは、systemd のフィルターセットおよび OpenBSD の pledge モデルに着想を得た预先定義されたグループに分類されます:
- POLICY Aio: io_cancel, io_destroy, io_getevents, io_pgetevents, io_setup, io_submit
- POLICY BasicIo: read, readv, tee, vmsplice, write, writev, ioctl(一般的なストリーム/基本 I/O)
- POLICY Clock: clock_getres, clock_gettime, gettimeofday, time, times
- POLICY CompatX86: personality(古い ABI のエミュレーション), arch_prctl(x86 ファミリの ABI)
- POLICY CompatDB32: remap_file_pages;POLICY CompatSystemd: name_to_handle_at(マウント ID サポート用)
- POLICY CompatWine: modify_ldt
- POLICY Credentials: getegid, geteuid, getgid, getgroups, getresgid, getresuid, getuid
- POLICY CredentialsExtra: capget(プロセス間の関係性を照会するためのもの;主要な BPF を小さく保つため別扱い)
- POLICY CredentialsMutation: capset, setfsgid, setfsuid, setgid, setgroups, setregid, setresgid, setresuid, setreuid, setuid
- POLICY CRuntime: brk, exit, futex, mmap, getrandom(glibc の malloc 用)およびその他の C ランタイム関数
- POLICY Debug: kcmp, ptrace など。これらは既に YAMA や CAP_PERFMON などのカーネルの safeguard によって制御されています。
- POLICY Filesystem: access, open, stat, symlink, unlink および多数のファイル操作系コール
- POLICY Process: clone, execve, fork, getpid, kill, prctl, wait4 など、プロセス制御に関するオペレーション
管理者は、これらの事前に定義されたポリシーセットの中から、特定のワークロードの要件に合わせて選択し、必要に応じてそれらを組み合わせるか、独自の BPF プログラムを書くことで個別の要件を満たすことができます。この標準化された方法は、攻撃対象領域を大幅に縮小しながらも、厳格なセキュリティと現代的なアプリケーションの要求の両方をバランスよく満たします。
Text to translate:
Summary:
This document introduces customized seccomp policies enabling Docker containers to run securely as unprivileged users while retaining essential performance. The approach is heavily influenced by Docker's default profile, with additional tuning to avoid syscalls requiring root or useful for fingerprinting/profiling (e.g.,
mincore, cachestat). Syscall policies are categorized into predefined groups inspired by systemd's filter sets and OpenBSD's pledge model:
- POLICY Aio: io_cancel, io_destroy, io_getevents, io_pgetevents, io_setup, io_submit
- POLICY BasicIo: read, readv, tee, vmsplice, write, writev, ioctl (generic/stream/basic I/O)
- POLICY Clock: clock_getres, clock_gettime, gettimeofday, time, times
- POLICY CompatX86: personality (old ABI emulation), arch_prctl (x86-family ABI)
- POLICY CompatDB32: remap_file_pages; POLICY CompatSystemd: name_to_handle_at (mount-id support)
- POLICY CompatWine: modify_ldt
- POLICY Credentials: getegid, geteuid, getgid, getgroups, getresgid, getresuid, getuid
- POLICY CredentialsExtra: capget (for querying process relationships; kept separate to keep the main BPF small)
- POLICY CredentialsMutation: capset, setfsgid, setfsuid, setgid, setgroups, setregid, setresgid, setresuid, setreuid, setuid
- POLICY CRuntime: brk, exit, futex, mmap, getrandom (for glibc's malloc) and other C runtime functions
- POLICY Debug: kcmp, ptrace and similar; these are already gated by kernel safeguards such as YAMA or CAP_PERFMON.
- POLICY Filesystem: access, open, stat, symlink, unlink and many other file-operation syscalls
- POLICY Process: clone, execve, fork, getpid, kill, prctl, wait4 and similar process-control operations
Administrators can choose from these predefined policy sets tailored to specific workload needs, optionally combining them or writing custom BPF programs for unique requirements. This standardized method significantly reduces the attack surface while balancing strict security with modern application demands.
本文
Docker セカーム(seccomp)ポリシーのカスタマイズと解説
Docker のデフォルト設定に加え、以下の点を考慮したカスタマイズが施されています。
- 特権ユーザー回避: 本来
権限が必要なシステムコールを避けるため、特権を持たないユーザー向けに設計しています(完全な禁止ではありません)。これにより BPF プログラムの肥大化とオーバーヘッドを防ぎます。root - 指紋採取防止: デスクトップアプリへの悪用やプロファイリングに使われやすいシステムコール(例:
,mincore
など)を排除します。cachestat - 分類方式: systemd の seccomp や OpenBSD の pledge に着想を得た、カテゴリ別の分割を採用しています。
システムコールポリシーの定義
以下は、主要な機能領域別にシステムコールをカテゴライズしたポリシー例です。
基本入出力と互換性情報
- Aio:
,io_setup
などの IO スケジューリング関連。io_submit - BasicIo: ファイルやソケット、TTY 操作に関連する基本的な I/O。
- ※
はデバイスドライバへのアクセス手段ですが、glibc で避けて通れないため含めています。ioctl()
- ※
- Clock: タイムベースの取得(
,clock_gettime
など)。time - CompatX86: x86 ABI 互換のためのエミュレーション関連。
- CompatDB32: データベース 32 ビット互換(
)。remap_file_pages - CompatSystemd: systemd マウント ID 取得用(
)。name_to_handle_at - CompatWine: Wine 互換(
)。modify_ldt
クレデンシャルとプロセス制御
- Credentials: ユーザー/グループ ID の取得(
,getuid
など)。getgid - CredentialsExtra: プロセス間クエリに関する syscall。
- ※ BPF コード肥大化を防ぐため、必要最小限に制限しています。
- CredentialsMutation: ユーザー/グループ ID の変更(
,setuid
など)。capset
ランタイム環境と実行
- CRuntime: プログラムのロードおよび C ランタイム動作維持に必要な syscall。
- メモリ割り当て、スレッド制御、プロセス終了処理を含む。
- 例:
,mmap
,exit
(malloc 依存)など。getrandom
- Debug: デバッグや検査用途の syscall。
- ※ YAMA ptrace_scope や CAP_PERFMON で制限されているものを含みます。
- 例:
,ptrace
,perf_event_open
など。process_vm_readv
- Process: プロセス制御、実行、ネームスペース管理の必須セット。
- サンドボックス化時に常に必要となる操作(
,clone
,fork
,execve
など)。kill
- サンドボックス化時に常に必要となる操作(
ファイルシステムと I/O
- FileDescriptors: ファイル記述子の操作(
,open
,close
など)。dup - FileIo: オープン済みファイルへのアクセス。
- UNIX ソケット、Memfd 含む。例:
,read
,write
など。splice
- UNIX ソケット、Memfd 含む。例:
- Filesystem: ファイルシステムの構造操作(
,open
,mkdir
など)。unlink - FilesystemAttr: ファイル属性の変更(
,chmod
,chown
など)。utime - Sync: ストレージ同期処理(
,fsync
など)。fdatasync
ネットワークと IPC
- NetworkIo: 双方向通信ソケット(TCP/UDP)の操作。
- 例:
,connect
,send
,recv
など。setsockopt
- 例:
- NetworkServer: サーバー側の動作(
,bind
,listen
)。accept - NetworkSocketTcp: IPv4/IPv6 TCP ソケット作成。
- NetworkSocketUdp: IPv4/IPv6 UDP ソケット作成。
- NetworkSocketUnix: UNIX ドメインソケット作成。
- Ipc: システム間通信(IPC)。
- SysV IPC、POSIX メッセージキュー、メモリ共有領域など。
- 例:
,msgsnd
,shmget
など。semop
その他機能と制御
- Memlock: メモリロック制御(
,mlock
)。mlockall - IoEvent: イベントループ操作(
,epoll
,select
)。poll - IoUring: IO uring オペレーション。
- ※ 現時点では一般的な用途では安全ではないとされています。
- Pkey: メモリ保護キー制御。
- Resources: システムリソースの確認(CPU アフィンリティ、優先度など)。
- ResourcesMutation: リソース設定の変更(スケジューリング制限など)。
- Signal: プロセスシグナル処理。
- Timer: タイマー操作(
,alarm
など)。timerfd_create - Sandbox: サンボックス化自体の制御(Landlock, seccomp 自身)。
ポリシーコード例
クロック時間管理ポリシー
POLICY Clock { ALLOW { clock_getres, clock_gettime, gettimeofday, time, times } }
互換性情報(x86)
POLICY CompatX86 { ALLOW { // 古い ABI エミュレーション用 personality(persona) { persona == /*PER_LINUX=*/0 || persona == /*PER_LINUX32=*/8 || persona == /*UNAME26=*/0x0020000 || persona == /*PER_LINUX32|UNAME26=*/0x20008 || persona == 0xffffffff }, // x86 ABI 制御用(c-runtime 以外の場所で記述) arch_prctl } }
Wasm ランタイム環境維持ポリシー
POLICY CRuntime { ALLOW { brk, exit, exit_group, futex, futex_requeue, futex_wait, futex_waitv, futex_wake, get_robust_list, get_thread_area, gettid, madvise, map_shadow_stack, membarrier, mmap, mprotect, mremap, munmap, restart_syscall, rseq, sched_yield, set_robust_list, set_thread_area, set_tid_address, // glibc の malloc() は getrandom() への参照を含んでいるため getrandom } }
ネットワークソケット(TCP)
POLICY NetworkSocketTcp { ALLOW { socket(domain, type, protocol) { (type & 0x7ff) == /*SOCK_STREAM=*/1 && protocol == 0 && (domain == /*AF_INET=*/2 || domain == /*AF_INET6=*/10) } } }
プロセス制御(必須セット)
POLICY Process { ALLOW { // clone2 はどこでしょうか?ia64 のみ実装されています。 clone, clone3, execve, execveat, fork, getpgid, getpgrp, getpid, getppid, getrusage, getsid, kill, pidfd_open, pidfd_send_signal, prctl, rt_sigqueueinfo, rt_tgsigqueueinfo, setpgid, setsid, tgkill, tkill, vfork, wait4, waitid } }
リソース変更ポリシー
POLICY ResourcesMutation { ALLOW { ioprio_set, prlimit64, sched_setaffinity, sched_setattr, sched_setparam, sched_setscheduler, setpriority, setrlimit } }