sudo は一時ファイルに書き込めません

sudo は一時ファイルに書き込めません

ここでsudoに権限がない理由を理解しようとしています

touch fred.txt
/tmp$ ls -la fred.txt
-rw-rw-r-- 1 me me 0 Dec 12 15:40 fred.txt
/tmp$ sudo -i
~# cd /tmp
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
/tmp# chmod 666 fred.txt
/tmp# ls -la fred.txt
-rw-rw-rw- 1 me me 0 Dec 12 15:40 fred.txt
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
id
uid=0(root) gid=0(root) groups=0(root)

私の理解では、権限 666 は、所有者、グループ、およびその他のユーザーにファイルの r/w 権限を与えるはずです。id コマンドで証明されているように、root として動作している sudo は、'other' 権限でファイルにアクセスできます。

ここで私は何を誤解しているのでしょうか?

答え1

それは何か関係があるこのコミットLinux カーネルでは、多くの場合/tmp「ワールド書き込み可能」(ここでの「ワールド」は「その他」を意味します) であり、「スティッキー」です。

$ stat /tmp/
...
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
...

chmod(2):

...
S_ISVTX  (01000)  sticky bit (restricted deletion flag, as described in unlink(2))
...
S_IWOTH  (00002)  write by others
...

コミットメッセージで述べられているように、これは影響を受けるファイルへの書き込みを阻止するものではなく、そのようなファイルを で開くことを阻止するものであり、O_CREATこれはopen()これは通常、ターゲットがまだ存在しない場合にファイルの作成をトリガーするように設定されます。したがって、フラグを設定せずに影響を受けるファイルに書き込むことは可能です ( で実行できますdd)。

# ls -l /tmp/meh 
-rwxrwxrwx 1 tom tom 0 Dec 12 17:33 /tmp/meh
# id
uid=0(root) gid=0(root) groups=0(root)
# echo test | dd of=/tmp/meh oflag=append conv=notrunc
dd: failed to open '/tmp/meh': Permission denied
# echo test | dd of=/tmp/meh oflag=append conv=notrunc,nocreat
0+1 records in
0+1 records out
5 bytes copied, 9.4981e-05 s, 52.6 kB/s
# 

これはフラグが設定されているかどうかだけに関するもので、ファイルを作成する必要があるかどうかに関するものではないことに注意してください。懸念事項の場合、ファイルは常に存在するためです。

また、コミットメッセージに記載されているように、ファイルO_CREATただなぜなら、それを開こうとしたユーザー(root)が所有していなかっただけでなく、その所有者( )がディレクトリ( )のtom所有者( )と異なるためです。 が以前のように所有されていた場合は、root/tmp/tmp/tom/tmp/mehrootできるで開きますO_CREAT

こちらもご覧くださいこのコミットsystemd では、これを採用したディストリビューションで「保護」が有効になります:

# sysctl fs.protected_regular
fs.protected_regular = 1

関連するsysctlに注意してください2(または0)も設定できます

関連情報