私はこの素晴らしい本をめくっていますThe Linux Programming Interface
。第15章、セクション15.4、304ページは次のとおりです。
そのため、権限のないプロセス(権限のないプロセス)が実行されたときCAP_FSETIDファイルのグループIDがプロセスの有効グループIDまたは補助グループID(または機能)と同じでない場合、
chmod()
カーネルは常にset-group-ID権限ビットをクリアします。fchmod()
これは、ユーザーがメンバー以外のグループに対してグループID設定プログラムを作成するのを防ぐためのセキュリティ対策です。
この場合、権限のないプロセスがファイルの作成中にパラメータmode
にset-group-IDフラグを指定できると考えられますopen()
。この場合、カーネルは set-group-ID ビットをクリアしません。私が理解している限り、カーネルは上記の理由でこれを行う必要があります。この動作はなぜのみに適用されますかchmod()
?
答え1
コアグループ実行権限で使用されている場合は、このフラグをクリアします。。次のプログラムを使用してこれをテストできます。
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc < 2) {
exit(1);
}
if (open(argv[1], O_RDWR | O_CREAT, 02755) < 0) {
perror("open");
}
}
ディレクトリを作成してそれをあなたのグループに変更するいいえここで生成されたファイルがそのグループの所有になるように setgid に設定します。その後、上記のプログラムを実行して実行可能ファイルを生成すると、権限が2755ではなく755で終わることがわかります。
プログラムの権限を02644に変更すると、結果ファイルに権限2644がありますが、これはLinuxには役立ちません。