«No Linux não é preciso antivírus» é uma opinião difundida, e na sua forma original está certa: vírus que infetem ficheiros de sistema do Linux praticamente não existem. Num servidor o ClamAV tem outra tarefa, e formula-se assim: encontrar o que foi carregado através do seu sítio. Web shells em primeiro lugar.
O que se procura exatamente
Uma web shell é um pequeno ficheiro PHP que permite executar comandos a partir do navegador. Chega ao servidor por um formulário de carregamento, uma extensão vulnerável ou uma palavra-passe de administrador adivinhada, instala-se entre as imagens da pasta de carregamentos e ali fica meses. Nem a firewall nem o Fail2ban a verão: os pedidos que lhe são dirigidos parecem pedidos vulgares ao sítio.
Além disso, o ClamAV encontra:
- ficheiros maliciosos carregados por utilizadores e redistribuídos a partir do seu servidor: é normalmente disso que trata a carta do alojamento;
- anexos de correio, se o servidor tratar correio;
- software malicioso para Windows em arquivos de ficheiros: ao servidor não interessa, mas o colaborador que descarregar o ficheiro sofrerá as consequências.
Sobre os limites, desde já: o ClamAV não impede uma intrusão nem a deteta por si. Deteta rastos. Uma porta traseira discreta acrescentada a um ficheiro de tema existente escapará a um analisador por assinaturas: para isso serve o controlo de integridade.
Instalação e a definição que importa
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
O segundo comando importa mais do que o primeiro. O freshclam é o serviço de atualização de assinaturas, e se não estiver a correr, o ClamAV torna-se inútil continuando a comunicar análises bem-sucedidas. A idade das bases verifica-se assim:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Bases com mais de uma semana significam mecanismo partido. As causas frequentes são ligações de saída bloqueadas, ou um freshclam lançado à mão como root, depois do que o serviço já não consegue escrever no seu próprio ficheiro por causa das permissões.
Memória: serviço permanente ou execução pontual
Há dois modos de utilização, e a escolha deve ser consciente.
O clamd é um serviço permanente que mantém as bases em memória. Responde depressa mas ocupa cerca de um gigabyte de memória. Num VPS de um ou dois gigabytes isso é inaceitável: o serviço expulsará a base de dados e o PHP-FPM, e o servidor ficará pesado sem motivo visível. Diagnostica-se com free -m e pelo uso da swap.
A alternativa é o clamscan agendado. É mais lento (carrega as bases em cada execução, cerca de um minuto) mas só trabalha durante a análise:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
A opção -i imprime apenas os achados; caso contrário a saída são centenas de milhares de linhas.
Analisar pastas, não o disco
Uma análise completa do disco num servidor modesto dura horas e cria carga, pelo que se agenda para a noite e depois se desliga de vez. É mais prático analisar o que muda mesmo a partir de fora:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Três coisas importam nessa linha. O ionice e o nice eliminam o efeito no sítio. --move em vez de --remove: o ficheiro vai para quarentena em vez de ser apagado, porque os falsos positivos existem e um ficheiro de cliente apagado por engano não se recupera de lado nenhum. E a pasta analisada é aquela onde se carrega, não a raiz.
Assinaturas para web shells
As bases que vêm com o ClamAV são fracas em portas traseiras em PHP: visam sobretudo o tráfego de correio. O Linux Malware Detect (maldet) faz nitidamente melhor: tem um conjunto próprio de assinaturas construído precisamente à volta das web shells, e analisa com o motor do ClamAV se este estiver instalado. A combinação habitual é o ClamAV como motor e base atualizável, e o maldet como fonte de assinaturas especializadas.
O que fazer com um achado
Uma web shell encontrada não é o fim da investigação mas o seu começo. Um ficheiro na pasta de carregamentos significa que alguém conseguiu lá escrever, e apagar o ficheiro não elimina essa possibilidade.
- Não o apague de imediato: guarde uma cópia e anote a hora de modificação do ficheiro.
- Com essa hora, encontre nos registos do servidor web o pedido que o pôs lá. Essa é a vulnerabilidade.
- Procure vizinhos: uma porta traseira quase nunca é deixada num único exemplar.
- Verifique o que mais mudou no disco no mesmo período e se apareceram novas tarefas de cron e chaves SSH.
Uma palavra à parte sobre falsos positivos. As bibliotecas de modelos e o JavaScript minificado caem por vezes numa assinatura. Daí a quarentena em vez da remoção, e daí também o conselho de não ligar sem critério todos os conjuntos de assinaturas alheios que apareçam: a confiança num relatório em que metade das linhas é ruído perde-se numa semana, e depois deixa de ser lido.
O valor prático de um analisador está em os seus resultados saltarem à vista: quando foi a última análise, que idade têm as bases, o que foi encontrado. É uma única linha, mas a sua ausência transforma um antivírus instalado numa caixa assinalada. Como fica essa linha mostra-o a página de demonstração abaixo.