Falhas em plugins LMS do WordPress expõem plataformas de ensino a SQL injection, escalonamento e execução de código

Falhas em plugins LMS do WordPress expõem plataformas de ensino a SQL injection, escalonamento e execução de código

LearnPress, LearnDash e LifterLMS apresentaram vulnerabilidades que podiam permitir acesso a dados, alteração de registros e comprometimento do servidor em ambientes educacionais baseados em WordPress.

ComponentePlugins LMS para WordPress LearnPress, LearnDash e LifterLMS, usados para cursos, matrículas, grupos, alunos e exportações administrativas em plataformas de ensino.
VetorParâmetros controlados por usuário em rotas Ajax, fluxo de IPN do PayPal e exportação administrativa podiam alcançar consultas SQL, alteração de papéis ou escrita de arquivo sem validação suficiente.
ImpactoAs falhas sustentavam SQL injection, escalonamento de privilégio para papel de professor e escrita de arquivo PHP com potencial de execução de código no servidor, conforme as condições de cada plugin.
PrioridadeAtualizar os plugins afetados, revisar contas e papéis de usuários, auditar metadados do WordPress, verificar arquivos gerados fora do padrão e procurar requisições anômalas contra endpoints Ajax e IPN.
ArtefatosLP_Modal_Search_Items::_get_items, learnpress_modal_search_items, learn_press_accept_become_a_teacher, learndash_get_course_groups, ipn.php, LLMS_AJAX_Handler e export_admin_table aparecem como pontos relevantes do fluxo vulnerável.
CVEO conjunto de vulnerabilidades foi associado a CVE-2020-6008, CVE-2020-6009, CVE-2020-6010 e ao duplicado CVE-2020-11511.
Resumo técnico

Uma análise de plugins populares de Learning Management System para WordPress identificou quatro vulnerabilidades em LearnPress, LearnDash e LifterLMS. Esses componentes transformam sites WordPress em plataformas de ensino, com cadastro de cursos, estudantes, professores, pagamentos, grupos, progresso e exportações administrativas. O risco é ampliado porque esse tipo de plugin concentra dados acadêmicos e operacionais e costuma ser implantado por escolas, universidades, academias on-line e organizações que migraram atividades de treinamento para ambientes virtuais.

As falhas tinham naturezas diferentes, mas compartilhavam o mesmo ponto de pressão: dados controlados por usuário alcançavam áreas sensíveis do fluxo do plugin sem validação, autorização ou sanitização suficiente. No LearnPress, foram descritos um SQL injection baseado em tempo e um escalonamento de privilégio para papel de professor. No LearnDash, a falha envolvia SQL injection de segunda ordem ligado a metadados de curso e processamento de IPN. No LifterLMS, o problema estava em uma exportação que podia gravar arquivo PHP em local arbitrário e, sob condições específicas, levar à execução de código no servidor.

Fluxo técnico

No LearnPress, o método _get_items da classe LP_Modal_Search_Items utilizava o parâmetro current_items em uma consulta SQL sem sanitização suficiente. Um usuário autenticado conseguia alcançar esse método por meio do fluxo Ajax associado a learnpress_modal_search_items, passando por LP_Admin_Ajax::modal_search_items e LP_Modal_Search_Items::get_items. O efeito técnico descrito é SQL injection blind baseado em tempo, uma classe de falha em que a resposta da aplicação pode não retornar dados diretamente, mas diferenças de latência permitem inferir comportamento do banco. Em uma plataforma LMS, essa exposição ameaça a integridade de informações acadêmicas e administrativas armazenadas no WordPress.

Ainda no LearnPress, a função learn_press_accept_become_a_teacher podia alterar um usuário registrado para o papel de professor sem verificar adequadamente a permissão de quem fazia a requisição. O contexto descreve que a função era carregada após a ativação dos plugins e podia ser acionada com parâmetros de ação e identificador de usuário, sem exigir autenticação. O impacto é escalonamento de privilégio dentro da lógica do LMS: uma conta comum ou um fluxo não autenticado podia alcançar um papel com capacidades superiores, o que abre caminho para manipulação de conteúdo educacional, registros pessoais e operações normalmente restritas a administradores ou instrutores.

No LearnDash, o problema era mais indireto. A função learndash_get_course_groups, localizada em ld-groups.php, consultava a tabela wp_postmeta em busca de chaves de metadados no padrão learndash_group_enrolled_% para um curso e reaproveitava parte desse valor em outra consulta SQL. Como o valor vinha do banco, o código tratava o dado como se fosse confiável, mas outro fluxo permitia inserir registros controlados em wp_postmeta. O arquivo ipn.php, usado para lidar com notificações de pagamento do PayPal, podia criar metadados com chave e valor controlados via update_post_meta; depois, o próprio processamento chamava uma cadeia que chegava a learndash_get_course_groups.

Essa combinação caracteriza SQL injection de segunda ordem: a entrada maliciosa não dispara o efeito no momento em que é gravada, mas permanece armazenada até ser consumida por outra rotina. A superfície é relevante para defesa porque logs de requisição e banco podem mostrar eventos separados no tempo, e a correlação entre gravação do metadado e consulta posterior é necessária para entender o incidente. O contexto também indica que a falha podia ser acionada sem autenticação, o que aumenta a prioridade de correção em sites expostos à internet que mantinham o fluxo IPN acessível.

No LifterLMS, a função handle() registrada no handler Ajax administrativo chamava dinamicamente funções de LLMS_AJAX_Handler com base na variável de ação recebida. Uma das funções disponíveis, export_admin_table, criava uma classe a partir do parâmetro handler e invocava generate_export_file usando o nome de arquivo enviado na requisição. O fluxo deveria gerar CSVs administrativos, mas não validava de forma suficiente a extensão solicitada. Com um ajax_nonce obtido organicamente em uma interação legítima, um atacante podia alcançar a geração de arquivo com extensão PHP e local de escrita arbitrário.

A escrita inicial não oferecia controle direto sobre todo o conteúdo, mas o fluxo de exportação podia incluir dados de tabelas do LMS. O contexto descreve que a tabela LLMS_Tables_Course_Students podia refletir o nome do estudante no arquivo gerado. Ao alterar o primeiro nome do perfil para conteúdo interpretável como PHP, e explorando a tolerância da linguagem a uma abertura de bloco sem fechamento convencional em determinado contexto, o arquivo gerado podia ser acessado pelo navegador e interpretado pelo servidor. O efeito final era execução de código no servidor, limitado às condições em que o atacante conseguia obter o nonce, controlar o campo refletido e gravar o arquivo em caminho executável.

Superfície afetada

A superfície comum é formada por sites WordPress que usam os plugins LMS para operar cursos, turmas, matrículas, pagamentos, professores e alunos. Esses ambientes têm uma combinação sensível de contas autenticadas de baixo privilégio, integrações externas, rotas Ajax e dados persistidos em tabelas genéricas do WordPress. Quando um plugin assume que um estudante autenticado, uma notificação de pagamento ou um valor armazenado em wp_postmeta é confiável, a fronteira entre entrada externa e rotina privilegiada fica fraca.

No LearnPress, o risco se concentra em rotas Ajax e funções administrativas que podiam ser alcançadas por usuários autenticados ou por chamadas com parâmetros específicos. No LearnDash, a exposição envolve o caminho de IPN e metadados de curso; isso exige atenção a ambientes que integravam pagamentos e mantinham o endpoint de notificação ativo. No LifterLMS, o ponto crítico é a exportação administrativa, especialmente quando o servidor permite execução de PHP em diretórios onde o plugin consegue gravar arquivos gerados.

  • Instalações WordPress com LearnPress expostas a chamadas Ajax relacionadas a busca modal de itens e alteração de papel de usuário.
  • Instalações WordPress com LearnDash usando fluxo de IPN e metadados learndash_group_enrolled_% em wp_postmeta.
  • Instalações WordPress com LifterLMS que permitem exportação administrativa e gravação de arquivos em diretórios servidos pelo PHP.
  • Contas de estudante ou usuários registrados que possam interagir com curso, perfil, exportação ou fluxos de LMS.
Hunting e telemetria

A investigação deve começar pela linha do tempo de requisições ao WordPress. Para LearnPress, procure chamadas Ajax incomuns relacionadas a busca modal de itens e parâmetros current_items com formatos inesperados, listas manipuladas ou padrões que indiquem tentativa de inferência por atraso. Também revise eventos de mudança de papel, especialmente usuários que passaram a professor sem trilha administrativa correspondente. Como uma das falhas podia ser acionada sem login, a ausência de sessão válida não deve ser usada como critério para descartar eventos suspeitos.

Para LearnDash, a telemetria precisa correlacionar requisições ao fluxo ipn.php, gravações em wp_postmeta e chamadas subsequentes que consultem grupos de curso. Chaves de metadados que começam com learndash_group_enrolled_ e contêm caracteres fora do padrão esperado para identificadores devem ser tratadas como suspeitas. Em bancos WordPress, uma revisão focada de metadados de cursos pode revelar entradas persistidas que não deveriam existir. Como o padrão é de segunda ordem, um único evento de exploração pode aparecer como duas fases: inserção de dado manipulado e consumo posterior pela consulta vulnerável.

Para LifterLMS, a busca deve cobrir requisições Ajax de exportação, nomes de arquivo que não terminam em CSV, criação de arquivos PHP em diretórios de upload ou exportação e alterações recentes em campos de perfil de estudantes antes da geração de arquivo. Também é importante verificar acessos HTTP a arquivos recém-criados, porque a execução depende de o atacante navegar até o arquivo gravado. Em servidores web, eventos de criação de PHP fora do fluxo normal de implantação são sinais de alta severidade.

  • Requisições Ajax com parâmetros current_items, action, user_id, handler ou filename fora do padrão operacional do LMS.
  • Mudanças de papel para professor sem ação administrativa legítima registrada.
  • Metadados em wp_postmeta com prefixo learndash_group_enrolled_ e sufixos que não sejam identificadores simples esperados pelo plugin.
  • Arquivos PHP criados por processos do servidor web em diretórios de exportação, upload ou conteúdo do WordPress.
  • Acessos HTTP a arquivos recém-gerados após uma exportação administrativa ou alteração de perfil de aluno.
Mitigação

A primeira medida é aplicar as versões corrigidas dos plugins afetados, já que os desenvolvedores disponibilizaram correções e, no caso de parte das falhas do LearnPress, removeram as funções vulneráveis. A atualização deve ser acompanhada por validação funcional do LMS, pois plugins desse tipo frequentemente interagem com temas, gateways de pagamento, extensões de curso e personalizações locais. Em produção, a correção não deve se limitar à troca de arquivos: é necessário verificar se já houve alteração de papéis, metadados persistidos ou criação de arquivos indevidos antes do patch.

No banco, revise contas com papel de professor ou privilégios equivalentes, especialmente aquelas criadas ou alteradas no período de exposição. Em LearnDash, limpe metadados de curso que não correspondam ao formato legítimo esperado pelo plugin e preserve evidências antes de qualquer alteração quando houver suspeita de incidente. Em LifterLMS, procure arquivos PHP não implantados pelo processo normal do site e remova apenas após coleta mínima de evidência, como caminho, horário de criação, proprietário do arquivo e registros de acesso relacionados.

Como controle estrutural, restrinja execução de PHP em diretórios de upload e exportação quando a arquitetura permitir, reduza permissões de escrita do servidor web ao mínimo necessário e monitore criação de arquivos executáveis em caminhos de conteúdo. Para SQL injection, a defesa de longo prazo depende de prepared statements e sanitização coerente com o tipo de dado. Para escalonamento de privilégio, funções que alteram papéis ou permissões precisam validar capacidade do solicitante, intenção da ação e nonce quando aplicável, sem confiar apenas na presença de parâmetros.

  • Atualizar LearnPress, LearnDash e LifterLMS para versões corrigidas compatíveis com o ambiente.
  • Auditar papéis de usuários e remover privilégios de professor concedidos sem processo administrativo legítimo.
  • Revisar wp_postmeta em busca de chaves anômalas relacionadas a grupos e matrículas de curso.
  • Bloquear execução de PHP em diretórios de upload, exportação e arquivos gerados sempre que possível.
  • Monitorar criação de arquivos executáveis pelo usuário do servidor web e alertar para extensão PHP fora do processo de implantação.
  • Validar integrações de pagamento e endpoints IPN expostos, mantendo apenas fluxos necessários e observáveis.

Postar um comentário

0 Comentários