ルートは一般ユーザーが所有するファイルに書き込めません

ルートは一般ユーザーが所有するファイルに書き込めません

一般ユーザーとしてファイルを作成しますtestuser

$ cat > /tmp/zz

予想通り、このユーザーはファイルを所有しています。

$ ls -lA /tmp/zz 
-rw------- 1 testuser testuser 0 Feb 20 15:32 zz

これで、次のように切り捨てようとするとroot権限が拒否されました。

# truncate --size=0 /tmp/zz
truncate: cannot open '/tmp/zz' for writing: Permission denied

を使用しようとすると、strace次のようになります。

openat(AT_FDCWD, "/tmp/zz", O_WRONLY|O_CREAT|O_NONBLOCK, 0666) = -1 EACCES (Permission denied)
write(2, "truncate: ", 10truncate: )              = 10
write(2, "cannot open '/tmp/zz' for writin"..., 33cannot open '/tmp/zz' for writing) = 33
...
write(2, ": Permission denied", 19: Permission denied)     = 19
write(2, "\n", 1

ルートにこのファイルに書き込む権限がないのはなぜですか?ルートはファイルを削除できますが、書き込むことはできません。

ベストアンサー1

これはLinuxカーネルで利用可能な新しい動作です。バージョン 4.19技術を使用して攻撃を防ぎます/tmp/。このオプションのデフォルト値は、後で有効にしたり、ディストリビューションによって異なる場合があります。

(機能)攻撃者が制御するFIFOまたは一般ファイルへの不注意な書き込み防止:所有者がディレクトリまたはファイルの所有者と同じでない限り、グローバルに書き込み可能な固定ディレクトリからユーザーに属していないFIFOまたは一般ファイルを開く無効にします。開いているファイルはバナーではありません O_CREAT。目的は、データスプーフィング攻撃をさらに困難にすることです。この保護は、シンボリックリンク/ハードリンク保護と同様に、FIFO(protected_fifos)および一般ファイル()のそれぞれに対してsysctlを介してオンまたはオフにすることができます。protected_regular犯罪

これは、ユーザー(通常は十分な権限を持つルートを含む)がディレクトリ内の既存のファイルに書き込んだり、ファイル自体を作成したりする場合などを/tmp防ぐためです。/var/tmp

このトグルを使用すると有効になりますsysctlfs.protected_regular。人々は次の方法で前の行動に戻ることができます。

sysctl -w fs.protected_regular=0

しかし、これはOPの場合のような奇妙な「バグ」をなくし、全体的なセキュリティを低下させる可能性があります。

ルートがまだ.ではなく書き込み用に開かれます(またはファイルが書き込み用に開かれたtruncate -s ...ファイルを削除できる理由は、追加のセキュリティ機能がリンクが解放されるのではなく、書き込み用にファイルを開くときにのみトリガーされるためです)。rmunlinkunlinkat

おすすめ記事