プロセスがシステムコールを発行できるかどうかをLinuxはどうやって知ることができますか?

プロセスがシステムコールを発行できるかどうかをLinuxはどうやって知ることができますか?

プロセスが特権プロセスでのみ実行できるシステムコールを実行しようとしているとします。

プロセスがそのようなシステムコールを発行することを許可されているかどうか、Linuxはどうすればわかりますか? Linuxはプロセスのfsuid(ファイルシステムユーザーID)を見て、ルートプロセスであることを確認しますか?または、プロセスのfsuid(ファイルシステムのユーザーID)を確認しますか?システムユーザーID)がルートプロセスであることを確認しますか?能力システムコールの実行に必要な機能があることを確認してください。それとも、Linuxはこれについて別の方法で知っていますか?

答え1

通常、カーネルはプロセスの機能を調べ、必要な機能があるかどうかを確認します。この情報は、関連するシステムコールのマニュアルページにあります。これを実行するには、「プロセスにCAP_XYZ機能が必要です」という説明があります。たとえば、マニュアルページを見てください。kill(2)、私達は次を見ます:

   For  a process to have permission to send a signal, it must either
   be privileged (under Linux: have the CAP_KILL  capability  in  the
   user  namespace  of  the target process), or the real or effective
   user ID of the sending process must equal the real or  saved  set-
   user-ID  of  the  target process.

またcreate_module(2)ページには次のものが表示されます。

DESCRIPTION
   create_module()  attempts  to  create  a loadable module entry and
   reserve the kernel memory that will be needed to hold the  module.
   This system call requires privilege.
...
ERRORS
...
   EPERM  The   caller   was   not   privileged  (did  not  have  the
          CAP_SYS_MODULE capability).

機能はカーネルが内部データ構造に書き込む各プロセスの属性であるため、カーネルはこれらのチェックを実行できます。

関連情報