Vulnerabilidade WPML

Falha crítica no plugin WPML ameaça 1 milhão de sites WordPress com execução remota de código (RCE)

A vulnerabilidade crítica CVE-2024-6386 no plugin WPML permite execução remota de código. Sites WordPress devem ser atualizados para a versão 4.6.13 imediatamente para evitar compromissos.

Falha crítica no plugin WPML

Uma grave vulnerabilidade de Execução Remota de Código (RCE) foi descoberta no popular plugin WPML, usado em mais de 1 milhão de sites WordPress. A falha, identificada como CVE-2024-6386, permite que usuários autenticados com permissões de contribuidor ou superior executem código malicioso nos servidores afetados. A vulnerabilidade foi corrigida na versão 4.6.13 do plugin, lançada em 20 de agosto de 2024.

A vulnerabilidade foi descoberta em 19 de junho de 2024, por um pesquisador conhecido como stealthcopter, que relatou o problema por meio do programa de Bug Bounty da Wordfence, recebendo uma recompensa de $1,639.00. O problema estava relacionado à injeção de templates do servidor Twig, especificamente na função render() do plugin WPML, que não sanitizava adequadamente as entradas, permitindo a execução de código remoto. Isso representa uma ameaça significativa à segurança de qualquer site que utilize versões do WPML até a 4.6.12.

A Wordfence rapidamente emitiu uma regra de firewall para proteger seus usuários Premium em 27 de junho de 2024, seguida por proteção para usuários da versão gratuita em 27 de julho de 2024. No entanto, o patch oficial só foi disponibilizado em 20 de agosto de 2024, após uma série de tentativas de contato com os desenvolvedores do WPML.

Ameaça de execução remota de código

A falha crítica no WPML permite que atacantes autenticados utilizem a injeção de templates do Twig para executar código malicioso no servidor, potencialmente comprometendo a integridade do site.

Análise técnica da vulnerabilidade no WPML

A vulnerabilidade de Execução Remota de Código (RCE) no plugin WPML foi identificada em uma falha de injeção de template do servidor Twig. Especificamente, a vulnerabilidade reside na função render() da classe WPML_LS_Public_API, que processa os templates fornecidos pelo shortcode [wpml_language_switcher] sem realizar a devida sanitização das entradas. Isso permite que atacantes autenticados com permissões de contribuidor ou superiores injetem código malicioso diretamente no servidor.

O código vulnerável começa com a chamada da função callback() no shortcode wpml_language_switcher. A função callback() converte os argumentos do shortcode e os passa para a função render(), onde a vulnerabilidade é explorada. Abaixo está o trecho de código relevante:

public function callback( $args, $content = null, $tag = '' ) {
    $args = (array) $args;
    $args = $this->parse_legacy_shortcodes( $args, $tag );
    $args = $this->convert_shortcode_args_aliases( $args );
 
    return $this->render( $args, $content );
}

protected function render( $args, $twig_template = null ) {
    $defaults_slot_args = $this->get_default_slot_args( $args );
    $slot_args          = array_merge( $defaults_slot_args, $args );
 
    $slot = $this->get_slot_factory()->get_slot( $slot_args );
    $slot->set( 'show', 1 );
    $slot->set( 'template_string', $twig_template );
 
    if ( $slot->is_post_translations() ) {
        $output = $this->render->post_translations_label( $slot );
    } else {
        $output = $this->render->render( $slot );
    }
 
    return $output;
}

Neste código, a função render() processa o template Twig fornecido como argumento, mas não valida ou sanitiza adequadamente o conteúdo, permitindo que código PHP arbitrário seja executado. Os filtros do Twig, como filter(), podem ser utilizados para chamar funções PHP internas, como array_filter(), que por sua vez pode ser manipulado para executar funções arbitrárias através do operador call_user_func.

Por exemplo, utilizando o seguinte shortcode malicioso, um atacante poderia executar o comando phpinfo() no servidor:

[wpml_language_switcher]
{% set env_chars = _self %}
{% set phpinfo = p~h~p~i~n~f~o %}
{{ {1: phpinfo}|filter(call_user_func) }}
[/wpml_language_switcher]

A execução desse código resulta na chamada de phpinfo(1), expondo informações sensíveis sobre o ambiente PHP do servidor, o que poderia ser um ponto de partida para ataques mais sofisticados. Esse tipo de vulnerabilidade é particularmente perigoso porque permite a execução de código com os privilégios do servidor web, potencialmente levando a um comprometimento total do site?(Wordfence, GitHub,DEC Solutions Group).

Provas de conceito e explorações

Pesquisadores demonstraram que a falha poderia ser explorada para injetar e executar funções PHP, como phpinfo(), sem a necessidade de interação do usuário, tornando a vulnerabilidade extremamente perigosa. Com o uso de funções pré-definidas e filtros do Twig, ataques sofisticados podem ser realizados, levando a compromissos completos do site.

Resposta e mitigação

A Wordfence respondeu rapidamente com uma regra de firewall para seus usuários Premium, mas a vulnerabilidade só foi corrigida oficialmente pelo WPML quase dois meses após a descoberta inicial. Isso ressalta a importância de monitorar constantemente a segurança dos plugins e de aplicar patches de segurança assim que disponíveis.

Dada a gravidade dessa vulnerabilidade, todos os administradores de sites WordPress que utilizam o WPML devem atualizar imediatamente para a versão 4.6.13. Além disso, recomenda-se que medidas adicionais de segurança, como monitoramento contínuo e políticas de senha forte, sejam implementadas para mitigar futuros riscos.