Vírus no GNU / Linux: fato ou mito?

Sempre que o debate acaba vírus y GNU / Linux não demora muito para o usuário aparecer (geralmente Windows) que dados:

«No Linux não existem vírus porque os criadores desses programas maliciosos não perdem tempo fazendo algo por um sistema operacional que quase ninguém usa »

Ao que sempre respondi:

“O problema não é isso, mas os criadores desses programas maliciosos não perderão tempo criando algo que será corrigido com a primeira atualização do Sistema, ainda que em menos de 24 horas”

E não me enganei, visto que este excelente artigo publicado na Número 90 (Ano de 2008) da Todo Linux Magazine. O ator dele david santo orcero nos fornece de uma forma técnica (mas fácil de entender) a explicação porque GNU / Linux carece deste tipo de software malicioso.

100% recomendado. Agora eles terão mais do que material convincente para silenciar quem fala sem uma base sólida sobre o assunto.

Baixar artigo (PDF): Mitos e fatos: Linux e vírus

EDITAR:

Aqui está o artigo transcrito, pois consideramos que é muito mais confortável ler desta forma:

================================================== ======================

O debate sobre Linux e vírus não é novidade. De vez em quando, vemos um e-mail em uma lista perguntando se há vírus para Linux; e automaticamente alguém responde afirmativamente e afirma que se eles não são mais populares é porque o Linux não é tão difundido quanto o Windows. Também há comunicados à imprensa frequentes de desenvolvedores de antivírus dizendo que lançam versões de vírus Linux.

Pessoalmente, tive uma discussão ocasional com diferentes pessoas por e-mail, ou por lista de distribuição, sobre a questão da existência ou não de vírus no Linux. é um mito, mas é complexo demolir um mito ou, melhor, uma farsa, principalmente se for causado por interesse econômico. Alguém está interessado em transmitir a ideia de que, se o Linux não tem esse tipo de problema, é porque muito poucas pessoas o usam.

No momento de publicar este relatório, gostaria de escrever um texto definitivo sobre a existência de vírus no Linux. Infelizmente, quando a superstição e o interesse econômico aumentam, é difícil construir algo definitivo.
No entanto, tentaremos apresentar um argumento razoavelmente completo aqui para desarmar os ataques de qualquer um que o queira argumentar.

O que é um vírus?

Em primeiro lugar, vamos começar definindo o que é um vírus. É um programa que se copia e se executa automaticamente, e que visa alterar o funcionamento normal de um computador, sem a permissão ou conhecimento do usuário. Para fazer isso, os vírus substituem os arquivos executáveis ​​por outros infectados com seu código. A definição é padrão e é um resumo de uma linha da entrada da Wikipedia sobre vírus.
A parte mais importante desta definição, e o que diferencia o vírus de outro malware, é que um vírus se instala, sem a permissão ou conhecimento do usuário. se não se instalar, não é um vírus: pode ser um rootkit ou um Trojan.

Um rootkit é um patch de kernel que permite que certos processos sejam ocultados dos utilitários da área do usuário. Em outras palavras, é uma modificação do código-fonte do kernel cujo objetivo é que os utilitários que nos permitem ver o que está sendo executado em todos os momentos não exibam um determinado processo, ou um determinado usuário.

Um Trojan é análogo: é uma modificação no código-fonte de um serviço específico para ocultar certa atividade fraudulenta. Em ambos os casos, é necessário obter o código-fonte da versão exata instalada na máquina Linux, corrigir o código, recompilá-lo, obter privilégios de administrador, instalar o executável corrigido e inicializar o serviço –no caso do cavalo de Tróia– ou o sistema operacional. completo - no caso de
rootkit–. O processo, como vemos, não é trivial e ninguém pode fazer tudo isso "por engano". Ambos requerem em sua instalação que alguém com privilégios de administrador, conscientemente, execute uma série de etapas tomando decisões de natureza técnica.

O que não é uma nuance semântica sem importância: para que um vírus se instale, tudo o que precisamos fazer é executar um programa infectado como um usuário comum. Por outro lado, para a instalação de um rootkit ou de um Trojan, é essencial que uma pessoa mal-intencionada entre pessoalmente na conta root de uma máquina e, de forma não automatizada, execute uma série de etapas potencialmente detectáveis. um vírus se espalha com rapidez e eficiência; um rootkit ou um trojan precisa deles para nos perseguir especificamente.

Transmissão de vírus no Linux:

O mecanismo de transmissão de um vírus, portanto, é o que realmente o define como tal, e é a base de sua existência. um sistema operacional é mais sensível a vírus, mais fácil é desenvolver um mecanismo de transmissão eficiente e automatizado.

Suponha que temos um vírus que deseja se espalhar. Suponha que ele tenha sido iniciado por um usuário normal, inocentemente, ao iniciar um programa. Este vírus possui exclusivamente dois mecanismos de transmissão:

  • Replica-se tocando a memória de outros processos, ancorando-se a eles em tempo de execução.
  • Abrindo os executáveis ​​do sistema de arquivos e adicionando seu código –payload– ao executável.

Todos os vírus que podemos considerar como tais possuem pelo menos um desses dois mecanismos de transmissão. O Os dois. Não há mais mecanismos.
Com relação ao primeiro mecanismo, vamos lembrar a arquitetura de memória virtual do Linux e como funcionam os processadores intel. Estes têm quatro anéis, numerados de 0 a 3; quanto menor o número, maiores são os privilégios do código executado naquele anel. Esses anéis correspondem aos estados do processador e, portanto, ao que pode ser feito com um sistema estando em um anel específico. O Linux faz uso do anel 0 para o kernel e do anel 3 para processos. não há código de processo que rode no anel 0, e não há código de kernel que rode no anel 3. Há apenas um único ponto de entrada para o kernel do anel 3: a interrupção 80h, que permite pular da área onde está o código do usuário para a área onde está o código do kernel.

A arquitetura do Unix em geral e do Linux em particular não torna viável a disseminação de vírus.

O kernel ao usar memória virtual faz com que cada processo acredite que possui toda a memória para si. Um processo –que funciona no anel 3– só pode ver a memória virtual que foi configurada para ele, para o anel em que opera. Não é que a memória dos outros processos seja protegida; é que para um processo a memória dos outros está fora do espaço de endereço. Se um processo superasse todos os endereços de memória, ele nem mesmo seria capaz de fazer referência a um endereço de memória de outro processo.

Por que isso não pode ser enganado?
Para modificar os comentários - por exemplo, gerar pontos de entrada no anel 0, modificar vetores de interrupção, modificar a memória virtual, modificar LGDT ... - só é possível a partir do anel 0.
Ou seja, para que um processo possa tocar na memória de outros processos ou no kernel, ele deve ser o próprio kernel. E o fato de haver um único ponto de entrada e os parâmetros serem passados ​​por registradores complica a armadilha - na verdade, ele passa pelo registrador até o que fazer, que é então implementado como um caso na rotina de atenção. a interrupção de 80h.
Outro cenário é o caso de sistemas operacionais com centenas de chamadas não documentadas para tocar 0, onde isso é possível - sempre pode haver uma chamada esquecida mal implementada na qual uma armadilha pode ser desenvolvida - mas no caso de um sistema operacional com um mecanismo de etapa tão simples, não é.

Por esse motivo, a arquitetura da memória virtual impede esse mecanismo de transmissão; nenhum processo - nem mesmo aqueles com privilégios de root - tem uma maneira de acessar a memória de outras pessoas. Poderíamos argumentar que um processo pode ver o kernel; ele foi mapeado a partir de seu endereço de memória lógica 0xC0000000. Mas, por causa do anel do processador em que ele funciona, você não pode modificá-lo; geraria uma armadilha, uma vez que são áreas de memória que pertencem a outro anel.

A "solução" seria um programa que modifica o código do kernel quando ele é um arquivo. Mas o fato de eles serem recompilados torna isso impossível. O binário não pode ser corrigido, pois existem milhões de kernels binários diferentes no mundo. Simplesmente que ao recompilar eles colocaram ou retiraram algo do executável do kernel, ou mudaram o tamanho de um dos rótulos que identificam a versão de compilação - algo que é feito mesmo que involuntariamente - o patch binário não pôde ser aplicado. A alternativa seria baixar o código-fonte da Internet, fazer um patch, configurá-lo para o hardware apropriado, compilá-lo, instalá-lo e reinicializar a máquina. Tudo isso deve ser feito por um programa, automaticamente. Um grande desafio para a área de Inteligência Artificial.
Como podemos ver, nem mesmo um vírus como root pode pular essa barreira. A única solução que resta é a transmissão entre arquivos executáveis. O que também não funciona, como veremos a seguir.

Minha experiência como administrador:

Em mais de dez anos gerencio Linux, com instalações em centenas de máquinas em data centers, laboratórios de alunos, empresas, etc.

  • Eu nunca "peguei" um vírus
  • Eu nunca conheci alguém que tenha
  • Eu nunca conheci alguém que conheceu alguém que tenha

Conheço mais pessoas que viram o Monstro de Loch Ness do que os vírus Linux.
Pessoalmente, admito que fui imprudente e lancei vários programas que os autoproclamados "especialistas" chamam de "vírus para Linux" -de agora em diante, vou chamá-los de vírus, para não tornar o texto pedante-, de minha conta usual contra minha máquina para ver se um vírus é possível: tanto o bash virus que circula por lá - e que, aliás, não infectou nenhum arquivo - quanto um vírus que ficou muito famoso, e apareceu na imprensa. Tentei instalar; e depois de vinte minutos de trabalho, desisti quando vi que uma de suas demandas era ter o diretório tmp em uma partição do tipo MSDOS. Pessoalmente, não conheço ninguém que crie uma partição específica para tmp e a formate para FAT.
Na verdade, alguns dos chamados vírus que testei para Linux exigem um alto nível de conhecimento e a senha de root para serem instalados. Poderíamos nos qualificar, no mínimo, como um vírus "ruim" se precisar de nossa intervenção ativa para infectar a máquina. Além disso, em alguns casos, eles exigem amplo conhecimento do UNIX e da senha do root; o que está muito longe de ser a instalação automática que deveria ser.

Infectando executáveis ​​no Linux:

No Linux, um processo pode simplesmente fazer o que seu usuário e grupo efetivos permitem. É verdade que existem mecanismos para trocar o usuário real por dinheiro, mas pouco mais. Se observarmos onde estão os executáveis, veremos que apenas o root tem privilégios de gravação tanto nesses diretórios quanto nos arquivos contidos. Em outras palavras, apenas o root pode modificar esses arquivos. É o caso no Unix desde os anos 70, no Linux desde as suas origens e num sistema de arquivos que suporta privilégios, ainda não apareceu nenhum erro que permita outro comportamento. A estrutura dos arquivos executáveis ​​ELF é conhecida e bem documentada, portanto, é tecnicamente possível que um arquivo deste tipo carregue a carga em outro arquivo ELF ... desde que o usuário efetivo do primeiro ou o grupo efetivo do primeiro tenha privilégios de acesso. leitura, escrita e execução no segundo arquivo. Quantos executáveis ​​de sistema de arquivos ele poderia infectar como um usuário comum?
Esta pergunta tem uma resposta simples, se quisermos saber quantos arquivos podemos "infectar", lançamos o comando:

$ find / -type f -perm -o=rwx -o \( -perm -g=rwx -group `id -g` \) -o \( -perm -u=rwx -user `id -u` \) -print 2> /dev/null | grep -v /proc

Excluímos o diretório / proc porque é um sistema de arquivos virtual que exibe informações sobre como o sistema operacional funciona. Os arquivos do tipo arquivo com privilégios de execução que encontraremos não representam um problema, já que muitas vezes são links virtuais que parecem ser lidos, escritos e executados e, se um usuário tentar, nunca funciona. Também descartamos erros, muitos - uma vez que, especialmente em / proc e / home, existem muitos diretórios onde um usuário comum não pode entrar - .Este script leva muito tempo. Em nosso caso particular, em uma máquina onde trabalham quatro pessoas, a resposta foi:

/tmp/.ICE-unix/dcop52651205225188
/tmp/.ICE-unix/5279
/home/irbis/kradview-1.2/src
/kradview

A saída mostra três arquivos que poderiam ser infectados se um vírus hipotético fosse executado. Os dois primeiros são arquivos do tipo soquete Unix que são excluídos na inicialização - e não podem ser afetados por vírus -, e o terceiro é um arquivo de um programa em desenvolvimento, que é excluído toda vez que é recompilado. O vírus, do ponto de vista prático, não se espalharia.
Pelo que vemos, a única maneira de espalhar a carga útil é sendo root. Nesse caso, para que um vírus funcione, os usuários devem sempre ter privilégios de administrador. Nesse caso, ele pode infectar arquivos. Mas aqui está o truque: para espalhar a infecção, você precisa pegar outro executável, enviá-lo para outro usuário que usa a máquina apenas como root e repetir o processo.
Em sistemas operacionais onde é necessário ser um administrador para tarefas comuns ou para executar muitos aplicativos diários, esse pode ser o caso. Mas no Unix é necessário ser um administrador para configurar a máquina e modificar os arquivos de configuração, então o número de usuários que a conta root usa como conta diária é pequeno. É mais; algumas distribuições do Linux nem mesmo têm a conta root habilitada. Em quase todos eles, se você acessar o ambiente gráfico propriamente dito, o fundo muda para um vermelho intenso e se repetem mensagens constantes que lembram que essa conta não deve ser utilizada.
Finalmente, tudo o que deve ser feito como root pode ser feito com um comando sudo sem risco.
Por esse motivo, no Linux, um executável não pode infectar outras pessoas, desde que não estejamos usando a conta root como a conta de uso comum; E embora as empresas de antivírus insistem em dizer que existem vírus para Linux, realmente a coisa mais próxima que pode ser criada no Linux é um Trojan na área do usuário. A única maneira de esses Trojans afetar algo no sistema é executando-o como root e com os privilégios necessários. Se normalmente usamos a máquina como usuários comuns, não é possível que um processo iniciado por um usuário comum infecte o sistema.

Mitos e mentiras:

Encontramos muitos mitos, boatos e simplesmente mentiras sobre vírus no Linux. Vamos fazer uma lista deles a partir de uma discussão ocorrida há algum tempo com um representante de um fabricante de antivírus para Linux que ficou muito ofendido com um artigo publicado nesta mesma revista.
Essa discussão é um bom exemplo de referência, pois aborda todos os aspectos dos vírus no Linux. Vamos revisar todos esses mitos, um por um, à medida que foram discutidos naquela discussão específica, mas que foi repetido tantas vezes em outros fóruns.

Mito 1:
"Nem todos os programas maliciosos, especialmente vírus, precisam de privilégios de root para infectar, especialmente no caso particular de vírus executáveis ​​(formato ELF) que infectam outros executáveis".

Resposta:
Quem quer que faça tal afirmação não sabe como funciona o sistema de privilégios do Unix. Para afetar um arquivo, um vírus precisa do privilégio de ler - deve ser lido para modificá-lo - e escrever - deve ser escrito para que a modificação seja válida - no arquivo executável que deseja executar.
É sempre assim, sem exceções. E em cada uma das distribuições, os usuários não root não têm esses privilégios. Então, simplesmente por não ser root, a infecção não é possível. Teste empírico: na seção anterior, vimos um script simples para verificar a variedade de arquivos que podem ser afetados por uma infecção. Se o lançarmos em nossa máquina, veremos como é insignificante e, em relação aos arquivos de sistema, nulo. Além disso, ao contrário de sistemas operacionais como o Windows, você não precisa de privilégios de administrador para executar tarefas comuns com programas comumente usados ​​por usuários normais.

Mito 2:
"Nem precisam ser root para entrar no sistema remotamente, no caso do Slapper, um worm que, explorando uma vulnerabilidade no SSL do Apache (os certificados que permitem comunicação segura), criou sua própria rede de máquinas zumbis em setembro de 2002".

Resposta:
Este exemplo não se refere a um vírus, mas a um worm. A diferença é muito importante: um worm é um programa que explora um serviço para a Internet se transmitir. Não afeta os programas locais. Portanto, afeta apenas os servidores; não para máquinas específicas.
Os vermes sempre foram muito poucos e de incidência desprezível. Os três realmente importantes nasceram nos anos 80, uma época em que a Internet era inocente e todos confiavam em todos. Vamos lembrar que foram eles que afetaram o sendmail, o fingerd e o rexec. Hoje as coisas são mais complicadas. Embora não possamos negar que eles permanecem e que, se não controlados, são extremamente perigosos. Mas agora, os tempos de reação aos vermes são muito curtos. Este é o caso do Slapper: um worm criado em uma vulnerabilidade descoberta - e corrigida - dois meses antes do aparecimento do worm.
Mesmo supondo que todos os usuários do Linux tivessem o Apache instalado e funcionando o tempo todo, simplesmente atualizar os pacotes mensalmente seria mais do que suficiente para nunca correr nenhum risco.
É verdade que o bug SSL causado pelo Slapper era crítico - na verdade, o maior bug encontrado em toda a história do SSL2 e SSL3 - e como tal foi corrigido em poucas horas. Que dois meses depois que esse problema foi encontrado e resolvido, alguém fez um worm em um bug que já foi corrigido, e que este é o exemplo mais poderoso que pode ser dado como uma vulnerabilidade, pelo menos tranquiliza.
Como regra geral, a solução para os worms é não comprar um antivírus, instalá-lo e perder tempo de computação mantendo-o residente. A solução é fazer uso do sistema de atualização de segurança da nossa distribuição: com a distribuição atualizada, não haverá problemas. Executar apenas os serviços de que precisamos também é uma boa ideia por dois motivos: melhoramos o uso de recursos e evitamos problemas de segurança.

Mito 3:
"Não acho que o núcleo seja invulnerável. Na verdade, existe um grupo de programas maliciosos chamados LRK (Linux Rootkits Kernel), que se baseiam precisamente no fato de que exploram vulnerabilidades nos módulos do kernel e substituem os binários do sistema.".

Resposta:
Um rootkit é basicamente um patch de kernel que permite ocultar a existência de certos usuários e processos das ferramentas usuais, graças ao fato de que eles não aparecerão no diretório / proc. O normal é que eles usem no final de um ataque, em primeiro lugar, eles vão explorar uma vulnerabilidade remota para obter acesso à nossa máquina. Em seguida, eles realizarão uma sequência de ataques para aumentar os privilégios até que tenham a conta root. O problema quando o fazem é como instalar um serviço em nossa máquina sem ser detectado: é aí que entra o rootkit. É criado um usuário que será o usuário efetivo do serviço que queremos ocultar, instalam o rootkit e ocultam esse usuário e todos os processos pertencentes a ele.
Como ocultar a existência de um usuário é útil para um vírus é algo que poderíamos discutir longamente, mas um vírus que usa um rootkit para se instalar parece divertido. Vamos imaginar a mecânica do vírus (em pseudocódigo):
1) O vírus entra no sistema.
2) Localize o código-fonte do kernel. Se não for, ele mesmo o instala.
3) Configure o kernel para as opções de hardware que se aplicam à máquina em questão.
4) Compile o kernel.
5) Instale o novo kernel; modificando LILO ou GRUB se necessário.
6) Reinicialize a máquina.

As etapas (5) e (6) requerem privilégios de root. É um tanto complicado que as etapas (4) e (6) não sejam detectadas pelo infectado. Mas o engraçado é que há alguém que acredita que existe um programa que pode fazer os passos (2) e (3) automaticamente.
Para culminar, se nos depararmos com alguém que nos diga "quando houver mais máquinas Linux haverá mais vírus" e recomende "ter um antivírus instalado e atualizá-lo constantemente", pode ser relacionado à empresa que vende o antivírus e atualizações . Desconfie, possivelmente o mesmo dono.

Antivírus para Linux:

É verdade que existem bons antivírus para Linux. O problema é que eles não fazem o que os defensores dos antivírus argumentam. Sua função é filtrar o e-mail que passa de malware e vírus para o Windows, bem como verificar a existência de vírus de Windows em pastas exportadas via SAMBA; portanto, se usarmos nossa máquina como um gateway de correio ou como NAS para máquinas Windows, podemos protegê-los.

Clam-AV:

Não terminaremos nosso relatório sem falar sobre o principal antivírus para GNU / Linux: ClamAV.
ClamAV é um antivírus GPL muito poderoso que compila para a maioria dos Unix disponíveis no mercado. Ele é projetado para analisar anexos de mensagens de correio que passam pela estação e filtrá-los em busca de vírus.
Esta aplicação integra-se perfeitamente com o sendmail para permitir a filtragem de vírus que podem ser armazenados nos servidores Linux que fornecem correio às empresas; ter um banco de dados de vírus que é atualizado diariamente, com suporte digital. O banco de dados é atualizado várias vezes ao dia, e é um projeto animado e muito interessante.
Este poderoso programa é capaz de analisar vírus até mesmo em anexos em formatos mais complexos para abrir, como RAR (2.0), Zip, Gzip, Bzip2, Tar, MS OLE2, arquivos MS Cabinet, MS CHM (HTML COprinted) e MS SZDD.
O ClamAV também oferece suporte a arquivos mbox, Maildir e mail em formato RAW e arquivos executáveis ​​portáteis compactados com UPX, FSG e Petite. O par Clam AV e spamassassin é o par perfeito para proteger nossos clientes Windows de servidores de e-mail Unix.

CONCLUSÃO

Para a pergunta Existem vulnerabilidades nos sistemas Linux? a resposta é certamente sim.
Ninguém em sã consciência duvida disso; Linux não é OpenBSD. Outra coisa é a janela de vulnerabilidade que um sistema Linux possui que está devidamente atualizada. Se nos perguntarmos, existem ferramentas para tirar vantagem dessas falhas de segurança e explorá-las? Bem, sim, mas estes não são vírus, são exploits.

O vírus deve superar várias outras dificuldades que sempre foram colocadas como uma falha / problema do Linux pelos defensores do Windows, e que complicam a existência de vírus reais - kernels que são recompilados, muitas versões de muitos aplicativos, muitas distribuições, coisas que eles não são passados ​​automaticamente de forma transparente para o usuário, etc.–. Os atuais "vírus" teóricos devem ser instalados manualmente a partir da conta root. Mas isso não pode ser considerado um vírus.
Como sempre digo aos meus alunos: não acredite em mim, por favor. Baixe e instale um rootkit na máquina. E se quiser mais, leia o código-fonte dos “vírus” existentes no mercado. A verdade está no código-fonte. É difícil para um vírus "autoproclamado" continuar a nomea-lo dessa forma depois de ler seu código. E se você não sabe ler código, uma única medida de segurança simples que recomendo: use a conta root apenas para administrar a máquina e manter as atualizações de segurança atualizadas.
Só assim é impossível que um vírus entre em você e é muito improvável que worms ou alguém ataquem sua máquina com sucesso.