O uso de APIs REST no desenvolvimento de plugins para WordPress trouxe diversas vantagens para integrações e expansão de funcionalidades. No entanto, a má implementação de autenticação e autorização pode introduzir vulnerabilidades críticas. Neste artigo, analisamos uma vulnerabilidade comum e extremamente grave em APIs REST de plugins, onde a ausência de verificação de permissões permite que qualquer pessoa, mesmo sem estar autenticada, crie um usuário administrador no site.

Descrição da Vulnerabilidade

A falha consiste na exposição de um endpoint da API REST sem qualquer controle de autenticação. Isso ocorre devido ao uso incorreto do parâmetro permission_callback no momento do registro da rota da API. Quando este parâmetro é definido como __return_true, o endpoint se torna acessível publicamente para qualquer requisição, sem exigir que o solicitante esteja logado ou possua qualquer nível de permissão.

O endpoint analisado permite a criação de usuários no sistema. No entanto, além de criar usuários, ele os cadastra diretamente com a função de administrador, o que oferece controle total do site ao atacante.

Detalhes Técnicos

Registro do Endpoint Vulnerável

O código abaixo ilustra como o plugin vulnerável registra a rota na API REST:

phpCopiarEditaradd_action( 'rest_api_init', function () {
    register_rest_route( 'vapi/v1', '/create-user/', array(
        'methods'  => 'POST',
        'callback' => 'vapi_create_user_callback',
        'permission_callback' => '__return_true', // Acesso público sem restrição
    ));
});

A função __return_true é um atalho no WordPress que retorna sempre “true”, o que significa que qualquer pessoa tem permissão para acessar esse endpoint.

Função Callback Vulnerável

phpCopiarEditarfunction vapi_create_user_callback( $request ) {
    $username = sanitize_text_field( $request->get_param('username') );
    $password = sanitize_text_field( $request->get_param('password') );
    $email    = sanitize_email( $request->get_param('email') );

    if ( username_exists( $username ) || email_exists( $email ) ) {
        return new WP_Error( 'user_exists', 'Usuário ou e-mail já existe.', array( 'status' => 400 ) );
    }

    $user_id = wp_create_user( $username, $password, $email );
    if ( is_wp_error( $user_id ) ) {
        return new WP_Error( 'create_failed', 'Erro ao criar usuário.', array( 'status' => 500 ) );
    }

    $user = new WP_User( $user_id );
    $user->set_role( 'administrator' );

    return array(
        'success' => true,
        'user_id' => $user_id,
        'message' => 'Usuário administrador criado com sucesso!'
    );
}

Este código executa a criação de um usuário e, sem qualquer verificação de privilégios, atribui imediatamente o papel de administrador.

Demonstração do Ataque

A exploração é extremamente simples e pode ser realizada com uma única requisição HTTP POST.

Exemplo usando curl:

rubyCopiarEditarcurl -X POST http://localhost/wordpress/wp-json/vapi/v1/create-user/ \
-d "username=hacker" \
-d "password=senha123" \
-d "email=hacker@exemplo.com"

Resposta da API:

jsonCopiarEditar{"success":true,"user_id":2,"message":"Usuário administrador criado com sucesso!"}

Após executar esse comando, o usuário “hacker” com permissões de administrador está criado no site WordPress.

Assista o video demonstração:

Impacto

O impacto dessa vulnerabilidade é crítico. Um atacante pode:

  • Obter acesso total ao painel administrativo do WordPress.
  • Inserir backdoors, malwares ou shells no servidor.
  • Alterar ou deletar conteúdo do site.
  • Modificar configurações, alterar DNS, derrubar o site ou distribuir códigos maliciosos.
  • Comprometer dados de usuários e clientes.

Causa Raiz

  • Uso incorreto de permission_callback, permitindo acesso irrestrito.
  • Ausência total de verificação de autenticação.
  • Falta de validação de privilégios para a criação de usuários com funções elevadas.

Correção

A correção adequada exige duas medidas principais:

  1. Implementar verificação de autenticação no permission_callback:
phpCopiarEditar'permission_callback' => function () {
    return current_user_can( 'create_users' );
}
  1. Realizar uma checagem extra dentro da função callback, caso necessário, reforçando a segurança:
phpCopiarEditarif ( ! current_user_can( 'create_users' ) ) {
    return new WP_Error( 'forbidden', 'Você não tem permissão para executar esta ação.', array( 'status' => 403 ) );
}

Essas medidas garantem que apenas usuários devidamente autenticados e com privilégios administrativos possam acessar e executar a funcionalidade.

Lições e Boas Práticas

  • Nunca exponha endpoints sem autenticação ou verificação de permissões.
  • Sempre valide as funções do usuário com current_user_can() ao executar ações sensíveis.
  • Revise cuidadosamente o uso do parâmetro permission_callback nas rotas da API REST.
  • Realize testes de segurança em APIs e endpoints, mesmo em ambientes internos ou controlados.
  • Acompanhe referências como OWASP API Security Top 10, que aborda as falhas mais comuns em APIs.

Concluindo

As APIs REST oferecem poderosas possibilidades para desenvolvimento em WordPress, mas também podem se tornar vetores críticos de ataque quando mal implementadas. A vulnerabilidade analisada aqui demonstra de forma clara como uma falha simples pode comprometer completamente a segurança de um site. Segurança não deve ser tratada como um item opcional no desenvolvimento. É uma obrigação.

Se você ou sua empresa utilizam WordPress e dependem de plugins que expõem APIs, é essencial realizar auditorias regulares, implementar práticas de desenvolvimento seguro e monitorar continuamente possíveis pontos de falha.

Leave a Reply

Your email address will not be published. Required fields are marked *