A algumas semanas descobri que meus sites haviam sido alvo de algum ataque e estavam executando código malicioso. Há muito tempo havia um comportamento estranho com o plugin W3 Total Cache que eu não sabia explicar. O cache somente funcionava se a opção “Fazer cache de usuários logados” estivesse marcada. Quando esta opção não era marcada, o WordPress entendia que o usuário estava logado em qualquer acesso de página e não fazia o cache para o mesmo. Uma situação muito estanha que se repetia em todos os meus sites hospedados no Dreamhost, o que me levou até a desconfiar de algum erro de configuração. Outro problema é que a sessão de um usuário logado era sempre perdida se alguma post ou página fosse acessado. Em outras palavras, quando logado você não podia sair da área de administração para alguma página site ou a sessão seria encerrada.

Eu só descobri que havia algum problema com os sites quando um dia ao entrar em uma página do site a partir do Google, ela foi redirecionada para outra, totalmente diferente. Aí fui analisar o códigos do tema e encontrei várias funções estranhas, com misturas de eval, gzinflate, base64_decode e outras coisas usadas para camuflar o códigos. Várias funções cujos nomes eram aparentemente inofensivos estavam sendo usadas para redirecionar um certo percentual de páginas do site. Em outro arquivo havia um função que era executada no footer colocando centenas de links no fonte da página. Enfim: uma bagunça geral!

Como livrar o seu blog WordPress de código malioso?

Em qualquer situação, se o seu computador de trabalho estiver com algum vírus ou malware, o esforço abaixo pode ser em vão, visto que você poderá subir arquivos contaminados ou mesmo ter sua senha roubada por algum keylogger. Certificar-se de que seu computador está seguro é um requisito básico para os passos seguintes funcionarem, mas está fora do escopo deste artigo.

WordPress: medidas de segurança

WordPress: como se prevenir de ataques

Caso desconfie que alguma senha do seu servidor tenha sido comprometida, uma maneira de evitar o problema é seguir os passos abaixo na ordem em que são apresentados. Caso o invasor tenha deixado código nos seus arquivos, eles poderão infectar novamente a sua instalação WordPress. Estes passos podem ser avançados para quem não tem experiência com aplicativos internet. Leia todos eles antes para ter certeza de que você sabe o que irá fazer. Faça primeiro o teste em algum site pequeno ou apenas com o propósito de aprender, em um sandbox criado para isto.

Faça um backup da base de dados e dos arquivos do seu site – todos dentro do diretório HTTP do usuário, mesmo que sejam vários sites. Um site infectado pode permitir que o código malicioso se replique para todos os outros sites sob o mesmo usuário Linux.

  1. Escolha um horário em que o seu site tenha poucos visitantes, pois ele eventualmente ficará fora do ar.
  2. Troque a senha do FTP.
  3. Desative o servidor FTP e passe a utilizar SFTP ou apenas SSH. O FTP não é seguro no sentido que que o usuário e senha são enviados pela internet sem encriptação e pode ser lido com um simples “sniffer” em qualquer dos servidores pelos quais passar.
  4. Faça uma lista de todos os plugins instalados e widgets utilizados no site e guarde.
  5. Verifique cada arquivo do tema e retire tudo o que não seja necessário. Muitos códigos maliciosos são inseridos no functions.php, footer.php ou qualquer outro arquivo do tema. Revise cada um deles e certifique-se de que está tudo certo com o código PHP. Jamais instale ou mesmo inclua um tema no WordPress (local ou remoto) antes de ter certeza que ele está limpo. Funções como eval() podem executar código obscuro. Não utilize temas com funções assim, mesmo que seja apenas para colocar algum link no footer. O código dentro do eval() pode estar fazendo mais do que isso. Salve o novo tema em um diretório fora do WordPress, localmente.
  6. Faça uma cópia do wp-config.php, conferindo cada linha de código dentro do mesmo. Se você não souber para que serve alguma linha, pesquise. Não deixa nada que não entenda em nenhum arquivo.
  7. Já usando o SFTP, apague completamente o diretório do site no seu servidor web. O domínio estará inacessível neste momento, possivelmente também para o SFTP, caso ele esteja apontando para o domínio do site. Utilize o nome direto ou IP do seu servidor para acessa-lo novamente via FTP, caso preciso.
  8. Troque a senha do MySQL. É feito após modificar o FPT, pois o acesso ao FTP permite ver o arquivo wp-config.php que tem a senha da base de dados.
  9. Instale novamente o WordPress a partir do zero, com arquivos baixados do site oficial.
  10. Substitua o arquivo wp-config.php com o arquivo criado anteriormente.
  11. Acesse a interface de Administração do WordPress.
  12. Troque a senha de administração do WordPress.
  13. Apague qualquer usuário desconhecido que possa existir.
  14. Instale cada um dos plugins novamente a partir do repositório oficial do WordPress. Faça a configuração de cada um deles.
  15. Configure os widgets novamente com eram antes.
  16. Envie o tema do site (o que foi corrigido no passo 5) para o diretório de temas do WordPress.
  17. Ative o tema.
  18. Apague todos os outros temas do diretório de temas e quaisquer plugins desativados. Deixe apenas o essencial pois haverá menos arquivos para serem infectados e o backup (você faz backups, certo?) ficará mais rápido e menor.
  19. Pronto! Seu site WordPress está mais seguro agora.

Se você tem mais de um site sob o mesmo usuário Linux, é bom fazer os passos acima com todos os sites de uma só vez, desativando o acesso a todos eles. Isto ocorre porque logo após consertar um site, ele poderá ser infectado novamente por algum arquivo com código malicioso de outro site. A permissão de acesso do script PHP geralmente permite modificar qualquer arquivo do mesmo usuário, mesmo pertencente a outros sites!

Como medida de segurança principal, seja sempre muito desconfiado de temas, plugins e mesmo widgets que venha a testar ou habilitar. Qualquer destes pode conter trechos de código que irão se replicar e atingir todo o seu site. Tenha sempre um sandbox (ambiente apenas para testes), de preferência em uma máquina virtual descartável para fazer testes não correr o risco de infectar novamente os seus sites. Segurança 100% não existe mesmo quando você segue todas as regras, mas quando o assunto segurança não é tratado com o devido cuidado, a situação fica ainda pior. Existem SEMPRE falhas e bugs a serem explorados em quaisquer softwares para comprometer a segurança. Qualquer site ou software acessível através da internet são alvos em potencial e há ganhos financeiros para quem consegue invadir sites, seja colocando um link no rodapé ou direcionando tráfego para outros domínios. Logo, haverá interessados em burlar qualquer medida de segurança criada e a única saída é tentar se proteger e ficar de olho.

As estatísticas de acesso como o Google Analytics e os logs de acesso do Apache (ou outros servidores web) precisam ser constantemente monitorados do ponto de vista da segurança. Qualquer anormalidade precisa ser explicada. Tudo tem um motivo e se for alguma falha de segurança, melhor que seja descoberta o quanto antes.

No meu caso, a causa mais provável de tudo o que ocorreu foram temas que testei em meu computador e que infectaram os outros que lá estavam. Aí, em algum momento enviei estes temas para o servidor no Dreamhost, infectando o restante dos arquivos PHP do WordPress. Através da análise de logs de acesso, é pouco provável que tenha ocorrido qualquer invasão a partir da própria hospedagem. Inclusive eles foram extremamente solícitos e me enviaram uma listagem de arquivos com código suspeito, que mais tarde constatei estarem mesmo infectados.

Espero que estes passos lhe ajudem a recuperar as visitas de seu site e se livrar das ameaças que encontrar! Qualquer dúvida, só perguntar.

Deixe um comentário

  • (não será divulgado)