27 abril 2007

Aumento de facilidades = Diminuição da segurança.

Ultimamente tenho assistido ao aparecimento de novas maneiras de instalar programas em linux que me deixam preocupado e com bastantes dúvidas se este será um bom caminho a seguir, vejamos:

Normalmente quando se instalava um programa, este vinha num pacote compactado que tinha nele os ficheiros a instalar, informações de para onde cada ficheiro iria e mais algumas informações sobre o pacote e suas dependências... esse pacote não era um programa, não transmitia ordens ao processador. O pacote era descompactado (instalado) por uma ferramenta que já fazia parte do sistema (o dpkg, o rpm, etc...). Então o "root" (que é como um Deus para o sistema) apenas accionava a ferramenta de instalação que já pertencia ao sistema e não accionava nenhum dos ficheiros que vinham no pacote. Os ficheiros que vinham no pacote instalado eram para ser depois accionados por um utilizador normal, e em linux, um programa accionado por um utilizador fica sempre restringido a ter as mesmas permissões do utilizador que o accionou. Ou seja, se eu não tiver permissão de escrever em /etc então nenhum programa accionado por mim o terá também.
Este pormenor ajuda a manter o sistema quase invunerável a malware... acho mesmo que não é mentira nenhuma afirmar que este detalhe em combinação com muitos outros detalhes do funcionamento do sistema linux, o têm mantido livre de virus durante todos estes anos, porque sempre ouve barreiras muito difíceis de ultrapassar, e o malware não tinha nenhuma brecha por onde entrar.
Não é surpresa para ninguém dizer-se que um virus ou trojan precisa explorar um defeito ou facilidade do sistema para atacar.

Outro detalhe importante é para se ganhar permissões de administrador "root" é preciso introduzir uma password... tudo bem, passwords podem ser adivinhadas, roubadas, e até crackadas... mas isso normalmente leva tempo ou requer inteligência para se conseguir, e um programa malicioso não tem inteligência própria para adivinhar uma password, ele precisava de um processo de passar ao lado dela, o que não tem sido conseguido.

Agora, duas situações que me têm vindo a preocupar:

1-) Estão a aparecer programas para Linux cujo pacote é "auto-instalador", tal e qual como é comum no outro sistema que tão bem conhecemos. Um exemplo é o GoogleEarth, entre outros.
Podemos instalá-los como user normal, mas aí eles vão instalar para a nossa área pessoal, e além de começar a desarrumar o sistema (programas na nossa área pessoal onde é suposto estar apenas documentos) se um Pc tiver 10 utilizadores configurados e todos quiserem o programa, este terá que ser instalado 10 vezes... O melhor é instalá-lo para junto dos outros programas (para o sistema), mas aí terá que ser o root a instalá-lo, e aqui há uma grande diferença:
O root não vai estar a accionar uma ferramenta do sistema, vai estar a accionar um programa novo que chegou de fora... Notem que não estou a dizer mal do GoogleEarth, a minha preocupação é que se esta moda pega, vamos começar a accionar muitos auto-installers (como root) e este é um detalhe que pode ser fácilmente explorado pelos criadores de malware.

2-) "Recentemente" apareceram uma novas distros que estão a fazer bastante sucesso (e ainda bem) devido às suas facilidades de instalação e utilização, e estas distros não têm conta "root"... em vez disso usa-se o comando "sudo" para se ganhar permissão de escrever no sistema, com a agravante de qualquer "sudoer" poder usar "sudo" e ganhar permissões de administrador sem ter que introduzir uma password... considero esta situação de alto risco, pois está aqui um processo de um malware conseguir fácilmente permissões que não deveria ter. Confesso que não sei exactamente como o sudo funciona (nunca o usei), e no meu sistema debian, o pacote sudo tem esta descrição:
Sudo is a program designed to allow a sysadmin to give limited root
privileges to users and log root activity. The basic philosophy is to give
as few privileges as possible but still allow people to get their work done.

as few privileges as possible... ok, na ideia original o sudo não deve ser má ideia...

Mas, pelo que tenho lido, em Ubuntu e seus irmãos (kubuntu, etc), usa-se o sudo para fazer práticamente tudo: reconfigurações, instalar programas, arrancar/parar serviços, etc... e se um utilizador ganha essas permissões chamando apenas um comando (que é sempre o mesmo: sudo isto, sudo aquilo) então um malware vai certamente poder servir-se do mesmo processo, desde que o utilizador que o accionou seja um "sudoer". Ou seja, torna-se possivel para um programa "escalar" nas permissões, e não ficar restringido apenas às permissões do utilizador que o accionou. E nem existe uma password a ultrapassar... acho que era bom que os sudoers tivessem que meter uma password cada vez que usassem sudo, pelo menos isso ia evitar utilizações abusivas do sudo e ia meter um tampão nesta (a meu ver) vulnerabilidade.

Corrijam-me se estou a fazer ideia errada do funcionamento do "sudo" em Ubuntu.

Lembrem-se: se um programa malicioso ganhar permissões de administrador, ele vai ter permissão para fazer tudo o que quiser: destruir por completo o sistema (o mal menor), vai poder modificar as regras da firewall, instalar outros programas cumplices, criar portas secretas de acesso remoto ao Pc, actuar como um espião para roubar informação confidencial e crucial (como codigos de acesso ao net-banking), etc, etc, etc... e não vai haver nada a impedi-lo porque afinal, o root é Deus.


A minha preocupação é que, com estas e provavelmente outras alterações ao funcionamento original do sistema linux, um dia, os utilizadores de algumas distros se vejam obrigados a recorrer à triste situação de ter que usar anti-virus, anti-spywares, etc...

Espero estar enganado...

14 comentários:

Caro Tux Vermelho
Achei o seu artigo muito interessante e também muito importante, pois ele chama a atenção para um item que é essencial em um sistema Gnu/Linux: SEGURANÇA. Acho super válido discutir as questões que você apontou, mas, quanto ao Ubuntu, gostaria de dizer que o sistema sempre (sempre, mesmo!!!) pede a senha do utilizador quando este usa o sudo para adquirir alguns dos privilégios de root, como quando é necessário fazer a instalação ou atualização de programas. Além do mais, nem todos os usuários do sistema são "sudo users". Apenas o utilizador principal pode adquirir privilégios de root pelo sudo. Se ele quiser habilitar outros também poderá fazê-lo!

Engraçado, estava a discutir isto com um amigo meu estes dias atrás...

Mas isso que o camarada de cima ae falou é verdade. O sitema pede o sudo, e o usuário tem que digitar a senha. Após isto existe um tempo que o usuário não precisa digitar a senha do sudo para "sudar". Isto claro, se estiver rodando a mesma seção de terminal.

Acho que a parada toda é usar com sabedoria a parada. Afinal, o usuário final precisa disso tudo pra instalar programas, etc, e não há o que ele faça que possa mudar isso. Ele precisa do sudo.

por isso toda vez que vc abri um terminal aparece uma mensagem disendo pra vc da um sudo passwd
pronto!

por isso que gosto do slack ^^
n temos muitos problemas com seguranca

apenas accionava a ferramenta de instalação que já pertencia ao sistema e não accionava nenhum dos ficheiros que vinham no pacote.

Err, errado. Todos os pacotes das distribuições (DEB, RPM, até mesmo os TGZ's do Slackware) contêm scripts próprios que serão executados como root quando o pacote é instalado. No caso da Debian, existem 4, 2 executados antes e depois de instalar, e os outros 2 executados antes e depois de remover o pacote.
Embora sejam scripts, não seria impossivel obfuscar código maligno dentro desses comandos.


Por outro lado, acho que não percebeste o que é o sudo, e como se relaciona com o su ou com ser root.

O Ubuntu têm uma conta root, tal como qualquer outra distribuição. A diferença é que a conta root não tem uma password válida, logo é impossivel fazer login directamente com essa conta.
O su é usado para fazer uma espécie de login para a conta de root (ou outra conta, se fizeres "su conta"), onde introduzirás a password da outra conta. Ou seja, em vez de fazeres logout e login outra vez, limitas-te a mudar de user.

O sudo é uma versão avançada do su. O sudo tem um ficheiro de configuração (/etc/sudoers, editavem com o comando visudo) onde podes configurar o sudo para se comportar como o su (usar a password da outra conta), para pedir a password do utilizador original, para não pedir a password durante 'x' minutos após o primeiro login, para não pedir password de todo, para todos os comandos ou só para alguns, só durante algumas horas, etc.etc.

Qual é a vantagem? Evitar que users estejam sempre com uma shell de root aberta. Se souberes o que estás a fazer, fazes um "sudo bash". Se não souberes, fazes um "sudo comando", fazes o que tens a fazer, e bazas de root.

Simples e eficiente. BTW, o Mac OS X comporta-se da mesma forma (no caso do sudo e no caso dos instaladores)

PS: tenho-te lido durante algum tempo e não estava à espera de te ter de dar uma "lição" sobre pacotes e o sudo :(

Ok, quanto ao sudo, eu próprio disse que não o conhecia bem, mas posso afirmar que nem sempre ele pede password... foi isso que vi num pc dum amigo meu com ubuntu, e outros utilizadores já me disseram o mesmo... estarão mal configurados?
Qual é o default duma intalação? usa password ou não usa?

@Bruno Rodrigues
Não sabia da existência destes pequenos scripts, estive a esventrar vários pacotes "deb" e encontrei scripts nalguns deles (não em todos). Os pacotes de serviços têm scripts para parar e reiniciar o serviço após a nova versão instalada. Sempre julguei que esse trabalho era feito unicamente pela ferramenta dpkg.

Admito que estava errado... ainda ando a aprender coisas deste sistema como todos nós ;)

vou deixar aqui os meus 5centimos!!!

O Sudo é para mim um dos aspectos que fez o Ubuntu ter o sucesso que tem, simplesmente porque o sistema analisa se aquilo que queres fazer tem de ter permissão root, se tiver que ter avisa que tens de usar o comando sudo e logo a seguir é pedido a pwd do user ao em vez de termos códigos de erros em relação as permissões, depois o admin do sistema pode dar um pouco mais de liberdade a que usa o SO definindo a o sudo para alguns utilizadores

@Bruno
O ubuntu tem conta root e é possivel usa-la normalmente

activar a conta root
sudo passwd root

desactivar a conta root
sudo passwd -l root

root a fazer login para o GNOME
Sistema -> Administração -> Configuração de Ecrã de Início de Sessão
separador Segurança -> Segurança -> Possibilitar utilizador root iniciar sessão em GDM (Activo)

Sou obrigado a concordar com Bruno Rodrigues.

Aliás, sou testemunha de que basta editar o /etc/sudoers para, conforme sua vontade, mandar o usuário digitar a senha toda vez que executar sudo.

Gostava que me indicassem uma coisa:

Qual é a maneira default que o ubuntu instalada ? fica-se a usar ou não password ao usar "sudo" ?

@ArameFarpado o comando sudo usa sempre password, isntala o sudo no teu debian e ve como trabalha, vais ver que nao queres outra coisa!

A configuração padrão (ou "por defeito", como dizem por aí) do Ubuntu é que o usuário deve informar sim a senha ao executar um comando com sudo, mas depois disso não é perguntado novamente por 15 minutos. Depois desse tempo, a senha é requerida novamente, e assim por diante.

Do man sudoers:

timestamp_timeout
        Number of minutes that can elapse before sudo will ask for a passwd again. The default is 15. Set this to 0 to always prompt for a password. If set to a value less than 0 the user’s timestamp will never expire. This can be used to allow users to create or delete their own timestamps via sudo -v and sudo -k respectively.

Aliás, no Ubuntu da forma "como vem de fábrica", apenas os usuários do grupo admin têm permissão para usar o sudo. Ou seja, escolha muito bem quem estará nesse grupo! Aqui sou só eu...

Estes gajos dizem "por defeito" porque são burros, traduzem o "by default" do ingles para defeito. Embora a terminologia "por defeito" se possa aplicar na perfeição aos productos da Microsoft, em todo o resto deverá ser "por omissão" ou "por padrão" como disseste.

Boa comparação, especialmente com certos produtos cheios de recursos "por defeito"...

@luis alves: não foi o que eu disse? "O Ubuntu têm uma conta root, tal como qualquer outra distribuição. A diferença é que a conta root **não tem uma password válida**, logo é **impossivel** fazer login **directamente** com essa conta."

Ou seja, se não tem password, nunca podes fazer login (exemplo: ssh) ou su para root. No entanto, via sudo, podes atribuir uma password à conta root e passar a usá-la normalmente. Porém, continuo a não ver necessidade de o fazer, pois o sudo serve.

@aramefarpado: dá uma espreitadela em /var/lib/dpkg/info/*.post* se quiseres assustar-te com o que os pacotes fazem. Lembra-te que os pacotes deb são instalados como root, logo quem fizer o pacote terá acesso total ao teu sistema >:) (been there, done that)