שנתיים אחרי התיקון, אותו מפתח נכנס מהצד: החולשה בציון 9.1 ב-python-jose שעדיין אין לה גרסה מתוקנת
מי שמכיר את המפתח הציבורי של השירות שלכם יכול להנפיק לעצמו token של מנהל. זו CVE-2026-85394, חולשה בציון 9.1 בספריית python-jose שפורסמה ב-3 בספטמבר 2026. המעניין בה הוא לא הציון אלא ההיסטוריה: אותה חולשה כבר קיבלה מזהה ותיקון, והתיקון לא סגר אותה.
סקירה כללית
python-jose היא ספריית Python לחתימה ולאימות של JWT (JSON Web Token, המחרוזת החתומה שהשרת מנפיק בהתחברות ושולף ממנה מי אתם). אפשר לחתום ב-HMAC, שבו אותו סוד גם חותם וגם מאמת, או ב-RSA, שבו המפתח הפרטי חותם והציבורי רק בודק. אם תוקף מצליח לגרום לשרת להתייחס למפתח הציבורי, זה שמפורסם לכולם, כאל הסוד של HMAC, הוא חותם token בעצמו והשרת מאשר אותו. לטכניקה הזאת קוראים algorithm confusion.
הספרייה כבר קיבלה שומר נגד בדיוק זה. אחרי CVE-2024-33663 נוספה בגרסה 3.4.0 בדיקה שדוחה מפתח ציבורי שמוגש כסוד HMAC, אלא שהיא מסתכלת על הטקסט: כותרת PEM או תחילית של מפתח OpenSSH. מפתח בקידוד DER, אותו מפתח בצורתו הבינארית בלי העטיפה הטקסטואלית, עובר בשלום. הרבה פרויקטים הגיעו לספרייה דרך התיעוד הרשמי של FastAPI, שהמליץ עליה שנים ורק בהמשך עבר ל-PyJWT. הקוד שנכתב לפיו עדיין רץ.
פרטים בקצרה:
מזהה: CVE-2026-85394
סוג: זיוף חתימה דרך algorithm confusion (CWE-347)
מוצר: python-jose (ספריית Python)
גרסאות מושפעות: 3.5.0 וכל מה שלפניה
גרסה מתוקנת: אין
ניצול בפועל: לא ידוע, אינה ברשימת ה-KEV של CISA
ציר זמן
26 באפריל 2024: פרסום CVE-2024-33663, אותה חולשה בפורמטים PEM ו-OpenSSH.
18 בפברואר 2025: גרסה 3.4.0 יוצאת עם הבדיקה שאמורה לחסום אותה.
4 ביוני 2026: החוקר George Chen שולח את העקיפה למתחזק במייל. אין מענה.
6 ביולי 2026: אחרי חודש של שתיקה הוא מדווח בפומבי, בריפו של הספרייה.
3 בספטמבר 2026: VulnCheck, ה-CNA שהקצתה את המזהה, מפרסמת את פרטי החולשה.
איך הניצול עובד
התוקף צריך דבר אחד, והוא לא סוד: המפתח הציבורי של השירות, שהרבה שירותים מפרסמים בעצמם ב-endpoint של JWKS. הוא לוקח אותו בקידוד DER, מייצר איתו token חתום ב-HS256 עם התוכן שנוח לו ושולח לשרת. השרת ניגש לאמת, הבדיקה מחפשת כותרת PEM ולא מוצאת, והמפתח נכנס פנימה כסוד HMAC לכל דבר. החתימה מתאימה, כי נוצרה מאותו ערך בדיוק. תנאי אחד בכל זאת נדרש: שהקוד לא הגביל מפורשות את רשימת האלגוריתמים המותרים, וזו בדיוק ההגדרה שמדריכים ישנים נטו להשאיר פתוחה.
ניתוח ציון ה-CVSS
ציון CVSS: 9.1
הציון הגבוה מגיע משילוב אחד: התקיפה מגיעה ברשת, בלי הרשאות ובלי פעולה מצד הקורבן, וגם הסודיות וגם שלמות הנתונים נפגעות במלואן. מה שעוצר אותו לפני 9.8 הוא הזמינות, כי token מזויף מכניס את התוקף פנימה בתור מי שיבחר, אבל לא מפיל את השירות.
איפה למצוא Proof of Concept (PoC)
לא פורסם ריפו PoC ייעודי לחולשה. התיאור הטכני המלא, כולל הפורמטים שהבדיקה מזהה ואלה שהיא מפספסת, נמצא בהתרעה של VulnCheck.
הציון מודד את החולשה, לא את המצב שלכם מולה. בלי גרסה מתוקנת, ההגנה היחידה יושבת בקוד: ודאו שכל קריאה לאימות token מקבלת רשימת אלגוריתמים מפורשת ומצומצמת.
תגובות