一般ユーザーは、ルートが所有するファイルを変更できます。

一般ユーザーは、ルートが所有するファイルを変更できます。

ファイルがルートによって生成されたプレーンテキストファイルの場合は、次のコマンドを使用します。

echo 'foo' > ./file.txt

あなたのls -lもの:

-rw-r--r-- root root ./file.txt

ただし、一般ユーザーとしてこの設定を変更できます。ウィムで保存する:w!sedコマンド、これが発生した場合ユーザーとグループファイル所有者は次のように変更されます。

-rw-r--r-- user user ./file.txt

他人の読み取り権限が削除された場合はchmod o-r ./file.txt変更できなくなりましたが、復元するとchmod o+r ./file.txt再度変更できることがわかりました。

ここで何が起こっているのでしょうか? 「その他」の読み取り権限でルートが所有するファイルを変更し、ユーザーとグループの所有権を変更できるのはなぜですか。

なぜこれが起こるのですか?

PS:私はDebian SIDを使用しています。

答え1

これは、次の2つの理由で発生します。

  • vim(少なくともこの場合)、sedライブ編集を行うと、実際には元のファイルが削除され、同じ名前の新しいファイルが作成されます。

  • ファイル削除機能は、ファイル自体の権限ではなく、ファイルを含むディレクトリの権限によって異なります。

したがって、ここで何が起こるのかは、ディレクトリへの書き込み権限があるということです。これは、ファイルの削除や作成など、ディレクトリの内容を変更できることを意味します。したがって、実行sed -iまたは保存すると、:w!元のファイルが削除され、新しいファイルが生成されます。これが所有権が変更される理由でもあります。実際には別のファイルです。

ファイルの内容を確認できます。インデックスノード編集前と後:

$ ls -ld foo/
drwxr-xr-x 2 terdon terdon 266240 Nov 16 13:43 foo/
$ cd foo
$ sudo sh -c 'echo foo > file'
$ ls -l 
total 4
-rw-r--r-- 1 root root 4 Nov 16 13:43 file

このコマンドの後、一般ユーザーはfile書き込み権限を持つディレクトリのルート所有権を持ちます。foo/それではls -i、次のようにinodeを確認し、変更してもう一度確認してsedみましょう。

$ ls -li file 
26610890 -rw-r--r-- 1 root root 4 Nov 16 13:43 file
$ sed -i 's/foo/bar/' file
$ ls -li file 
26610859 -rw-r--r-- 1 terdon terdon 4 Nov 16 15:40 file

vim次のコマンドを実行して同じことを確認することもできます。

strace vim file 2> strace.out

その後、ファイルを編集して別の:w!名前で保存すると、次のようにstrace.outなります。

    unlink("file")                           = 0
    open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
    write(4, "bar\n", 11)            = 11

したがって、ファイルが最初に削除され(unlink("file"))、同じ名前の新しいファイルが作成され(open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644))、修正がそのファイルに書き込まれます(write(4, "bar\n", 11))。

上記のように、inodeが変更されました。同じ名前の新しいファイルです。したがって、書き込み権限のないファイルを実際に変更するのではなく、目次そのディレクトリからファイルを削除し、そのディレクトリに古いファイルと同じ名前で新しいファイルを作成すると、書き込みアクセス権があります。

私は同様の質問に答えました。https://askubuntu.com/a/815849/85695

答え2

vimファイルは変更できませんが、ファイルが関連付けられているディレクトリへの書き込み権限があり、ディレクトリを所有しているか、tその権限にビットを設定していない場合は、ファイルを削除して所有する新しいコピーに置き換えることができます。あなたによって。

これを防ぐには、次の手順をroot実行します。

  • ファイルにimmutablechattr +i)または()フラグを設定しますappend-only。 (これは削除できません。)chattr +aroot
  • 親ディレクトリへの書き込み権限のみがあることを確認してくださいroot(ユーザーrootとビットのみを所有しています;、)。wchown root:chmod u=rwx,go=rx
  • 所有するディレクトリはroot他の人が書き込むことができますが、権限にt(削除制限²)ビット()があります(したがって、ユーザーは自分が所有するファイルのみを削除または名前変更できます)。chmod o+t

/a/b/file¹ ifという名前のファイルに対するthenuserへの書き込みアクセス権がある場合は、名前を変更してその中に独自の名前を再作成することも/aできます。/a/b/a/b.old/a/b/a/b/file

²聞いたことがあるでしょう。粘り強いビットこのビットの用語ですが、通常の実行可能ファイル(非常に古いシステムでのみ)に適用されると、実行可能ファイルのテキストをメモリに保持するようにシステムに指示(指示するために使用されます)されます。このビットは、ディレクトリに適用されるときに他の無関係な意味を持ちます。

関連情報