Linuxでファイル記述子権限を確認するには?

Linuxでファイル記述子権限を確認するには?

プロセスがfdを正常に使用すると、open(flags=O_RDWR)fdが閉じられない限り(ローカルファイルシステムの通常のファイル)、他のプロセスがchmodを使用してそのプロセスの読み取り/書き込み権限を取り消しても、ファイルを読み書きできます。ユーザー。Linuxカーネルはinodeでファイル権限を確認したり、ファイルの説明を開くことができますか?しかし、プロセスが を使用してファイルを実行しようとすると、execveatカーネルはxビットとsuidビットの権限を確認するためにディスクを読み込みますか?開かれたファイルの説明にはどのような権限が文書化されていますか?他のすべての操作(execveatなど)fchdirfchmodディスク情報を確認できるように、ACL全体または単純な読み書きビットが含まれていますか?

ディスクファイルシステム情報に基づいて、fsuidにファイルの読み取り/書き込み/実行ビットがない他のプロセスにこのfdを送信すると、受信プロセスはfdを介してファイルを読み書き/実行/実行できますか?

答え1

execveatによって処理されたdo_open_execat、これは、次のことができるようにしたいことを指定します。ターゲットファイルを開く実行のため。ファイルオープナー処理渡す do_filp_openそしてpath_openat、記録された道の歩行プロセスが含まれていますそれぞれ。プロセスがどのように始まるかにかかわらず、これらすべての結果はstruct fileそして関連struct inodeファイルのモードとACLが指す項目(関連する場合)を保存します。 inode データ構造は、同じ inode を参照するすべてのファイル記述で共有されます。

カーネルは、検索時にメモリ内のinode情報が最新であることを確認します。場合によっては(特にローカルファイルシステム、ext4、ext3、XFS、およびbtrfs)、これはdentryキャッシュとinodeキャッシュで維持できますが、他の場合は一部のI / O(特にネットワーク経由)が含まれます。

権限確認自体は後で実行されます。bprm_fill_uid;これは、inodeに対する現在の権限と呼び出しユーザーの現在の権限を考慮します。

議論前に、権限は、ファイルを読み書きするときではなく、ファイルが開かれたりマッピングされたり、メタデータが変更されたときにのみ確認されます。したがって、ファイル記述子は、新しい権限の確認なしにプロセス間で渡すことができます。

答え2

開かれたファイル記述に書き込まれる権限と完全なACLが含まれているかどうか

struct file習慣。または、経由で検索できるfcntl(F_GETFL)ファイルアクセスモードおよびファイルステータスフラグに加えて、ファイルを開く説明()に「権限」は保存されません/proc/PID/fdinfo/FD。すべてのファイル権限はstruct inodeそこで参照されているファイルに保存されます(そしてその特定のファイルを開くすべてのプロセス/ユーザー間で共有されます)。 A はstruct file、イニシエータの資格情報への参照も保存します。

受信プロセスはfdを介してファイルを読み書きすることができますか?

execveat(fd, "", av, env, AT_EMPTY_PATH)ファイルディスクリプタを inode へのポインタとして使用することを尋ねる場合すべて参照されたファイルがそのパスを介して実行されたかのように、チェックが実行されます。フラグはfdまったく重要ではありません。ファイル記述子は、O_PATH次のように開かれる不透明なハンドルです。成功するだろうすべてのファイルはパスを介してアクセスできます。

関連情報