「seccomp」の版間の差分
(同じ利用者による、間の2版が非表示) | |||
行1: | 行1: | ||
[[seccomp]] (secure computing modeの略)とは、[[Linuxカーネル]]上でアプリケーションの[[サンドボックス]]メカニズムを提供するためのセキュアコンピューティングの機能です。 | [[seccomp]] (secure computing modeの略)とは、[[Linuxカーネル]]上でアプリケーションの[[サンドボックス]]メカニズムを提供するためのセキュアコンピューティングの機能です。 | ||
* [[seccomp]] は、一方向のため、「セキュアな状態」へ移行すると、戻れない。 | * [[seccomp]] は、一方向のため、「セキュアな状態」へ移行すると、戻れない。 | ||
− | |||
* strict と filter の2つのモードがある。 | * strict と filter の2つのモードがある。 | ||
+ | * strict モードでは、[[システムコール]]は、 exit , sigreturn, read, write のみが利用できる。 | ||
+ | * filter モードでは、システムコールのフィルタリングができる。 | ||
'''読み方''' | '''読み方''' | ||
行17: | 行18: | ||
== seccomp-bpf == | == seccomp-bpf == | ||
seccomp-bpf は、 [[seccomp]] の拡張です。Berkeley Packet Filter ルールで使われいている設定可能なポリシーを使用したシステムコールのフィルタリングを行います。 | seccomp-bpf は、 [[seccomp]] の拡張です。Berkeley Packet Filter ルールで使われいている設定可能なポリシーを使用したシステムコールのフィルタリングを行います。 | ||
+ | === seccomp-bpf のパフォーマンス === | ||
+ | seccomp-bpf は、[[システムコール]]の呼び出しをするたびに、チェックが入るため、パフォーマンスに影響を与えます。システムコールの呼び出しが少なければ、大きく影響を受けることはないと考えられます。 | ||
+ | |||
== seccompのモード == | == seccompのモード == | ||
[[Linuxカーネル]] 3.5 以降の [[seccomp]]には、以下のモードがあります。 | [[Linuxカーネル]] 3.5 以降の [[seccomp]]には、以下のモードがあります。 | ||
行28: | 行32: | ||
== 使い方 == | == 使い方 == | ||
− | <syntaxhighlight lang=" | + | <syntaxhighlight lang="c"> |
+ | /* | ||
+ | * prctl1.c | ||
+ | * Copyright (C) 2014 kaoru <kaoru@bsd> | ||
+ | */ | ||
+ | |||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <sys/prctl.h> | ||
+ | #include <linux/seccomp.h> | ||
+ | |||
+ | #include <unistd.h> | ||
+ | #include <err.h> | ||
+ | |||
+ | int | ||
+ | main(int argc, char *argv[]) | ||
+ | { | ||
+ | int r; | ||
+ | r = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); | ||
+ | |||
+ | (void) printf ("prctl(PR_SET_SECCOMP,SECCOMP_MODE_STRICT) = %d\n", r); | ||
+ | |||
+ | |||
+ | pid_t pid = fork (); | ||
+ | (void) printf ("Not reached"); | ||
+ | |||
+ | if (pid == -1) { | ||
+ | err (EXIT_FAILURE, "can not fork"); | ||
+ | } else if (pid == 0) { | ||
+ | (void) printf("I'm child\n"); | ||
+ | exit (EXIT_SUCCESS); | ||
+ | } | ||
+ | |||
+ | (void) printf ("END\n"); | ||
+ | exit(EXIT_SUCCESS); | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2014年12月22日 (月) 00:41時点における最新版
seccomp (secure computing modeの略)とは、Linuxカーネル上でアプリケーションのサンドボックスメカニズムを提供するためのセキュアコンピューティングの機能です。
- seccomp は、一方向のため、「セキュアな状態」へ移行すると、戻れない。
- strict と filter の2つのモードがある。
- strict モードでは、システムコールは、 exit , sigreturn, read, write のみが利用できる。
- filter モードでは、システムコールのフィルタリングができる。
読み方
- seccomp
- せく こむぷ
- secure computing mode
- せきゅあ こんぴゅーてぃんぐ もーど
目次
概要
seccompは、2005年3月8日にリリースされた 2.6.12 にマージされました。2012年に BPF をシステムコールのフィルタに応用するアプローチが登場し、Linuxカーネル 3.5 でマージされました。
seccompは、プロセスにexit(),sigreturn(), 開いているファイルディスクレイプタへのread(), write()のシステムコールを除いて使用できない 「セキュアな状態」へ一方向で移行させます。その他のシステムコールを呼びだそうとしたとき、Linuxカーネルが SIGKILL を発行してプロセスを終了させます。その意味では、これはシステムリソースを仮想化せずに、それらからプロセスと分離します。
seccomp モードは、PR_SET_SECCOMP 引数を使って prctl(2) システムコールか、 seccomp システムコールを通して、有効になります。seccompモードは、 /proc/self/secomp のファイルを書くことで有効になりますが、この方法は、 prctl によって削除されました。 いくつかのカーネルのバージョンでは、 seccomp は、 RDTSC x86 命令を無効化します。
seccomp-bpf
seccomp-bpf は、 seccomp の拡張です。Berkeley Packet Filter ルールで使われいている設定可能なポリシーを使用したシステムコールのフィルタリングを行います。
seccomp-bpf のパフォーマンス
seccomp-bpf は、システムコールの呼び出しをするたびに、チェックが入るため、パフォーマンスに影響を与えます。システムコールの呼び出しが少なければ、大きく影響を受けることはないと考えられます。
seccompのモード
Linuxカーネル 3.5 以降の seccompには、以下のモードがあります。
- strict
- filter
strict モード
strict モード seccomp (seccomp-legacy) は、4つのシステムコールのみが許可された状態になります。
- システムコールは、 exit , sigreturn, read, write のみが利用できる。
filter モード
filter モード seccomp (seccomp-bpf) は、フィルタでシステムコールが許可されます。
使い方
/* * prctl1.c * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <stdio.h> #include <stdlib.h> #include <sys/prctl.h> #include <linux/seccomp.h> #include <unistd.h> #include <err.h> int main(int argc, char *argv[]) { int r; r = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); (void) printf ("prctl(PR_SET_SECCOMP,SECCOMP_MODE_STRICT) = %d\n", r); pid_t pid = fork (); (void) printf ("Not reached"); if (pid == -1) { err (EXIT_FAILURE, "can not fork"); } else if (pid == 0) { (void) printf("I'm child\n"); exit (EXIT_SUCCESS); } (void) printf ("END\n"); exit(EXIT_SUCCESS); }
利用例
- Linux 版 Google Chrome
- Chrome 20 は、 Adobe Flash Player サンドボックス に seccomp-bpf を使用しています。
- Chrome 23 は、 レンダラーの サンドボックス に seccomp-bpf を使用しています。
- OpenSSH 6.0 で seccomp-bpf をサポートしました。
- vsfptd 3.0.0 は、 seccomp-bpf サンドボックスを使用しています。
関連項目
- サンドボックス (sandbox)