悪意のある seccomp フィルターは、実際にシステム コールを実行せずに、`setuid(2)` を使用して 0 を返すようにするにはどうすればよいでしょうか。

悪意のある seccomp フィルターは、実際にシステム コールを実行せずに、`setuid(2)` を使用して 0 を返すようにするにはどうすればよいでしょうか。

私は Debian システムのドキュメントを読んでいたのですseccomp(2)が、以下の段落の次の文に偶然出会いました。

このような悪意のあるフィルターにより、たとえば、setuid(2) 呼び出し元のユーザー ID をゼロ以外の値に設定しようとして、実際にシステム コールを行わずに 0 を返すようにする可能性があります。

seccompフィルターを悪用して、上記のようなことを実現するにはどうすればよいでしょうか?

悪意のあるフィルターが を許可しない場合setuid(2)、プロセスはSIGSYSシグナルを受信して​​終了し、システムコールは実行されなくなります。

悪意のあるフィルターが許可した場合setuid(2)execve(2)プログラムはユーザーの UID を正しく変更します。

何が足りないのでしょうか?

man seccomp:

...

それ以外の場合、SECCOMP_SET_MODE_FILTER 操作は失敗し、errno に EACCES を返します。この要件により、権限のないプロセスが悪意のあるフィルタを適用して、 を使用して set-user-ID またはその他の権限のあるプログラムを呼び出しexecve(2)、そのプログラムを危険にさらす可能性がなくなります。(このような悪意のあるフィルタにより、たとえば、 を 使用しsetuid(2) て呼び出し元のユーザ ID を 0 以外の値に設定しようとすると、実際にはシステム コールを行わずに 0 が返される可能性があります。そのため、実際には権限を放棄していないため、危険なことを行うようにプログラムが影響を受ける可能性がある状況で、プログラムがスーパーユーザ権限を保持するように誘導される可能性があります。)

...

関連情報