このテストコードを書いた結果、実行時に読み取り権限が取り消されても、プログラムは常にファイルを正常に読み取ることができることを発見しましたgetchar()
。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/types.h>
int main(){
int f = open("a.txt",O_RDONLY);
uint8_t data[200];
printf("Got %d from read", pread(f, (void *)data, 200, 0));
getchar();
printf("Got %d from read", pread(f, (void *)data, 200, 0));
}
このプログラムは印刷します
読んだ後9点獲得
chmod a-r a.txt
一時停止中に使用しても2番。
私は通常のユーザーであり、私のプロセスにCAP_DAC_OVERRIDEがないと確信しています。 2番目のユーザーはなぜpread()
エラーを返さないのですか?
私の考えでは、読み取り/書き込み時にカーネルは、を使用して生成された開かれたファイル記述に対するファイル権限のみを確認し、デフォルトのファイルopen()
システムでファイル権限を変更しても変更されないようです。
私の推測は正しいですか?
その他の質問:
私が正しいなら、mmaped領域はどうですか?
マップされた領域を読み書き/実行すると、カーネルはページテーブルに書き込まれた権限のみを確認しますか?
ファイルシステムに保存されている実際のinodeデータは、開かれたファイルの説明とmmap領域を作成するときにのみ使用されますか?
答え1
はい、権限は開いたときにのみ確認され記録されます。したがって、ファイルに書き込むことができるかどうかに関係なく、読み取り専用アクセスで開かれたファイル記述子に書き込むことはできません。
カーネルは、ファイルシステムに格納された inode ではなく、メモリ内の inode を参照します。開いたファイルの参照数が異なり、マウントポイントはマウントされたファイルのinodeを取得します。
私が正しいなら、mmaped領域はどうですか?
同じ。 (に渡されたPROT_ *フラグは、mmap()
に渡されたO_RDWR / O_RDONLY / O_WRONLYフラグと同じですopen()
)。
マップされた領域を読み書き/実行すると、カーネルはページテーブルに書き込まれた権限のみを確認しますか?
ページテーブルのレコードの権限をいつ確認できるのかわかりません。 :-).私が理解する限り、あなたの質問は次のとおりです。はい。
ファイルシステムに保存されている実際のinodeデータは、開かれたファイルの説明とmmap領域を作成するときにのみ使用されますか?
mkdir()
また、O_CREATに似たメタデータ操作に対するinode権限も確認しますopen()
。
chdir()
そしてこれはどんな通貨とも異なることを忘れないでくださいopen()
。 (または少なくともopen()
現在Linuxで呼び出されているものとは異なります)。
SELinux固有の権限についてはわかりません。