一般ユーザーとしてファイルを作成します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
このトグルを使用すると有効になりますsysctl
。fs.protected_regular
。人々は次の方法で前の行動に戻ることができます。
sysctl -w fs.protected_regular=0
しかし、これはOPの場合のような奇妙な「バグ」をなくし、全体的なセキュリティを低下させる可能性があります。
ルートがまだ.ではなく書き込み用に開かれます(またはファイルが書き込み用に開かれたtruncate -s ...
ファイルを削除できる理由は、追加のセキュリティ機能がリンクが解放されるのではなく、書き込み用にファイルを開くときにのみトリガーされるためです)。rm
unlink
unlinkat