WP Cerber Security 9.9
English version: WP Cerber Security 9.9
Em resumo
O WP Cerber 9.9 chegou, e esta versão é toda sobre resiliência. Criamos um mecanismo de autorrecuperação para as configurações do seu plugin, corrigimos diversas falhas de detecção no detector de JavaScript ofuscado do Traffic Inspector e resolvemos uma série de erros fatais que podiam derrubar um site em determinados ambientes de hospedagem. Se você usa o WP Cerber em um site com alto tráfego ou em uma hospedagem antiga, esta atualização torna sua instalação visivelmente mais robusta.
Principais destaques
- Novo: Backup e recuperação automáticos das configurações do plugin, com relatórios claros quando a recuperação ocorre.
- Segurança: Múltiplas etapas de reforço da segurança do detector de JavaScript ofuscado usado pelo Inspetor de Tráfego, eliminando vetores de bypass reais.
- Confiabilidade: O WP Cerber agora funciona corretamente em ambientes de hospedagem legados onde o PHP não possui o driver de banco de dados mysqlnd moderno.
- Correções de bugs: Foi corrigido um cenário de corrupção de configurações que causava o travamento do site no PHP 8, juntamente com uma regressão na detecção de JavaScript com escape hexadecimal.
Novos recursos
Backup e recuperação automáticos para configurações de plugins
Esta é a principal novidade desta versão. O WP Cerber agora mantém uma cópia da última versão válida conhecida de sua configuração no armazenamento de chave-valor do plugin. O backup é atualizado após cada atualização de configurações bem-sucedida, importação de configurações, atualização do plugin e pela tarefa de manutenção diária. Somente configurações válidas podem substituir o backup existente, portanto, um estado inválido nunca poderá sobrescrever um estado válido.
Por que isso é importante? Se a configuração do plugin armazenada no banco de dados se tornar ilegível, o WP Cerber detecta a corrupção e restaura automaticamente a configuração a partir do backup. Você mantém suas regras de firewall, listas de acesso e configurações de notificação, em vez de retornar silenciosamente às configurações padrão de fábrica.
O processo de recuperação é totalmente transparente. Cada resultado é relatado através do monitor de problemas do plugin:
- Após uma restauração automática bem-sucedida, você verá um aviso que pode ser fechado, explicando o que aconteceu, qual ação foi tomada e o que você deve revisar. O aviso desaparece automaticamente depois que você revisar e salvar suas configurações.
- Caso o backup esteja ausente, seja inválido ou a recuperação falhe, um problema crítico é registrado com orientações práticas e metadados de diagnóstico relevantes, sem expor configurações serializadas ou detalhes internos do armazenamento.
- Estados de problemas contraditórios ou duplicados são evitados, para que você nunca veja avisos conflitantes.
Caso a recuperação não seja possível, o recurso de último recurso para as configurações padrão é preservado, e essas configurações padrão são persistidas no banco de dados para que o plugin inicie a partir de um estado determinístico. Também reforçamos o caminho de restauração contra caches de opções desatualizados: o valor corrompido é explicitamente excluído antes que o valor restaurado seja gravado, e o backup é armazenado e carregado ignorando o cache de objetos, de modo que apenas o registro persistente do banco de dados seja considerado confiável.
Aviso para hosts sem o driver mysqlnd
Um novo detector de avisos no widget "Preparação do Sistema" identifica servidores onde a extensão mysqli do PHP foi compilada com a biblioteca legada libmysqlclient em vez da moderna mysqlnd. O aviso é informativo. Ele confirma que o WP Cerber continua funcionando por meio de uma alternativa compatível e recomenda habilitar o mysqlnd para total compatibilidade e melhor desempenho. Isso fornece um diagnóstico concreto e prático para você apresentar ao seu provedor de hospedagem.
Alterações de segurança e controle de acesso
Detecção reforçada de JavaScript ofuscado no Inspetor de Tráfego
O Traffic Inspector inspeciona campos de requisição públicos em busca de JavaScript ofuscado, e esta versão corrige diversas lacunas de cobertura e vetores de bypass nesse detector, mantendo seu baixo índice de falsos positivos.
Cobertura mais ampla de sequências de escape. O detector anteriormente reconhecia apenas escapes hexadecimais \xNN em strings totalmente escapadas. Agora, ele também detecta escapes Unicode \uNNNN e \u{...} , incluindo strings que misturam os formatos suportados. A decodificação é restrita a pontos de código ASCII, e escapes parciais e expressões arbitrárias permanecem deliberadamente fora do escopo para evitar falsos positivos.
Detecção de tipos primitivos ocultos em chamadas fromCharCode(). Os payloads decodificados de construções explícitas de String.fromCharCode() agora são verificados quanto a tipos primitivos de execução, DOM, rede e sistema, e não apenas URLs externas e endereços IP. A decodificação é restrita a literais decimais e hexadecimais validados, suporta múltiplas chamadas, prefixos 0X em maiúsculas e vírgulas opcionais no final, e aplica a semântica ToUint16 do JavaScript para que os valores decodificados correspondam ao que um navegador realmente produziria. A correspondência de tipos primitivos com reconhecimento de token e limites de identificadores significa que palavras comuns como "descrição" e "avaliação" não são mais correspondidas nas substrings eval ou script .
Mitigação de vulnerabilidades de inteiros encapsulados. String.fromCharCode() aplica a conversão de inteiros de 16 dígitos (`ToUint16`) a cada argumento, de modo que um código ASCII somado a um múltiplo de 65536 resulta no mesmo caractere. Anteriormente, o detector aceitava apenas literais de até seis dígitos, o que significava que valores com sete ou mais dígitos encapsulados burlavam completamente a detecção. Agora, o detector aceita literais decimais e hexadecimais sem sinal até o limite de Number.MAX_SAFE_INTEGER do JavaScript e reduz cada token deterministicamente à sua unidade de código `ToUint16`, independentemente do tamanho do inteiro da plataforma. O comprimento do token é limitado durante a conversão, portanto, um literal de tamanho excessivo não pode gerar processamento ilimitado por dígito em uma requisição pública, eliminando uma possível vulnerabilidade de negação de serviço (DoS).
Não há supressão por meio de um único token inválido. Anteriormente, um token fora do intervalo ou ambíguo descartava toda a chamada decodificada, permitindo que um atacante adicionasse um único valor não suportado a uma carga útil detectável e suprimisse a detecção. Agora, um token estruturalmente válido, mas não suportado, é mapeado para um caractere sentinela e o restante da chamada ainda é decodificado. A chamada inteira é ignorada apenas quando a lista de argumentos está malformada ou não é numérica.
As cargas úteis separadas por comentários deixaram de ser um ponto cego. A compactação de entrada do detector removeu apenas espaços em branco genéricos, o que deixou os comentários JavaScript intactos e permitiu que argumentos numéricos separados por comentários, como String.fromCharCode(101,/*x*/118,97,108,40,49,41,59) passassem despercebidos. O detector agora remove comentários de bloco JS, comentários de linha e espaços em branco lexicais fora de strings entre aspas antes de executar suas heurísticas, e lida com listas de argumentos que abrangem várias linhas.
Para o proprietário de um site WordPress, o resultado prático é simples: diversas técnicas realistas que um atacante poderia usar para burlar o Inspetor de Tráfego com JavaScript ofuscado deixam de funcionar, e o detector permanece conservador o suficiente para não sinalizar tráfego legítimo.
Melhorias na confiabilidade
Compatibilidade com drivers de banco de dados legados
O WP Cerber agora funciona corretamente em ambientes de hospedagem onde o PHP não fornece o driver de banco de dados moderno mysqlnd. A camada de banco de dados verifica a disponibilidade de mysqli_fetch_all() antes de utilizar o caminho rápido do mysqlnd. Quando este não está disponível, os conjuntos de resultados são obtidos linha por linha por meio de um método compatível, preservando a ordem das linhas, o formato dos resultados e o contrato de tratamento de erros existente. Em vez de um erro fatal, você obtém uma alternativa mais lenta, porém totalmente funcional, além do aviso descrito acima.
Correções de erros
Erro fatal em sites com configurações corrompidas (PHP 8)
Um valor de configuração corrompido e não serializável no banco de dados causou um erro fatal TypeError na array_merge() durante o carregamento do plugin no PHP 8, derrubando todo o site. O carregamento das configurações agora valida o valor armazenado e, caso não seja possível analisá-lo, utiliza as configurações padrão. A falha é registrada como um problema crítico persistente e é resolvida automaticamente quando o administrador salva as configurações novamente. O problema de corrupção ocorre somente quando um valor armazenado não vazio realmente falha ao ser desserializado; portanto, um valor vazio, que simplesmente significa que as configurações ainda não existem, nunca dispara um alarme falso. Combinado com o novo recurso de backup e recuperação, isso transforma um cenário de falha do site em um cenário de autorrecuperação.
Erro fatal em hosts sem mysqlnd
A camada de banco de dados chamava mysqli_result::fetch_all() , que requer o driver `mysqlnd` e não existe em hosts que executam `mysqli` com `libmysqlclient`, causando um erro fatal. O caminho rápido agora está protegido e recorre à busca linha por linha, conforme descrito na seção de confiabilidade acima.
Regressão na detecção de JavaScript com escape hexadecimal
Uma regressão no detector de JavaScript ofuscado impedia a decodificação de strings compostas exclusivamente por sequências \xNN . A etapa de normalização utilizava a função trim() com uma máscara de caracteres que removia a barra invertida inicial do primeiro escape, juntamente com as aspas de abertura, produzindo uma string de comprimento ímpar que era ignorada pela proteção de decodificação. Como resultado, primitivas com escape hexadecimal, como eval , script e XMLHttpRequest , não eram detectadas no caminho do campo de requisição do Traffic Inspector com a opção padrão ativada. A decodificação agora funciona corretamente, restaurando a detecção dessas primitivas ofuscadas.
Ignorar argumentos separados por comentário do código de caractere
Argumentos numéricos válidos, separados por comentários, em chamadas fromCharCode() não eram detectados porque os comentários em JavaScript permaneciam intactos durante a compactação da entrada. Isso foi corrigido conforme descrito na seção de segurança acima.
Resumo
A versão 9.9 é uma atualização que você provavelmente nem notará, e esse é o objetivo. Suas configurações agora sobrevivem à corrupção do banco de dados em vez de desaparecerem. Uma peculiaridade do ambiente de hospedagem que costumava causar a falha do plugin agora se comporta de forma controlada e informa exatamente o que você precisa pedir ao seu provedor de hospedagem para corrigir. Para o administrador, a experiência diária é a mesma: o painel de controle familiar, executado em uma base que se recupera de falhas automaticamente e inspeciona o tráfego malicioso com menos pontos cegos.