システムコールのインターセプション

LXD では非特権コンテナーで、いくつか特定のシステムコールをインターセプトできます。もし、それが安全であると見なせるのであれば、ホスト上で特権を昇格させて実行します。

これを行うことで、対象のシステムコールではパフォーマンスに影響があり、LXD ではリクエストを評価するための作業が必要となり、もし許可されれば昇格した特権で実行されます。

利用できるシステムコール

mknod / mknodat

mknodmknodat システムコールを使用して、色々なスペシャルファイルを作成できます。

もっとも一般的にはコンテナー内部で、ブロックデバイスやキャラクターデバイスを作成するために呼び出されます。このようなデバイスを作成することは、非特権コンテナー内では許可されません。これは、ディスクやメモリのようなリソースに直接書き込みのアクセスを許可することになり、特権を昇格するのに非常に簡単な方法であるためです。 

しかし、作成しても安全であるファイルもあります。このような場合に、システムコールをインターセプトすることで、特定の処理のブロックが解除され、非特権コンテナー内部で実行できるようになります。

現時点で許可されているデバイスは次のものです:

  • overlayfs whiteout (char 0:0)
  • /dev/console (char 5:1)
  • /dev/full (char 1:7)
  • /dev/null (char 1:3)
  • /dev/random (char 1:8)
  • /dev/tty (char 5:0)
  • /dev/urandom (char 1:9)
  • /dev/zero (char 1:5)

キャラクターデバイス以外のすべてのファイルタイプは、現時点では通常通りカーネルに送られるので、この機能を有効にしても動作は全く変わりません。

この機能は security.syscalls.intercept.mknodtrue に設定することで有効に出来ます。

setxattr

setxattr システムコールは、拡張ファイル属性を設定するのに使われます。

現時点で、これにより処理される属性は次のものです:

  • trusted.overlay.opaque (overlayfs directory whiteout)

この介入は多数の文字列で行う必要があるため、現在のところ、対象の少数の属性のみインターセプトする簡単な方法がありません。上記の属性のみを許可しているため、カーネルが以前に許可していた他の属性を破損する可能性があります。

この機能は security.syscalls.intercept.setxattrtrue に設定することで有効にできます。