seccomp

提供: セキュリティ
2014年12月22日 (月) 00:41時点におけるDaemon (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

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つのシステムコールのみが許可された状態になります。

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 サンドボックスを使用しています。

関連項目




スポンサーリンク