prctl -
プロセスの操作を行なう
#include <sys/prctl.h>
int prctl(int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5);
prctl()
の動作は最初の引き数によって決定される
(この値は
<linux/prctl.h>
に定義されている)。
残りの引き数は最初の引き数によって変化する。
一番目の引き数として以下のものを指定できる:
-
PR_CAPBSET_READ (Linux 2.6.25 以降)
- で指定されたケーパビリティが呼び出したスレッドのケーパビリティ
バインディングセット
(capability bounding set)
に含まれている場合、
(関数の結果として) 1
を返し、そうでない場合
0 を返す
(ケーパビリティ定数は
<linux/capability.h>
で定義されている)。
ケーパビリティバウンディングセットは、
execve(2)
を呼び出した際に、ファイルの許可
(permitted)
ケーパビリティの中で
そのプロセスが獲得できるケーパビリティを指示するものである。
arg2
に指定されたケーパビリティが有効でない場合、
呼び出しはエラー
EINVAL で失敗する。
-
PR_CAPBSET_DROP (Linux 2.6.25 以降)
- 呼び出したスレッドがケーパビリティ
CAP_SETPCAP
を持っている場合、
呼び出したスレッドのケーパビリティバウンディングセットから
arg2
で指定されたケーパビリティを外す。
呼び出したスレッドの子プロセスは変更後のバウンディングセットを
継承する。
呼び出したスレッドが
CAP_SETPCAP
を持っていない場合、呼び出しはエラー
EPERM で失敗する。 arg2
に指定されたケーパビリティが有効でない場合、
EINVAL で失敗する。
ファイルケーパビリティがカーネルで有効になっていない場合
(この場合にはバウンディングセットがサポートされない)、
EINVAL で失敗する。
-
PR_SET_CHILD_SUBREAPER (Linux 3.4
以降)
-
arg2 が 0
以外の場合、
呼び出し元プロセスの
"child subreaper"
属性をセットする。
arg2 が 0 の場合、
この属性をクリアする。
プロセスが child subreaper
のマークが付いている場合、
このプロセスの子プロセスやその子孫にはすべて
subreaper
のマークが付与される。
subreaper
は事実上その子孫のプロセスに対して
init(1)
の役割を果たす。
孤児になったプロセス
(直接の親プロセスがすでに終了しているプロセス)
が終了した際、
そのプロセスに subreaper
のマークが付いていると、
最も近い存在する先祖の
subreaper プロセスに SIGCHLD
シグナルが送られ、
そのプロセスの wait
を使って終了ステータスを知ることができる。
-
PR_GET_CHILD_SUBREAPER (Linux 3.4
以降)
- 呼び出し元の
"child subreaper" 設定を、
(int *) arg2
が指す場所に返す。
-
PR_SET_DUMPABLE (Linux 2.3.20 以降)
- (Linux 2.3.20 以降)
デフォルトの振る舞いではコアダンプを引き起こすようなシグナルを受信したときに、呼び出し元のプロセスでコアダンプを生成するかどうかを決定するフラグを設定する
(通常このフラグは、デフォルトではセットされているが、
set-user-ID あるいは set-group-ID
プログラムが実行されたり、
さまざまなシステムコールによってプロセスの
UID や GID
が操作されたときに
クリアされる)。 2.6.12
以前のカーネルでは、
arg2 は 0
(プロセスはダンプ不可)
あるいは 1
(プロセスはダンプ可能)
の
どちらかでなければならない。
2.6.13 から 2.6.17
までのカーネルでは、値
2 も認められていた。
この値を指定すると、通常はダンプされないバイナリが
root だけが
読み込み可能な形でダンプされた。
セキュリティ上の理由から、この機能は削除された
( proc(5) の /proc/sys/fs/suid_dumpable
の説明も参照)。
ダンプ不可のプロセスを
ptrace(2) PTRACE_ATTACH
経由で接続することはできない。
-
PR_GET_DUMPABLE (Linux 2.3.20 以降)
- (Linux 2.3.20 以降)
呼び出し元プロセスにおけるダンプ可能フラグの
現在の状態を
(関数の結果として)
返す。
-
PR_SET_ENDIAN (Linux 2.6.18
以降、PowerPC のみ)
- 呼び出し元プロセスのエンディアン設定
(endian-ness) を arg2
で指定された値に設定する。
指定できる値は
PR_ENDIAN_BIG, PR_ENDIAN_LITTLE, PR_ENDIAN_PPC_LITTLE
(PowerPC
擬似リトルエンディアン)
のいずれか一つである。
-
PR_GET_ENDIAN (Linux 2.6.18
以降、PowerPC のみ)
- 呼び出し元プロセスのエンディアン設定
(endian-ness) を (int *) arg2
が指す場所に格納して返す。
-
PR_SET_FPEMU (Linux 2.4.18 以降, 2.5.9,
ia64 のみ)
- 浮動小数点エミュレーション
(floating-point emulation)
制御ビットを arg2
で指定された値に設定する。
指定できる値は
PR_FPEMU_NOPRINT
(浮動小数点命令アクセスを黙って
エミュレートする) か
PR_FPEMU_SIGFPE
(浮動小数点命令をエミュレートせず、
代わりに SIGFPE を送る)
である。
-
PR_GET_FPEMU (Linux 2.4.18 以降, 2.5.9,
ia64 のみ)
- 浮動小数点エミュレーション制御ビットの値を
(int *) arg2
が指す場所に格納して返す。
-
PR_SET_FPEXC (Linux 2.4.21 および
2.5.32 以降、PowerPC のみ)
- 浮動小数点例外モード
(floating-point exception mode) を arg2
で指定された値に設定する。
指定できるのは以下の値である:
PR_FP_EXC_SW_ENABLE (FPEXC
で浮動小数点例外を有効にする)、
PR_FP_EXC_DIV (0 除算)、 PR_FP_EXC_OVF
(オーバーフロー)、
PR_FP_EXC_UND
(アンダーフロー)、
PR_FP_EXC_RES (不正確な結果
(inexact result))、 PR_FP_EXC_INV
(不正な命令 (invalid operation))、
PR_FP_EXC_DISABLED
(浮動小数点例外を無効にする)、
PR_FP_EXC_NONRECOV (async nonrecoverable exception mode)、
PR_FP_EXC_ASYNC (async recoverable exception mode)、
PR_FP_EXC_PRECISE (precise exception mode)。
-
PR_GET_FPEXC(Linux 2.4.21 および
2.5.32 以降、PowerPC のみ)
- 浮動小数点例外モードの値を
(int *) arg2
が指す場所に格納して返す。
-
PR_SET_KEEPCAPS (Linux 2.2.18 以降)
- スレッドの「ケーパビリティ保持」フラグを設定する。
このフラグは、スレッドの実
UID、実効 UID、保存 set-user-ID
のうち少なくとも一つが
0
であった状態から、これら全てが
0
以外に変更されたとき、
スレッドの許可ケーパビリティ集合がクリアされるかどうかを決定する。
デフォルトでは、このような変更が行われた場合、許可ケーパビリティセットはクリアされる。「ケーパビリティ保持」フラグを設定すると、許可ケーパビリティセットはクリアされなくなる。
arg2 は 0
(許可ケーパビリティをクリアする)
か 1
(許可ケーパビリティを保持する)
の
どちらかでなければならない。
(このような ID
の変更が行われた場合、「ケーパビリティ保持」フラグの設定に関わらず、スレッドの
実効ケーパビリティセットは常にクリアされる。)
execve(2)
が呼び出されると、「ケーパビリティ保持」フラグは
0
にリセットされる。
-
PR_GET_KEEPCAPS (Linux 2.2.18 以降)
- 呼び出し元スレッドにおける「ケーパビリティ保持」フラグの
現在の状態を
(関数の結果として)
返す。
-
PR_SET_NAME (Linux 2.6.9 以降)
- 呼び出し元スレッドのプロセス名を
(char *) arg2
が指す場所に格納された値を使って設定する。
名前は終端の NULL
バイトを含めて最大で
16 バイトである
(終端の NULL
バイトを含めた文字列の長さが
16
バイトを超える場合、
文字列は黙って切り詰められる)。
これは、 pthread_setname_np(3)
で設定でき、
pthread_getname_np(3)
で取得できるのと同じ属性である。
同様に、 tid
が呼び出し元スレッドの
ID の場合、
この属性は /proc/self/task/[tid]/comm
経由でもアクセス可能である。
-
PR_GET_NAME (Linux 2.6.11 以降)
- 呼び出し元スレッドの名前を
(char *) arg2
が指す場所に格納して返す。
バッファーは最大で
16
バイトを格納できるようにすべきである。
返される文字列はヌル終端される。
-
PR_SET_NO_NEW_PRIVS (Linux 3.5
以降)
- 呼び出し元プロセスの
no_new_privs ビットを arg2
の値に設定する。
no_new_privs が 1
に設定されると、
execve(2) は、 execve(2)
の呼び出しなしでは実行できなかったことに対する特権を許可しなくなる
(例えば、 set-user-ID/set-group-ID
許可ビットやファイルケーパビリティが動作しなくなる)。
一度設定される、
このビットは解除することができない。
このビットの設定は
fork(2) や clone(2)
で作成された子プロセスに継承され、
execve(2)
の前後で保持される。
詳しい情報は、カーネルソースファイル
Documentation/prctl/no_new_privs.txt
を参照。
-
PR_GET_NO_NEW_PRIVS (Linux 3.5
以降)
- 現在のプロセスの
no_new_privs ビットの値を
(関数の結果として)
返す。 値 0 は通常の
execve(2)
の動作を意味する。
値 1 は execve(2)
が上記で述べた特権を制限する動作をすることを示す。
-
PR_SET_PDEATHSIG (Linux 2.1.57
以降)
- 親プロセス死亡シグナル
(parent process death signal) を arg2
に設定する
(設定できるシグナル値の範囲は
1..maxsig であり、0
は通知の解除である)。
呼び出し元プロセスの親プロセスが死んだ際に、ここで設定した値が
シグナルとして通知される。この値は
fork(2)
の子プロセスでは解除される。
(Linux 2.4.36 以降および 2.6.23
以降では) set-user-ID
もしくは set-group-ID
されたバイナリを実行した場合にも、このフラグは解除される。この値は
execve(2)
の前後で保持される。
-
PR_GET_PDEATHSIG (Linux 2.3.15
以降)
- 親プロセス死亡シグナルの現在の値を
(int *) arg2
が指す場所に格納して返す。
-
PR_SET_PTRACER (Linux 3.4 以降)
- この設定は Yama LSM
が有効になっていてモード
1 ("restricted ptrace")
の場合のみに意味を持つ
(モードは
/proc/sys/kernel/yama/ptrace_scope
で参照可能)。 "ptrace
プロセス ID" が arg2
で渡された場合、
呼び出し元は ptracer
プロセスがそのプロセスが直接のプロセスの先祖であるかのよう呼び出したプロセスを
ptrace できる、
と宣言しているということだ。
PR_SET_PTRACER
操作を行う毎に、
直前の "ptracer プロセス
ID"
は置きかえられる。
arg2 で PR_SET_PTRACER を 0
に設定すると、
呼び出し元の "ptracer
プロセス ID"
がクリアされる。
arg2 が PR_SET_PTRACER
の場合、 Yama
が導入した ptrace
の制限は呼び出し元プロセスに対しては無効になる。
詳しい情報は、カーネルソースファイル
Documentation/security/Yama.txt
を参照。
-
PR_SET_SECCOMP (Linux 2.6.23 以降)
- 呼び出したスレッドのセキュアコンピューティング
(seccomp)
モードを設定する。
最近の seccomp(2)
システムコールは
PR_SET_SECCOMP
の上位互換の機能を提供する。
seccomp モードは arg2
で指定できる (seccomp
定数は <linux/seccomp.h>
で定義されている)。
arg2 を SECCOMP_MODE_STRICT
に設定すると、
そのスレッドが呼び出しを許可されるシステムコールは
read(2), write(2), _exit(2), sigreturn(2)
だけになる。
それ以外のシステムコールを呼び出すと、シグナル
SIGKILL が配送される。
パイプやソケットから読み込んだ、
信頼できないバイトコードを実行する必要がある大量の演算を行うアプリケーションにおいて、
strict secure computing
モードは役立つ。
この操作は利用できるのは、
カーネルが CONFIG_SECCOMP
を有効にして作成されている場合だけである。
arg2 を SECCOMP_MODE_FILTER (Linux 3.5
以降) に設定すると、
許可されるシステムコールは
arg3 で渡された Berkeley Packet
Filter
へのポインターで定義される。
この引き数は struct
sock_fprog
へのポインターである。
これは任意のシステムコールやシステムコール引き数をフィルタリングするために設計された。
このモードはカーネルで
CONFIG_SECCOMP_FILTER
が有効になっている場合にのみ利用可能である。
SECCOMP_MODE_FILTER フィルターで
fork(2)
が許可されている場合、
seccomp モードは fork(2)
で作成された子プロセスに継承される。
execve(2)
が許可されている場合、
seccomp モードは execve(2)
の前後で維持される。
フィルターで prctl()
コールが許可されている場合、
追加でフィルターが定義され、
これらのフィルターは許可されないものが見つかるまで指定された順序で実行される。
詳しい情報は、カーネルソースファイル
Documentation/prctl/seccomp_filter.txt
を参照。
-
PR_GET_SECCOMP (Linux 2.6.23 以降)
- 呼び出したスレッドの
secure computing モードを
(関数の結果として)
返す。
呼び出したスレッドが
secure computing
モードでなかった場合、
この操作は 0
を返し、
呼び出したスレッドが
strict secure computing
モードの場合、 prctl()
を呼び出すとシグナル
SIGKILL
がそのプロセスに送信される。
呼び出したスレッドがフィルタモードで、
このシステムコールが
seccomp
フィルタにより許可されている場合、
2 を返し、
そうでない場合プロセスは
SIGKILL シグナルで kill
されづ。
この操作が利用できるのは、カーネルが
CONFIG_SECCOMP
を有効にして作成されている場合だけである。
Linux 3.8 以降では、 /proc/[pid]/status
の seccomp
フィールドからも同じ情報を取得できる。
この方法の場合はプロセスが
kill
される危険はない。
proc(5) を参照。
-
PR_SET_SECUREBITS (Linux 2.6.26
以降)
- 呼び出したスレッドの
"securebits" フラグを arg2
で渡された値に設定する。
capabilities(7) 参照。
-
PR_GET_SECUREBITS (Linux 2.6.26
以降)
- 呼び出したスレッドの
"securebits" フラグを
(関数の結果として)
返す。 capabilities(7)
参照。
-
PR_SET_THP_DISABLE (Linux 3.15
以降)
- 呼び出したスレッドの
"THP disable" (THP 無効)
フラグの状態を設定する。
arg2 が 0
以外の場合、フラグは有効になり、そうでない場合はクリーンされる。
このフラグを設定する方法により、
コードを変更できなかったり
madvise(2) の malloc hook
をが有効ではないジョブ
(この方法は静的に割り当てられたデータには有効ではない)に対して、
transparent huge pages
を無効にする手段が提供される。
"THP disable"
フラグの設定は fork(2)
で作成された子プロセスに継承され、
execve
の前後で維持される。
-
PR_GET_THP_DISABLE (Linux 3.15
以降)
- 呼び出し元スレッドの
"THP disable"
フラグの現在の設定を
(関数の結果として)
返す。フラグがセットされている場合は
1
が、セットされていない場合は
0 が返る。
-
PR_GET_TID_ADDRESS (Linux 3.5 以降)
-
set_tid_address(2) や clone(2)
CLONE_CHILD_CLEARTID
フラグで設定された
clear_child_tid を取得し、
(int **) arg2
が指す場所に格納して返す。
この機能はカーネルが
CONFIG_CHECKPOINT_RESTORE
オプションを有効にして作成されている場合にのみ利用できる。
-
PR_SET_TIMERSLACK (Linux 2.6.28
以降)
- 呼び出し元スレッドの現在の
timer slack を arg2
で指定されたナノ秒に設定する。
arg2 が 0 以下の場合、
現在の timer slack
をそのスレッドのデフォルトの
timer slack
値にリセットする。
カーネルは timer slack
を使って、
呼び出し元スレッドのタイマー満了のうち、どのくらい近いものグルーピングする
(一纏めにする)
かを決める。
その結果、
そのスレッドのタイマーの満了は最大で指定されたナノ秒分だけ遅れる場合がある。
タイマー満了をグルーピングすることで、
CPU
を起こす回数が最小化されシステムの消費電力を減らすことができる。
timer slack
の影響を受けるのは、
システムコール select(2),
pselect(2), poll(2), ppoll(2), epoll_wait(2),
epoll_pwait(2), clock_nanosleep(2), nanosleep(2),
futex(2)
により設定されたタイマー満了である
(また、 futex
を使って実装されているライブラリ関数
pthread_cond_timedwait(3), pthread_mutex_timedlock(3),
pthread_rwlock_timedrdlock(3),
pthread_rwlock_timedwrlock(3), sem_timedwait(3)
も影響を受ける)。
timer slack
はリアルタイムスケジューリングポリシーでスケジューリングされるスレッドには提供されない
( sched_setscheduler(2) 参照)。
各スレッドには timer slack
に関連する値が 2
つある。
「デフォルト値」と「現在値」である。
現在値はタイマー満了のグルーピングを制御する。
新しいスレッドが作成される際、
2 つの timer slack
値はそのスレッドを作成したスレッドの現在値と同じに設定される。
その後、 スレッドは
PR_SET_TIMERSLACK で現在の timer slack
値を調整できる
(デフォルト値は変更できない)。
すべてのプロセスの先祖となる
init (PID 1) の timer slack 値は 50,000
ナノ秒 (50 ミリ秒)
である。 timer slack 値は
execve(2)
の前後で保持される。
-
PR_GET_TIMERSLACK (Linux 2.6.28
以降)
- 呼び出し元スレッドの現在のタイマーのスラック値を
(関数の結果として)
返す。
-
PR_SET_TIMING (Linux 2.6.0-test4
以降)
- (通常の、伝統的に使われてきた)
統計的なプロセスタイミングを使用するか、
正確なタイムスタンプに基づくプロセスタイミングを使用するかを設定する。
arg2
に指定できる値は
PR_TIMING_STATISTICAL か PR_TIMING_TIMESTAMP
である。 PR_TIMING_TIMESTAMP
は現在のところ実装されていない
(このモードに設定しようとするとエラー
EINVAL
が起こることだろう)。
-
PR_GET_TIMING (Linux 2.6.0-test4
以降)
- 現在使用中のプロセスタイミングを決める方法を
(関数の結果として)
返す。
-
PR_TASK_PERF_EVENTS_DISABLE (Linux 2.6.31
以降)
- 呼び出したプロセスに接続されたすべての性能カウンターを無効にする。
カウンターがこのプロセスにより作成されたか他のプロセスにより作成されたかは関係ない。
呼び出したプロセスが他のプロセス用に作成した性能カウンターは影響を受けない。
性能カウンターの詳細については
Linux カーネルソースの
tools/perf/design.txt を参照。
- 以前は
PR_TASK_PERF_COUNTERS_DISABLE
と呼ばれていた。 Linux
2.6.32
で名前が変更された
(数値は同じままである)。
-
PR_TASK_PERF_EVENTS_ENABLE (Linux 2.6.31
以降)
-
PR_TASK_PERF_EVENTS_DISABLE の逆。
呼び出したプロセスに接続された性能カウンターを有効にする。
- 以前は
PR_TASK_PERF_COUNTERS_ENABLE
と呼ばれていた。 Linux
2.6.32
で名前が変更された。
-
PR_SET_TSC (Linux 2.6.26 以降, x86
のみ)
- そのプロセスがタイムスタンプカウンターを読み出せるかを決定する
フラグの状態を設定する。
読み出しを許可する場合は
arg2 に PR_TSC_ENABLE
を、そのプロセスがタイムスタンプカウンターを読み出そうとした際に
SIGSEGV
を発生させる場合には
PR_TSC_SIGSEGV を渡す。
-
PR_GET_TSC (Linux 2.6.26 以降, x86
のみ)
- そのプロセスがタイムスタンプカウンターを読み出せるかを決定する
フラグの状態を (int *)
arg2
が指す場所に格納して返す。
- PR_SET_UNALIGN
- (ia64 では Linux 2.3.48 以降;
parisc では Linux 2.6.15 以降; PowerPC
では Linux 2.6.18 以降; Alpha
では Linux 2.6.22 以降;
これらのアーキテクチャーのみ)
unaligned
アクセス制御ビットを
arg2
で指定された値に設定する。
指定できる値は
PR_UNALIGN_NOPRINT (unaligned
なユーザーアクセスを黙って
修正する) か PR_UNALIGN_SIGBUS
(unaligned
なユーザーアクセスがあった場合
SIGBUS を生成する)
である。
- PR_GET_UNALIGN
- (バージョンとアーキテクチャーの情報は
PR_SET_UNALIGN 参照) unaligned
アクセス制御ビットの値を
(int *) arg2
が指す場所に格納して返す。
-
PR_MCE_KILL (Linux 2.6.32 以降)
- 現在のスレッドの
machine check memory corruption kill
ポリシーを設定する。
arg2 が PR_MCE_KILL_CLEAR
の場合、
このスレッドの memory corruption
kill
ポリシーをクリアし、
システム全体のデフォルト値を使用する
(システム全体のデフォルトは
/proc/sys/vm/memory_failure_early_kill
で定義される。 proc(5)
参照)。 arg2 が PR_MCE_KILL_SET
の場合、
スレッド固有の memory corruption
kill
ポリシーを使用する。
この場合、 arg3
によりこのポリシーが
early kill ( PR_MCE_KILL_EARLY か、 late
kill ( PR_MCE_KILL_LATE) か、
システム全体のデフォルト値
( PR_MCE_KILL_DEFAULT)
が指定される。 early kill
は、
ハードウェアメモリー破壊
(corruption)
がスレッドのアドレス空間内で検出されるとすぐに、
そのスレッドが SIGBUS
シグナルを受信することを意味する。
late kill モードでは、
メモリー破壊が起こったページにアクセスした場合にのみ、
そのプロセスが kill
される。 SIGBUS
シグナルの詳細は
sigaction(2) を参照。
このポリシーは子プロセスに継承される。
未使用の残りの prctl()
の引き数は将来の互換性のため
0
にしなければならない。
-
PR_MCE_KILL_GET (Linux 2.6.32 以降)
- 現在のプロセス単位の
machine check kill
ポリシーを返す。
未使用の prctl()
の引き数はすべて 0
にしなければならない。
-
PR_SET_MM (Linux 3.3 以降)
- 呼び出したプロセスのカーネルメモリーマップディスクリプターのフィールドを変更する。
これらのフィールドは通常カーネルと動的リンカーにより設定される
(詳しい情報は ld.so
を参照)。
通常のアプリケーションはこの機能を利用すべきではない。
しかしながら、自分を書き換えるプログラムなど、
プログラムが自分自身のメモリーマップを変更するのが有用な場面もある。
この機能はカーネルが
CONFIG_CHECKPOINT_RESTORE
オプションを有効にして作成されている場合にのみ利用できる。
呼び出したプロセスは
CAP_SYS_RESOURCE
ケーパビリティを持っていなければならない。
arg2
の値には以下のいずれかを指定し、
arg3
でそのオプションの新しい値を指定する。
- PR_SET_MM_START_CODE
- プログラムテキストを実行できるアドレスの上限を設定する。
対応するメモリー領域は読み出し可能で実行可能でなければならないが、
書き込み可能だったり共有可能だったりしてはならない
(詳しい情報は mprotect(2)
と mmap(2) 参照)。
- PR_SET_MM_END_CODE
- プログラムテキストを実行できるアドレスの下限を設定する。
対応するメモリー領域は読み出し可能で実行可能でなければならないが、
書き込み可能だったり共有可能だったりしてはならない。
- PR_SET_MM_START_DATA
- 初期化済データや未初期化
(bss)
データを配置する領域のアドレス上限を指定する。
対応するメモリー領域は読み書き可能でなければならないが、
実行可能だったり共有可能だったりしてはならない。
- PR_SET_MM_END_DATA
- 初期化済データや未初期化
(bss)
データを配置する領域のアドレス下限を指定する。
対応するメモリー領域は読み書き可能でなければならないが、
実行可能だったり共有可能だったりしてはならない。
- PR_SET_MM_START_STACK
- スタックの開始アドレスを設定する。
対応するメモリー領域は読み書き可能でなければならない。
- PR_SET_MM_START_BRK
-
brk(2)
コールで拡張できるプログラムのヒープ領域のアドレス上限を設定する。
このアドレスは、プログラムの現在のデータセグメントの最終アドレスより大きくなければならない。
また、
変更後のヒープとデータセグメントのサイズを合わせたサイズが
RLIMIT_DATA
リソースリミットを超えることはできない
( setrlimit(2) 参照)。
- PR_SET_MM_BRK
- 現在の brk(2)
値を設定する。
このアドレスの要件は
PR_SET_MM_START_BRK
オプションと同じである。
以下のオプションは Linux
3.5 以降で利用できる。
- PR_SET_MM_ARG_START
- プログラムのコマンドラインを配置するアドレスの上限を設定する。
- PR_SET_MM_ARG_END
- プログラムのコマンドラインを配置するアドレスの下限を設定する。
- PR_SET_MM_ENV_START
- プログラムの環境情報
(environment)
を配置するアドレスの上限を設定する。
- PR_SET_MM_ENV_END
- プログラムの環境情報
(environment)
を配置するアドレスの下限を設定する。
-
PR_SET_MM_ARG_START, PR_SET_MM_ARG_END,
PR_SET_MM_ENV_START, PR_SET_MM_ENV_END
で指定されるアドレスはプロセスのスタック領域に属している必要がある。
したがって、これらのメモリー領域は読み書き可能でなければならない。
また、
(カーネル設定によっては)
MAP_GROWSDOWN
属性がセットされていなければならない
( mmap(2) 参照)。
- PR_SET_MM_AUXV
- 新しい補助ベクトル
(auxiliary vector) を設定する。
arg3
引き数はベクトルのアドレスを指定し、
arg4
はベクトルのサイズを指定する。
- PR_SET_MM_EXE_FILE
-
/proc/pid/exe
シンボリックリンクを
arg3
引き数で渡された新しい実行可能なファイルディスクリプターを指すシンボリックリンクで置き換える。
ファイルディスクリプターは通常の
open(2)
コールで取得すべきである。
- シンボリックリンクを変更するには、
既存の実行可能なメモリー領域のすべてをアンマップする必要がある。これにはカーネル自身が作成した領域も含まれる
(例えば、カーネルは通常
ELF .text
セクションに少なくとも一つの実行可能なメモリー領域を作成する)。
- 二つ目の制限は、このような変更はプロセスの生存期間で一度だけ行うことができるという点である。
一度変更を行った後で変更を行おうとすると拒否される。
この動作は、
システム管理者が、
システムで動作するすべてのプロセスが行う、
普通でないシンボリックリンクの変更を監視するのを楽にする。
-
PR_MPX_ENABLE_MANAGEMENT,
PR_MPX_DISABLE_MANAGEMENT (Linux 3.19 以降)
- Memory Protection eXtensions (MPX)
の境界テーブル (bounds table)
のカーネル管理の有効化/無効化を行う。
引き数 arg2, arg3, arg4,
arg5 は 0
でなければならない。
MPX は、
ポインターの境界チェックを行うハードウェア支援機構である。
この機能は、
境界情報を格納するレジスター群と、
境界チェックをどの命令に課すかを
CPU
に教えるための特別な命令プレフィックスの集合で構成される。
これらのレジスター数は限られており、
レジスター数よりも多くのポインターがある場合には、
その内容をテーブル群に退避する
(spilled) 必要がある。
これらのテーブル群は「境界テーブル
(bounds tables)」と呼ばれ、 MPX
prctl
命令はカーネルがこれらの割り当てと解放を行うかどうかを制御する。
管理が有効になっている場合、
カーネルが境界テーブルの割り当てと解放を担当する。
最初に存在しない境界テーブルを使おうとした際に上がる
#BR 例外を捕捉し、
ユーザー空間に例外を配送せずに、
テーブルの割り当てを行い、
新しいテーブルに境界情報
(bounds directory) を書き込む。
解放に関しては、
カーネルが割り当てられていないメモリーに対応する境界テーブルが存在するかを確認し、
そうであれば解放を行う。
PR_MPX_ENABLE_MANAGEMENT を使って MPX
管理を有効にする前に、
アプリケーションはまず境界情報管理用のユーザー空間バッファーを割り当て、
その管理情報の場所を
bndcfgu
レジスターに設定しなければならない。
CPU やカーネルが MPX
をサポートしていない場合、
これらの呼び出しは失敗する。
カーネルによる MPX
のサポートは
CONFIG_X86_INTEL_MPX
設定オプションで有効にできる。
CPU が MPX
をサポートしているかを確認するには、
以下のように 'mpx' CPUID
ビットを見ればよい。
cat /proc/cpuinfo | grep ' mpx '
MPX
が有効になっている間は、
スレッドはロング (64
ビット)
モードのオン/オフの切り替えはできない。
プロセス内のすべてのスレッドがこれらの呼び出しの影響を受ける。
fork(2)
で作成された子プロセスは
MPX
管理の状態を継承する。
execve(2) の中で、 MPX
管理は PR_MPX_DISABLE_MANAGEMENT
が呼ばれた場合と同じ状態がリセットされる。
Intel MPX
についての詳しい情報は、カーネルソースファイル
Documentation/x86/intel_mpx.txt
を参照。
成功すると、
PR_GET_DUMPABLE,
PR_GET_KEEPCAPS,
PR_GET_NO_NEW_PRIVS,
PR_GET_THP_DISABLE,
PR_CAPBSET_READ,
PR_GET_TIMING,
PR_GET_TIMERSLACK,
PR_GET_SECUREBITS,
PR_MCE_KILL_GET,
PR_GET_SECCOMP
は上述の負でない値を返す
(なお、
PR_GET_SECCOMP
は返らない場合もある)。
option
が他の値の場合は成功時に
0 を返す。
エラーの場合、-1
を返し、
errno
に適切な値を設定する。
- EFAULT
-
arg2
が不正なアドレスである。
- EFAULT
-
option が PR_SET_SECCOMP
で、 arg2 が SECCOMP_MODE_FILTER
で、 カーネルが
CONFIG_SECCOMP_FILTER
を有効にして作成されており、
arg3
が無効なアドレスである。
- EINVAL
-
option
の値が理解できない。
- EINVAL
-
option が PR_MCE_KILL,
PR_MCE_KILL_GET, PR_SET_MM
のいずれかで、かつ未使用の
prctl() 引き数に 0
が指定されていなかった。
- EINVAL
-
arg2
が指定された option
で有効な値ではない。
- EINVAL
-
option が PR_SET_SECCOMP か
PR_GET_SECCOMP
だが、カーネルが
CONFIG_SECCOMP
を有効にして作成されていなかった。
- EINVAL
-
option が PR_SET_SECCOMP
で、 arg2 が SECCOMP_MODE_FILTER
で、 カーネルが
CONFIG_SECCOMP
を有効にして作成されていなかった。
- EINVAL
-
option が PR_SET_MM
で、以下のいずれかが真である。
- *
-
arg4 が arg5 で 0
以外である。
- *
-
arg3 が TASK_SIZE
よりも大きい ( TASK_SIZE
はこのアーキテクチャーでユーザー空間アドレススペースの最大サイズである)。
- *
-
arg2 が PR_SET_MM_START_CODE,
PR_SET_MM_END_CODE, PR_SET_MM_START_DATA,
PR_SET_MM_END_DATA, PR_SET_MM_START_STACK
のどれかで、対応するメモリー領域のアクセス許可が要件を満たしていない。
- *
-
arg2 が PR_SET_MM_START_BRK か
PR_SET_MM_BRK で、 arg3
データセグメントの末尾と同じかそれより前か、
arg3 に RLIMIT_DATA
リソースリミットを超えてしまうような値が指定されている。
- EINVAL
-
option が PR_SET_PTRACER で
arg2 が 0, PR_SET_PTRACER_ANY,
既存プロセスの PID
のいずれでもない。
- EINVAL
-
option が PR_SET_PDEATHSIG
で、 arg2
で指定された値は無効なシグナル番号である。
- EINVAL
-
option が PR_SET_DUMPABLE
で、 arg2 が SUID_DUMP_DISABLE
でも SUID_DUMP_USER
でもない。
- EINVAL
-
option が PR_SET_TIMING
で、 arg2 が PR_TIMING_STATISTICAL
ではない。
- EINVAL
-
option が PR_SET_NO_NEW_PRIVS
で、 arg2 が 1 以外か、
arg3, arg4, arg5
のどれかが 0
ではない。
- EINVAL
-
option が PR_GET_NO_NEW_PRIVS
で、 arg2, arg3, arg4, arg5
のどれかが 0
ではない。
- EINVAL
-
option が PR_SET_THP_DISABLE で
arg3, arg4, arg5
のどれかが 0
ではない。
- EINVAL
-
option が PR_GET_THP_DISABLE で
arg2, arg3, arg4, arg5
のいずれが 0
ではない。
- EPERM
-
option が PR_SET_SECUREBITS
で、呼び出し元がケーパビリティ
CAP_SETPCAP
を持っていない。
または、"locked"
フラグを解除しようとした。
または、locked
フラグがセットされているフラグをセットしようとした
( capabilities(7) 参照)。
- EPERM
-
option が PR_SET_KEEPCAPS
で、呼び出し元のフラグ
SECURE_KEEP_CAPS_LOCKED
がセットされている (
capabilities(7) 参照)。
- EPERM
-
option が PR_CAPBSET_DROP
で、呼び出し元がケーパビリティ
CAP_SETPCAP
を持っていない。
- EPERM
-
option が PR_SET_MM
で、呼び出し元がケーパビリティ
CAP_SYS_RESOURCE
を持っていない。
- EACCES
-
option が
PR_SET_MM、かつ arg3 が
PR_SET_MM_EXE_FILE
で、ファイルが実行可能ではない。
- EBUSY
-
option が PR_SET_MM で、
arg3 が PR_SET_MM_EXE_FILE で、
/proc/pid/exe
シンボリックリンクを変更しようとしたが、
禁止されている。
- EBADF
-
option が PR_SET_MM で、
arg3 が PR_SET_MM_EXE_FILE で、
arg4
で渡されたファイルディスクリプターが有効ではない。
- ENXIO
-
option が PR_MPX_ENABLE_MANAGEMENT
か PR_MPX_DISABLE_MANAGEMENT で、
カーネルか CPU が MPX
の管理をサポートしていない。
カーネルとプロセスが
MPX
をサポートしているか確認すること。
prctl() システムコールは
Linux 2.1.57 で導入された。
このコールは Linux
特有である。 IRIX には
prctl()
システムコールがあるが
(MIPS
アーキテクチャーにおいて
irix_prctl として Linux 2.1.44
で同様に導入された)、
そのプロトタイプは
ptrdiff_t prctl(int option, int arg2, int
arg3 );
である。ユーザー当りのプロセス最大数を取得するオプション、
プロセスの使用できる最大プロッサー数を取得するオプション、
現在特定のプロセスが停止(block)させられているかどうか調べるオプション、
スタックサイズの最大値の取得や設定を行なうオプションなどがある。
signal(2),
core(5)
この man ページは Linux
man-pages
プロジェクトのリリース
3.79 の一部である。
プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。