seccompによる制限下にある特権コンテナで breakout する

firefox で moz://a にアクセスすると https://www.mozilla.org/protocol にリダイレクトされる。moz://a ってカッコよくないですか?ズルい。 前回 は CAP_DAC_READ_SEARCH が許可されている状態で open_by_handle_at を利用することでホスト側のファイルを読み出したり、シェルを取得するなどした。 このとき、seccomp で open_by_handle_at が禁止されている場合は Operation not permitted で失敗する。 [root@b8bf54fb1c48 tmp]# ./a.out failed to open_by_handle_at: Operation not permitted しかし、このエントリ で書いたように、ptrace を使用することで seccomp による制限は回避することができる。 環境 今回は明示的に seccomp で open_by_handle_at を拒否し、DAC_READ_SEARCH を許可した Docker コンテナで試した。 なお、この設定は LXC と Docker の Privileged なコンテナとほぼ同じなので、それぞれの Pirivileged Container でも動作する。 $ cat seccomp.json | jq { "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "open_by_handle_at", "action": "SCMP_ACT_ERRNO", "args": [] } ] } $ docker run --rm -ti --cap-add=DAC_READ_SEARCH --security-opt seccomp=seccomp.

ptrace を使用して seccomp による制限を回避してみる

オススメ整体 or マッサージ情報を募集しています。 前回 は ptrace を使用して簡易的な strace を作成した。 同様にシステムコールの監視を行うものといえば seccomp だ。 seccomp によって特定のシステムコールは呼び出しが禁止されるが、ptrace によって回避することができる。 seccomp のドキュメント には次のような記述がある。 The seccomp check will not be run again after the tracer is notified. (This means that seccomp-based sandboxes MUST NOT allow use of ptrace, even of other sandboxed processes, without extreme care; ptracers can use this mechanism to escape.) ptrace によるトレーサに通知される前(システムコールが呼び出されて実行される前)に seccomp フィルタが適用されるので、seccomp によって検査された後のレジスタを変更することで、制限されているシステムコールを呼び出すことができる。 特定のシステムコールを禁止した環境を作る 以下の seccomp ポリシーを Docker コンテナに適用する。