AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 761598
Accepted
rhuanpk
rhuanpk
Asked: 2023-11-16 19:08:33 +0800 CST2023-11-16 19:08:33 +0800 CST 2023-11-16 19:08:33 +0800 CST

O usuário normal é capaz de modificar um arquivo de propriedade do root

  • 772

Se o arquivo for um arquivo de texto simples criado pelo root com:

echo 'foo' > ./file.txt

O seu ls -lé:

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

Mas como um usuário comum, posso mudar isso salvando o vim com :w!ou com um comando sed e quando isso acontece o usuário e grupo que possui este arquivo é alterado para:

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

Depois percebi que quando removido outros leram permissão com chmod o-r ./file.txtnão consigo mais fazer as alterações, mas quando restaurado com chmod o+r ./file.txtconsigo novamente.

O que esta acontecendo aqui? Por que a permissão de leitura "outros" me permite alterar um arquivo de propriedade do root e também alterar a propriedade do usuário e do grupo?

Por que isso está acontecendo?

PS: Eu uso o Debian SID.

files
  • 2 2 respostas
  • 631 Views

2 respostas

  • Voted
  1. Best Answer
    terdon
    2023-11-16T19:47:01+08:002023-11-16T19:47:01+08:00

    Isso está acontecendo por causa de duas coisas:

    • vim(pelo menos neste caso) e sed, ao fazer a edição no local, exclua o arquivo original e crie um novo com o mesmo nome.

    • a capacidade de excluir um arquivo depende das permissões do diretório que contém o arquivo, e não das permissões do arquivo em si.

    Então, o que está acontecendo aqui é que você tem permissão de gravação no diretório, o que significa que você pode alterar o conteúdo do diretório, incluindo excluir e criar arquivos. Portanto, quando você executa sed -iou salva com :w!, você está excluindo o original e criando um novo arquivo. É também por isso que a propriedade muda: na verdade, este é um arquivo diferente.

    Você pode demonstrar isso verificando o inode do arquivo antes e depois da edição:

    $ 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
    

    Após esses comandos, tenho file, de propriedade do root, no diretório foo/no qual meu usuário regular tem permissão de gravação. Agora, vamos ls -iverificar o inode e, em seguida, fazer uma alteração sede verificar novamente:

    $ 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
    

    Você também pode ver vimfazendo a mesma coisa executando

    strace vim file 2> strace.out
    

    Em seguida, edite o arquivo e salve com a extensão :w!. No seu strace.out, você verá:

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

    Então, primeiro o arquivo foi excluído ( unlink("file")), depois foi criado um novo arquivo com o mesmo nome ( open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644)) e nele foram gravadas as modificações que eu havia feito ( write(4, "bar\n", 11)).

    Como você pode ver acima, o inode mudou: este é um novo arquivo com o mesmo nome. Então você não alterou realmente um arquivo ao qual não tinha acesso de gravação, você alterou um diretório ao qual tinha acesso de gravação excluindo um arquivo nesse diretório e criando um novo arquivo no diretório com o mesmo nome que o antigo.

    Eu respondi a uma pergunta semelhante aqui: https://askubuntu.com/a/815849/85695 .

    • 20
  2. Stéphane Chazelas
    2023-11-16T19:47:43+08:002023-11-16T19:47:43+08:00

    vimnão pode modificar o arquivo, mas se tiver acesso de gravação ao diretório ao qual o arquivo está vinculado e o tbit não estiver definido para esse diretório, ele poderá excluí-lo e substituí-lo por uma nova cópia de sua propriedade.

    Para evitar isso, rootpode

    • defina o sinalizador immutable( chattr +i) ou append-only( chattr +a) no arquivo (então rootnão será possível excluí-lo)
    • certifique-se de que apenas roottenha acesso de gravação ao diretório pai¹ (de propriedade roote wbit apenas para o usuário; chown root:, chmod u=rwx,go=rx)
    • ter o diretório de propriedade de root, possivelmente gravável por outros, mas ter o tbit (de exclusão restrita²) ( chmod o+t) nas permissões (para que os usuários possam excluir/renomear apenas os arquivos de sua propriedade).

    ¹ Esteja ciente de que, para um arquivo chamado /a/b/fileif usertem acesso de gravação /a, então também pode renomear /a/be /a/b.oldrecriar um /a/barquivo /a/b/filepróprio dentro dele.

    ² você pode ter ouvido o termo sticky bit para esse bit, mas é quando aplicado a arquivos executáveis ​​​​regulares (e apenas em sistemas muito antigos), onde instrui (usado para instruir) o sistema a manter o texto do executável na memória. Quando aplicado a um diretório, esse bit tem um significado diferente e não relacionado.

    • 11

relate perguntas

  • Remova arquivos com os menores sufixos de nome de arquivo

  • Listar arquivos classificados de acordo com a linha de conteúdo específica

  • Como saber antecipadamente se um .zip tem um diretório pai dentro

  • Como encontrar tipos de arquivos específicos e tar-los?

  • du/df e ls relatando diferentes usos de disco

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve