Estou tentando entender por que sudo não tem permissão aqui
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)
Pelo que entendi, a permissão 666 deve dar ao proprietário, grupo e outras permissões para r/w para o arquivo. Surly sudo que está agindo como root como evidenciado pelo comando id tem acesso ao arquivo sob a permissão 'other'.
O que estou entendendo errado aqui?
Tem algo a ver com este commit no kernel do Linux. Muitas vezes
/tmp
é "gravável no mundo" ("mundo" aqui significa "outros") e é "pegajoso":chmod(2)
:Conforme mencionado na mensagem de confirmação, isso não impede exatamente você de gravar em um arquivo afetado, mas de abrir esse arquivo com
O_CREAT
, que é um sinalizador paraopen()
isso normalmente definido para acionar a criação do arquivo se o destino ainda não existir. Portanto, você ainda pode gravar em um arquivo afetado com o sinalizador não definido (o que pode ser feito comdd
):Observe que é puramente sobre se o sinalizador está definido, mas não se um arquivo precisa ser criado, pois no caso de preocupação, o arquivo sempre existe.
Observe também que, conforme mencionado na mensagem de confirmação, o arquivo não pôde ser aberto
O_CREAT
não apenas porque não era de propriedade do usuário que tentou abri-lo (root
), mas também porque seu proprietário (tom
) é diferente do proprietário (root
) de o diretório (/tmp
). Se/tmp/
fosse de propriedade detom
como/tmp/meh
era,root
teria sido capaz de abri-lo comO_CREAT
.Veja também este commit no systemd que habilita a "proteção" nas distros que o adotaram:
Observe que os sysctls relacionados também podem ser definidos
2
(ou0
) .