グループIDが一致しない場合、Linuxはファイルのset-group-IDビットをクリアしますか?

グループIDが一致しない場合、Linuxはファイルのset-group-IDビットをクリアしますか?

私はこの素晴らしい本をめくっています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には役立ちません。

関連情報