PostHeaderIcon O desafio: “chmod 000 /bin/chmod”. E agora? O que fazer?

Recentemente, postei em minha página no Twitter o desafio de como resolver o seguinte problema:

"chmod 000 /bin/chmod"

Com esse comando, você está utilizando o chmod, responsável por mudar as permissões de um arquivo, para retirar todas as permissões do próprio comando chmod. Feito isso, ninguém, nem o administrador de sistemas, estará apto a alterar as permissões dos arquivos do sistema utilizando o próprio comando chmod. Diante disso, o que fazer para resolver o problema?

Bem, uma das saidas, utilizando apenas recursos dos comandos do próprio sistema operacional e propriedades dos sistemas de arquivos, consiste em utilizar as permissões de um outro arquivo que tenha o modo de execução habilitado substituindo seu conteúdo pelo do próprio comando chmod. Não entendeu? Então, permita-me explicar um pouco melhor.

Em um sistema de arquivo como o EXT2/EXT3 (e agora o EXT4), por exemplo, os metadados de um arquivo ficam em um local separado do seu conteúdo. Dentre esses metadados estão informações como a data da última modificação, o dono e o grupo do arquivo, seu tamanho e as próprias permissões atribuídas a ele. Em outras palavras, ao substituir o conteúdo de um arquivo, não se altera os atributos tais como as permissões.

Retomando o cenário após a execução do comando "chmod 000 /bin/chmod", o que nos restará é o comando /bin/chmod com essas características:

root@scadufax:~# ls -l /bin/chmod
———- 1 root root 46664 2008-06-26 21:31 /bin/chmod

Como foi dito anteriormente, utilizando o chmod, não é possível, mesmo para o super-usuário, alterar permissões de outros arquivos:

root@scadufax:~# chmod 000 /bin/cp
-su: /bin/chmod: Permission denied

Para resolver o problema, é possível aproveitar as permissões de um arquivo que já tenha privilégio de execução e depois substituir o seu conteúdo pelo o do comando chmod. Para isso, basta pegar qualquer comando do diretório /bin e copiá-lo para um diretório qualquer:

root@scadufax:~# cp -p /bin/cp /tmp
root@scadufax:~# ls -l /tmp/cp
-rwxr-xr-x 1 root root 75492 2009-11-01 09:37 /tmp/cp

Observe que as permissões de execução encontram-se configuradas. Depois, deve-se substituir o conteúdo desse arquivo pelo do comando chmod que não possui quaisquer permissões e copiá-lo novamente para o diretório /bin renomeando-o para chmod novamente:

root@scadufax:~# cat /bin/chmod > /tmp/cp
root@scadufax:~# mv /tmp/cp /bin/chmod
root@scadufax:~# ls -l /bin/chmod
-rwxr-xr-x 1 root root 46664 2009-11-01 09:42 /bin/chmod

Pronto… era isso! Antes de você se perguntar o porquê de tudo isso, eu me adianto: pra NADA a não ser se divertir um pouco e conhecer algo a mais  dos sistemas GNU/Linux e de suas características!

Inicialmente, postei essa questão no Twitter e, pelo menos dois amigos postaram outras soluções. Vou pedir a ambos que postem essas soluções aqui. Se você tiver outras alternativas, registre-as por aqui!

 

9 Responses to “O desafio: “chmod 000 /bin/chmod”. E agora? O que fazer?”

  • Gabriel Menini disse:

    Aida pode fazer cat no /bin/chmod com as permissões 000?

  • admin disse:

    Sim, Gabriel! O cat funciona perfeitamente. É só testar em sua própria instalação GNU/Linux. Curioso, não?

    Abraço e obrigado pela visita.

    Jansen

  • Jonny disse:

    Na minha distro (Debian), nao consigo fazer cat de arquivos com permissão -r. Como sairia dessa sem ter que copiar o chmod de outra máquina?

  • Cardox disse:

    CAT precisa de direito de leitura. Fiz um teste em um arquivo genérico aqui, usando Debian e SuSE e dá erro. Em minha opinião não procede.

  • Anderson Eduardo disse:

    Criaria meu proprio chmod! :)
    Só usar as syscalls.

  • Jansen Sena disse:

    Cardox,

    testei também no Debian e funciona perfeitamente. Experimente fazer os comandos com o próprio chmod conforme o post.

    Abraço e obrigado pela visita no site!

    Jansen

  • Ei, vale isso? :)

    macan:/home/macan# python
    Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
    [GCC 4.4.5] on linux2
    Type “help”, “copyright”, “credits” or “license” for more information.
    >>> import os
    >>> os.chmod(‘/bin/chmod’,0755)
    >>>

  • Outra opção, se você não tiver python, perl é provável que você tenha, mesmo em sistemas beeem antigos.

    perl -e ‘chmod 0755, “/bin/chmod”‘

  • Jansen Sena disse:

    Maçan,

    é em momentos como esses que podemos identificar as preferências e as ferramentas do dia-a-dia de cada um, não é verdade? Logicamente que as soluções em Perl e em Python são válidas também e resolvem o problema!

    Brincadeira interessante essa, não? Ajuda a despertar o interesse e o compartilhamento de soluções distintas!

    Abraço,

    Jansen

Leave a Reply