← back
CVE-2019-9978mediumunder attackCWE-79

CVE-2019-9978

100Vexday Risk Score

Patch now. It under exploitation confirmed by CISA and has a working public exploit.

ssvc Actcvss 6.1epss 73%
from disclosure to weapon1 days
Published on NVDMar 24
1st PoC+1d
CISA KEV+955d
exploitation probability
73%top 1% of all CVEs
observed exploitation
yesCISA + VulnCheck
33 public exploit(s)
Action required by CISAfederal deadline: 2022-05-03

Apply updates per vendor instructions.

Summary

Falha de Cross-Site Scripting (XSS) armazenado no plugin Social Warfare para WordPress (e sua variante Pro), presente em uma função de depuração acessível sem autenticação via wp-admin/admin-post.php. O endpoint aceita um parâmetro swp_url que o plugin busca e grava como configuração do site sem sanitização, permitindo injetar JavaScript persistente que executa no contexto de qualquer visitante — incluindo administradores logados. Foi explorada em massa em março de 2019 antes da divulgação pública, está no catálogo KEV da CISA, e o CVSS 6.1 subestima o risco prático: é pré-autenticação, automatizável e afetou site com dezenas de milhares de instalações ativas.

Technical detail

A causa raiz (CWE-79, XSS armazenado) está numa rotina de depuração do plugin, acionada pelo parâmetro swp_debug=load_options no endpoint wp-admin/admin-post.php. Essa rotina recebe outro parâmetro, swp_url, faz uma requisição para a URL informada e trata o conteúdo retornado como um array de opções de configuração do plugin (campos como 'twitter_id', usados para atribuição de autoria em compartilhamentos), gravando-o diretamente no banco de dados do WordPress sem qualquer sanitização ou escaping.

Como o admin-post.php é registrado no WordPress para aceitar requisições tanto de usuários autenticados quanto não autenticados (dependendo de como a action é gravada), e a função de debug não valida sessão nem nonce, o atacante controla integralmente o conteúdo remoto buscado — ele hospeda um payload (por exemplo, num paste público) contendo um valor como '">...' dentro do campo esperado e o plugin importa esse valor como configuração legítima.

O payload armazenado é depois renderizado sem escaping nas páginas que exibem os botões de compartilhamento social (front-end) e possivelmente em telas administrativas do plugin, disparando execução de JavaScript arbitrário no navegador de qualquer visitante ou administrador que carregue a página afetada. Por ser armazenado (não refletido), um único disparo compromete o site persistentemente até a limpeza manual da opção corrompida.

How it’s exploited

O vetor é uma única requisição HTTP GET não autenticada para /wp-admin/admin-post.php?swp_debug=load_options&swp_url=, sem necessidade de login, CSRF token ou interação prévia com a vítima — o único pré-requisito real é o plugin estar instalado, ativo e em versão anterior à 3.5.3. A campanha observada em março de 2019 usou pastebins públicos hospedando o payload disfarçado de configuração do plugin (campo 'twitter_id' contendo script codificado em fromCharCode), e a Sucuri registrou tentativas de mais de cem IPs distintos em poucos dias, com o script injetado redirecionando visitantes para sites maliciosos.

A exploração é trivial de automatizar (por isso o EPSS alto e a listagem no KEV) e não exige conhecimento de credenciais nem de estrutura interna do site-alvo, só a URL pública do site WordPress com o plugin ativo. Existem PoCs públicas, incluindo uma submissão de 2025 na lista Full Disclosure descrita pelo autor como 'Remote Code Execution' — rotulagem que não corresponde à natureza real da falha (XSS armazenado); a CVE oficial e a análise da Sucuri confirmam XSS, não execução de código no servidor. A confusão provavelmente vem do fato de que XSS armazenado atingindo um administrador logado pode ser encadeado (via ações administrativas do WordPress, como edição de plugin/tema) para chegar a RCE, mas isso é uma etapa adicional, não parte do exploit documentado.

O impacto final documentado é sequestro de sessão/ações no contexto do navegador da vítima e redirecionamento para infraestrutura maliciosa — consistente com campanhas de infecção em massa (padrão associado a famílias como Balada Injector) que visam SEO spam e redirecionamento, não necessariamente controle total do servidor.

Versions

Affected
Social Warfare e Social Warfare Pro em todas as versões anteriores a 3.5.3.
Fixed in
3.5.3 (não há menção a backports para ramos mais antigos nas fontes consultadas).

How to protect

A correção do fornecedor é a atualização para a versão 3.5.3 do Social Warfare (e Social Warfare Pro), que remove ou neutraliza a rota de debug vulnerável. Não há indicação nas fontes de backport para ramos anteriores — trata-se de um plugin de terceiros sem versões LTS documentadas, então a única via oficial é subir para 3.5.3 ou posterior.

Se a atualização imediata não for possível, o paliativo real é bloquear no WAF ou no servidor web requisições para /wp-admin/admin-post.php contendo os parâmetros swp_debug=load_options e swp_url — a Sucuri recomendou exatamente essa virtual-patch enquanto o update não era aplicado. Outra opção de custo baixo é desativar o plugin até a atualização, já que a função de debug não é usada em operação normal do site (não há perda funcional relevante em desativar temporariamente). Vale checar e limpar manualmente as opções do plugin no banco de dados (wp_options) caso a exploração já tenha ocorrido antes da correção, pois o payload permanece armazenado até ser sobrescrito.

Não funciona como mitigação apenas restringir acesso ao painel /wp-admin por IP ou senha adicional, porque o endpoint admin-post.php explorado não exige autenticação prévia — a falha está no processamento da requisição em si, não em contornar login.

How to detect

O indicador mais confiável, segundo a Sucuri, é buscar nos logs de acesso requisições a qualquer arquivo PHP dentro de /wp-admin/ contendo os parâmetros swp_debug e swp_url — em particular GET para admin-post.php?swp_debug=load_options&swp_url=, frequentemente apontando para pastebin.com/raw/... ou hosts similares usados para hospedar o payload. Respostas com código 403 nesses padrões (bloqueadas por WAF) ainda indicam tentativa de exploração, não sucesso.

Como sinal secundário, vale inspecionar a tabela wp_options do WordPress por valores de configuração do Social Warfare (campos como 'twitter_id') contendo tags ou JavaScript codificado — presença disso confirma exploração bem-sucedida e persistência do payload, mesmo que o plugin já tenha sido atualizado depois.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
The social-warfare plugin before 3.5.3 for WordPress has stored XSS via the wp-admin/admin-post.php?swp_debug=load_options swp_url parameter, as exploited in the wild in March 2019. This affects Social Warfare and Social Warfare Pro.
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
Affected products
n/a · n/a
public PoCs found33
exploitdbwww.exploit-db.com/exploits/52346unverifiedexploitdbwww.exploit-db.com/exploits/46794unverifiedgithubgithub.com/hash3liZer/CVE-2019-997822githubgithub.com/mpgn/CVE-2019-99788githubgithub.com/KTN1990/CVE-2019-99786githubgithub.com/grimlockx/CVE-2019-99784githubgithub.com/yup-Ivan/CVE-2019-99784githubgithub.com/d3fudd/CVE-2019-9978_Exploit3githubgithub.com/TokyoHunter/CVE-2019-9978-Social-Warfare-WordPress-RCE1githubgithub.com/echoosso/CVE-2019-99781githubgithub.com/B4ntGrim/Vuln_Exploitation_MegaQuagga_Pentest0githubgithub.com/cved-sources/cve-2019-99780githubgithub.com/h8handles/CVE-2019-9978-Python30githubgithub.com/0xMoonrise/cve-2019-99780githubgithub.com/MAHajian/CVE-2019-99780githubgithub.com/Vaidehim55/CVE-2019-9978-RCE-PoC0githubgithub.com/aktia1/MegaQuagga_Pentesting_Report0githubgithub.com/B4ntGrim/Vuln_Remediation_MegaQuagga0githubgithub.com/Housma/CVE-2019-9978-Social-Warfare-WordPress-Plugin-RCE0cve_referencewww.exploit-db.com/exploits/46794/unverifiedvulncheckvulncheck.com/xdb/797f3f17dcb3unverifiedvulncheckvulncheck.com/xdb/7621c2e4cc97unverifiedvulncheckvulncheck.com/xdb/4c5c4c61dda3unverifiedvulncheckvulncheck.com/xdb/89a9def6ffedunverifiedvulncheckvulncheck.com/xdb/b1aa6ec20c75unverifiedvulncheckvulncheck.com/xdb/4f8c76c78bceunverifiedvulncheckvulncheck.com/xdb/e62bb9f01805unverifiedvulncheckvulncheck.com/xdb/5b8f3f707d29unverifiedvulncheckvulncheck.com/xdb/5fa69ee6d630unverifiedvulncheckvulncheck.com/xdb/86c5d721b741unverifiedvulncheckvulncheck.com/xdb/0a0645e7d05bunverifiedcve_referencepacketstormsecurity.com/files/163680/WordPress-Social-Warfare-3.5.2-Remote-Code-Execution.htmlunverifiedcve_referencepacketstormsecurity.com/files/152722/Wordpress-Social-Warfare-Remote-Code-Execution.htmlunverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.