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つの動作モードがある。

SECCOMP_MODE_STRICT(厳格モード)— 呼び出しスレッドが許可されるシステムコールは 、、( は不可)、 の4つのみである。それ以外のシステムコールを呼び出すと、呼び出しスレッドが終了し、スレッドが1つしかない場合は SIGKILL シグナルでプロセス全体が終了する。このモードは、パイプやソケットから読み込んだ信頼できないバイトコードを実行する必要のある数値計算(number-crunching)アプリケーション向けに有用である。 SECCOMP_MODE_FILTER(フィルタモード)— 許可されるシステムコールを BPF プログラム()で定義する。任意のシステムコールおよびその引数に基づくフィルタリングが可能である。

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

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

(Linux 4.14 以降)— プロセス全体を即座に終了させる(コアダンプ付き)。スレッドグループ内の全スレッドが終了する。 (旧 )— 呼び出しスレッドのみを終了させる。同一スレッドグループの他スレッドは実行を継続する。 — 呼び出しスレッドに SIGSYS シグナルを送る(システムコールは実行されない)。 — システムコールを実行せず、指定の errno 値をユーザー空間に返す。 (Linux 5.0 以降)— システムコールをユーザー空間の監視プロセスに転送する(後述)。 — システムコール実行前に ベースのトレーサに通知する。 (Linux 4.14 以降)— アクションをログに記録した上でシステムコールを実行する。 — システムコールを実行する。

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

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

Google Chrome/Chromium ウェブブラウザ (ChromeOS および Linux)

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

仕組みとしては、 フラグ付きでフィルタをインストールするとカーネルが通知用ファイルディスクリプタ(seccomp notify fd)を返す。このファイルディスクリプタをより特権の高いプロセス(例: コンテナマネージャ)に引き渡すことで、そのプロセスが 等で対象タスクのシステムコールを待ち受け、 で引数()を読み取り、 で応答()を返すことができる。

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

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

/proc インターフェースと監査ログ Linux 4.14 以降、 ディレクトリ以下に追加情報・設定用ファイルが提供される。

— カーネルがサポートする seccomp フィルタ返り値アクションの一覧(読み取り専用、優先度の高い順に並ぶ)。 — ログ記録を許可するアクションの一覧(読み書き可能)。

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

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

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

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

Linux 3.5(2012年)— seccomp-bpf(フィルタモード)が x86-64・i386・x32 でサポート開始。 Linux 3.8(2013年)— ARM・s390 でのアーキテクチャサポート追加。 Linux 3.17(2014年)— 専用の システムコールが追加され(従来は 経由のみ)、あわせて呼び出しプロセスの全スレッドへ同一フィルタを同期する が実装された。 Linux 4.14(2017年)— 、、 インターフェースおよび監査ログ機能が追加。 Linux 5.0(2019年)— ユーザー空間通知()が追加。

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

seccomp または seccomp-bpf を利用するソフトウェア Android は、Android 8.0 Oreo 以降において、zygote で seccomp-bpf フィルタを利用する。 systemd のサンドボックスオプションは、seccomp に基づいている。 QEMU (Quick EMUlator) は、KVM と組み合わせた仮想化のコアコンポーネントにおいて、--sandbox パラメータで seccomp を利用する。 Docker は、隔離されたコンテナ内部でアプリケーションを実行できるようにするソフトウェアである。Docker は --security-opt パラメータを利用して、seccomp プロファイルをコンテナに関連付け可能である。 Firejail はオープンソースの Linux サンドボックスプログラムである。Firejail は、、seccomp およびその他のカーネルレベルのセキュリティ機能を、Linux アプリケーションや Wine アプリケーションのサンドボックス化のために利用する。 Chrome はバージョン 20 の時点で、seccomp-bpf を Adobe Flash Player のサンドボックス化に利用していた。ただし Adobe Flash Player は2017年7月の予告を経て2020年12月31日にサポート終了(EOL)を迎えており、現在この用途は歴史的なものである。 Chrome はバージョン 23 の時点で、レンダラーのサンドボックス化に seccomp-bpf を利用している。 。 はバージョン 3.0.0 の時点で、seccomp-bpf サンドボックスを利用している。 OpenSSH はバージョン 6.0 以降で、seccomp-bpf をサポートしている。 Mbox は seccomp-bpf とともに ptrace を使う。これにより、ptrace 単体よりも少ないオーバーヘッドで安全なサンドボックスを作成する。 LXD はコンテナ用の Canonical/Linux Containers のシステムコンテナマネージャである。LXD/LXC は seccomp および seccomp ユーザー空間通知を利用する。 Firefox は seccomp-bpf を利用している。なお Firefox OS も seccomp-bpf を利用していたが、同プロジェクトは2016年に開発終了している。 Tor は、バージョン 0.2.5.1-alpha 以降で、seccomp をサポートしている。 Dropbox が開発した JPEG 画像を圧縮するツール Lepton は seccomp を利用している。 Kafel は、を seccomp-bpf のバイトコードに変換するである。 は seccomp-bpf を利用している。 Flatpak は seccomp を利用してを行う。 Bubblewrap は Flatpak から派生した軽量サンドボックスアプリケーションである。 minijail はプロセス分離のために seccomp を利用する。 SydBox は、ptrace サンドボックスのランタイムとセキュリティを向上させるために seccomp-bpf を利用する。これは Exherbo Linux ディストリビューションにおいて、パッケージビルドをサンドボックス化するのに使われる。 File(ファイルタイプを判定する Unix プログラム)は、seccomp を利用してランタイム環境を制限する。 (最小限のドキュメントビューワ)は、seccomp フィルタを利用して異なるサンドボックスモードを実装している。 GNOME Tracker(GNOME デスクトップ環境用のインデックス・プレビューアプリケーション)は、seccomp を利用してメディアファイルの解析脆弱性が自動的に悪用されることを防止する。

脚注

注釈

出典