Sudo e vi, uma combinação perigosa PDF Imprimir E-mail
Artigos - Linux
Escrito por Fernando Mercês   
Ter, 26 de Maio de 2009 22:21

 

Hoje escrevo para comentar sobre uma baita falha de segurança, já antiga, mas ainda muito presente em redes Linux  "descuidadas". Dependendo da forma de como o administrador delega funções para outras pessoas no âmbito administrativo (um webmaster que precise reiniciar o Apache, por exemplo), uma grande falha de segurança que envolve o vi pode expor todo o seu ambiente. Mas não se assuste, além de tecnicamente não ser uma falha nem do sudo, nem do vi, é fácil de corrigir.

 

Imagine uma situação onde você, administrador de um sistema Linux, precisa delegar algumas permissões para o webmaster da empresa. Este pode editar as configurações do Apache 2 (diretório /etc/apache2) e gerenciar o serviço do Apache (parar, reiniciar, etc).

Então você edita seu arquivo /etc/sudoers e permite que o usuário "webmaster" rode os programas kill e vi. Além disso, você dá as permissões necessários no diretório do Apache, assim como em /var/www, onde pode estar armazenado o site e assim por diante. Assim sendo, o webmaster pode rodar:

 

webmaster@server:~$ sudo vi /etc/apache2/apache2.conf

webmaster@server:~$ sudo killall apache2

 

Até então nada de mais. O problema está em o webmaster poder rodar o vi como root (usando o sudo). Para quem não sabe (ou não lembra), o vi pode rodar comandos do shell facilmente e inclusive há formas de escapar para o shell. Se o vi é rodado como root (via sudo), não se engane, qualquer comando pode ser dado como root também. Basta comandar :! <comando> e pronto. O vi pausará sua execução, rodará o comando e voltará à tela de edição. Veja o exemplo abaixo:

 

webmaster@server:~$ sudo vi

~ VIM - Vi IMproved  
~  
~ version 7.1.314  
~ by Bram Moolenaar et al.  
~ Vim is open source and freely distributable  
~  
~ Become a registered Vim user!  
~ type :help register<Enter> for information  
~  
~ type :q<Enter> to exit  
~ type :help<Enter> or <F1> for on-line help  
~ type :help version7<Enter> for version info  
~  
~ Running in Vi compatible mode  
~ type :set nocp<Enter> for Vim defaults  
~ type :help cp-default<Enter> for info on this

 

Agora experimente comandar :! whoami e veja o resultado:

 

fernando@homer:~$ sudo vi
root
Press ENTER or type command to continue

 

O comando whoami foi executado como root, porque o vi também foi (você deu a permissão de executar o vi como sudo para o webmaster, lembra?). Isso significa que ele pode rodar qualquer comando como root, o que conseqüentemente pode trazer problemas. Para piorar as coisas, ele também pode fazer o seguinte no vi:

 

:! /bin/bash

 

E o resultado é:

 

webmaster@server:~$ sudo vi
root@server:~#

 

Bem, ficou claro o problema: o usuário caiu no BASH, logado como root. Há várias formas de se corrigir isso. A mais fácil é rodar o rvim ao invés do vi. Este é um vi "quase" completo, pois tem restrições principalmente no quesito segurança. Pelo rvim o usuário não pode rodar um comando do shell e não conseguirá escapar para um root shell. Por padrão o rvim é instalado em várias distribuições. Portanto, use a permissão para o rvim no sudoers e restrinja ao máximo o uso do sudo, este ilustre aliado pode se tornar um problema quando mal utilizado.

/bin/echo "Até o próximo artigo!!!"