getenv, secure_getenv - 環境変数を得る
#include <stdlib.h>
char *getenv(const char *name);
char *secure_getenv(const char *name);
secure_getenv(): _GNU_SOURCE
関数
getenv()
は、環境リストから名前が
name
の環境変数を検索し、対応する
value
文字列へのポインターを返す。
GNU 固有の
secure_getenv() 関数は
getenv() と同様だが、 "secure
execution" (「安全な実行」)
が必要な場合には NULL
を返す点が異なる。
"secure execution"
が必要となるのは、
呼び出し元プロセスにより実行されるプログラムがロードされる際に、
以下の条件のいずれか一つが成立する場合である。
- *
- プロセスの実効ユーザー
ID
がプロセスの実ユーザー
ID
と一致しない場合、またはプロセスの実効グループ
ID
がプロセスの実グループ
ID と一致しない場合
(通常、この状況になるのは、
set-user-ID プログラムか set-group-ID
プログラムを実行した場合である)。
- *
- 実行ファイルで実効ケーパビリティビットがセットされている場合。
- *
- プロセスの許可ケーパビリティセットが空でない場合。
Linux
セキュリティモジュールにより要求された場合にも
"secure execution"
は必要となる場合がある。
secure_getenv() 関数は、 set-user-ID
プログラムや set-group-ID
プログラムが実行環境を偶然信用してしまった場合に起こり得る脆弱性を、
汎用ライブラリで回避するために使うことを意図して作られた。
関数
getenv()
は、環境における値 value
へのポインターを返す。
name
にマッチする環境変数が存在しないときには
NULL を返す。
secure_getenv() は glibc 2.17
で初めて登場した。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
getenv(), secure_getenv() |
Thread safety |
MT-Safe env |
getenv(): POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
secure_getenv() は GNU
による拡張である。
環境リストの文字列は
name=value
という形式をしている。
通常の実装では、
getenv()
は環境リスト内の文字列へのポインターを返す。
呼び出し元はこの文字列を変更しないように注意しなければならない。
この文字列を変更すると、そのプロセスの環境を変化させることになるからである。
getenv()
の実装はリエントラント
(再入可能)
であることを要求されていない。
getenv()
の返り値により参照される文字列は静的に割り当てられてもよく、
文字列の内容は後続の
getenv(),
putenv(3),
setenv(3),
unsetenv(3)
の呼び出しにより変更されることがある。
secure_getenv() の "secure execution"
モードは、
カーネルからユーザー空間に渡される補助ベクトル
(auxiliary vector) の
AT_SECURE
フラグにより制御される。
clearenv(3),
getauxval(3),
putenv(3),
setenv(3),
unsetenv(3),
capabilities(7),
environ(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。