Por que alguns aplicativos param de funcionar quando as permissões são alteradas em / usr / bin?

6

No OS X, um amigo meu alterou as permissões em /usr/bin recursivamente usando o Finder para poder gravar o acesso a todos.

Veja como isso é feito:

Vá para /usr/bin no Finder e, em seguida, mexa com as permissões na parte inferior da janela de informações:

Depoisdisso,nãoémaispossívelexecutarTerminal.app,porexemplo.MasvocêaindapodeexecutaroUtilitáriodeDisco,queénecessárioparaserecuperardissosemumterminal.

Aquiestáoerroquevocêtemnestecaso:

Lastlogin:FriJul415:39:24onttys001login(27006,0x7fff78115310)malloc:***errorforobject0x7fceb3412cc0:pointerbeingfreedwasnotallocated***setabreakpointinmalloc_error_breaktodebug

Porsorte,eurapidamenteencontreiumaperguntamencionandoesseproblema aqui .

Meu primeiro pensamento foi que este é um problema de hardware (talvez alguma corrupção aleatória no disco rígido / na RAM / etc ..).

Como esse erro está relacionado às permissões incorretas em /usr/bin ?

Ao tentar trabalhar no sistema quebrado para obter uma lista de diferenças limpas, recebi o seguinte:

$ sudo -s
sudo: effective uid is not 0, is sudo installed setuid root?

Aqui está o resultado de diskutil verifyPermissions (que resolve o problema BTW):

(muito grande para ser postado aqui)

Cada linha é da forma:

Permissions differ on "usr/bin/sudo"; should be -r-s--x--x ; they are -rwxr-xrwx

mas deixei apenas o nome do arquivo, a permissão que ele deveria ter e a permissão atual:

link

Permissions differ on "usr/bin/login"; should be -r-sr-xr-x ; they are -rwxr-xrwx
    
por alecail 04.07.2014 / 22:40

2 respostas

6

O problema é que, de fato, a maneira como o Finder modifica as permissões não afeta apenas os bits indicados, como se poderia pensar. Por algum motivo, ele zera a primeira octal do modo do arquivo e deixa os bits executáveis intocados. Assim, alguns programas vitais obtêm seus setuid/setgid e sticky bits removidos, o que os torna inúteis ou se comportam de maneira irregular.

O bit setuid é necessário para alguns dos programas em /usr/bin/ , porque eles devem interagir com o sistema em um nível inferior aos programas usuais. Por exemplo, sudo , passwd , newgrp ou login precisam de privilégios além daqueles dados a um usuário comum e é por isso que você precisa de uma senha para executá-los. Se você remover seu bit setuid, eles simplesmente não poderão fazer seu trabalho, o que faz com que eles saiam prematuramente ou até quebras.

Assim, por exemplo, as permissões corretas de /usr/bin/login são 4555 ou -r-sr-xr-x e, após a manipulação de seu amigo, temos 0757 ou -rwxr-xrwx . O Terminal.app chama /usr/bin/login para associar seu usuário a um tty (veja man stty ) e o bit setuid ausente faz com que ele falhe. A liberação de um ponteiro não alocado é provavelmente um erro relacionado a isso. No OS X 10.6.8, eu não recebo este erro de ponteiro, mas Terminal.app sai imediatamente após o início e eu encontro uma entrada como login[6647]: pam_open_session(): system error in /var/log/system.log .

Editar. Como Antoine Lecaille menciona em um comentário, uma maneira simples de tornar o Terminal.app disfuncional é emitir $ sudo chmod -s /usr/bin/login . Observe que você não pode nem abrir uma nova janela depois, pois isso também depende de uma chamada para efetuar login. Para desfazer, basta fazer $ sudo chmod +s /usr/bin/login .

Eu testei o efeito do Finder nas permissões da seguinte forma:

$ # create a directory with the same permissions as /usr/bin
$ mkdir -m 755 test
$ sudo chown root:wheel test
$ ls -l | grep test
drwxr-xr-x 2 root     wheel    68 Jul  6 15:01 test
$ # create 4096 empty files with all possible permissions
$ cd test
$ sudo touch file_{0..7}{0..7}{0..7}{0..7}
$ for perms in {0..7}{0..7}{0..7}{0..7}; do sudo chmod $perms file_$perms; done

O loop for pode levar um minuto para ser concluído porque chmod é lento. Depois disso, você tem arquivos file_wxyz com permissões wxyz na pasta test . Por exemplo

$ ls -l file_4555
-r-sr-xr-x 1 root wheel 0 Jul  6 15:02 file_4555

Agora podemos fazer o truque do seu amigo e alterar as permissões da pasta e todo o seu conteúdo usando o Finder: $ open . e Cmd + I e fazer o que você explicado em seu post. Decidi conceder permissões de leitura para a roda de grupo e direitos de leitura + gravação para todos.

Agora, vamos ver o que aconteceu com nossos arquivos: o canal a seguir lista o diretório, lê a coluna que contém as permissões, classifica-a e suprime as linhas duplicadas:

$ ls -l | awk '{print $1}' | sort -u
-rw-r--rw-
-rw-r--rwx
-rw-r-xrw-
-rw-r-xrwx
-rwxr--rw-
-rwxr--rwx
-rwxr-xrw-
-rwxr-xrwx
total
$ ls -l file_4555
-rwxr-xrwx 1 root wheel 0 Jul  6 15:02 file_4555

Como você pode ver, os setuid / setgid / sticky bits não estão mais configurados; as permissões de leitura e gravação são as mesmas para todos os arquivos; e as permissões agora só diferem em seus bits de execução (dos quais existem oito combinações possíveis).

    
por 06.07.2014 / 15:12
0

Resposta curta

/usr/bin contém links simbólicos cujas permissões não serão modificadas quando você altera as permissões na pasta /usr/bin e, portanto, as permissões são definidas incorretamente nos links simbólicos, o que faz com que o ponteiro se refira a alguma memória inacessível ( Pelo que entendi, inacessível devido ao problema permissões ).

Resposta detalhada

/ bin - Binários do usuário

  1. Contém executáveis binários.
  2. Os comandos comuns do linux que você precisa usar nos modos de usuário único são localizado sob este diretório.
  3. Os comandos usados por todos os usuários do sistema estão localizados aqui.
  4. Por exemplo: ps, ls, ping, grep, cp.

Agora, alteramos as permissões em /usr/bin . Então, vamos ver como as permissões de links simbólicos são afetadas.

Em a entrada da Wikipedia para Symbolic link :

The file system permissions of a symbolic link usually have relevance only to rename or removal operations of the link itself, not to the access modes of the target file which are controlled by the target file's own permissions.

Portanto, agora está claro que a alteração das permissões no arquivo base não afeta as permissões do link simbólico.

Então, o que o erro realmente significa?

Isso significa que o código está tentando liberar algo que não foi alocado usando malloc / realloc . Além disso, qual é o sentido de devolver um ponteiro morto à memória que você liberou?

Com base nas observações acima, acho que depois de alterar as permissões os links simbólicos não puderam ser referenciados, e é por isso que o ponteiro se tornou morto (não há permissão adequada no link simbólico). Então, você obtém o erro acima.

Referências

link link link

    
por 04.07.2014 / 23:19