プロセスが特権プロセスでのみ実行できるシステムコールを実行しようとしているとします。
プロセスがそのようなシステムコールを発行することを許可されているかどうか、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).
機能はカーネルが内部データ構造に書き込む各プロセスの属性であるため、カーネルはこれらのチェックを実行できます。