כותרת Penligent

פענוח חתימת json באינטרנט: מניתוח Base64Url ועד כשלים באימות JWS בעולם האמיתי (RFC 7515 + CVE-2022-21449)

מדוע פענוח JWS הוא רק נקודת הכניסה

בארכיטקטורת הזהויות המודרנית — במיוחד OAuth 2.0 ו-OpenID Connect — אסימונים חתומים מטופלים לעתים קרובות כ"מכלים מהימנים" שניתן להעביר בין שירותים. אך עבור מהנדסי אבטחה, חברי צוותי אדום וחוקרי אבטחת AI, JWS מובן יותר כקלט קומפקטי הנשלט על ידי התוקף, הממוקם בצומת בין קריפטוגרפיה והיגיון עסקי. היכולת לבצע פענוח חתימת אינטרנט json אינו המטרה; זהו הכלי שמאפשר לך להסיק מסקנות לגבי מה שהמאמת חושב זה מאשר את מה שהאפליקציה למעשה מסתמך על אישור, ואילו חלקים של האסימון מטופלים כתצורה ולא כנתונים לא מהימנים.

הבחנה זו חשובה מכיוון ש"אבטחת אסימון" אינה תכונה של פורמט האסימון. זוהי תכונה של תהליך אימות ואישור תביעות—בחירת אלגוריתם, בחירת מפתח, בדיקות מנפיק/קהל, תביעות מבוססות זמן, ובאופן קריטי, כיצד קוד במורד הזרם משתמש בתביעות ברגע שיש לו אותן. ברגע שמערכת מתייחסת לתביעות מפוענחות כ"אמת" לפני שהאימות הושלם (או אפילו לפני שהוא התחיל), האסימון מפסיק להיות גבול אבטחה והופך לפרמטר הנשלט על ידי המשתמש.

פענוח חתימת json באינטרנט: מניתוח Base64Url ועד כשלים באימות JWS בעולם האמיתי (RFC 7515 + CVE-2022-21449)

ההנדסה שמאחורי המחרוזת: Base64url ללא ריפוד

כאשר אנשים אומרים "לפענח JWS", הם בדרך כלל מבצעים פעולה הפוכה לשלב הקידוד base64url. בסידור סדרתי קומפקטי JWS, כל אחד משלושת הקטעים מקודד ב-base64url, תוך שימוש באלפבית URL-safe ובדרך כלל השמטת = ריפוד. RFC 7515 מגדיר את הפורמט הקומפקטי ומשתמש באופן מפורש ב- BASE64URL(...) לבניית הכותרת והמטען, ואז מחבר עם . מפרידים. (עורך RFC)

הכלל של "ללא ריפוד" נשמע שולי עד שאתה בונה כלים או מנתח תעבורה שנתפסה בקנה מידה גדול. שגרות base64 גנריות רבות מניחות שקיים ריפוד, וכאשר הריפוד חסר הן יציגו שגיאות או יפיקו פלט לא ברור. מפענח חזק חייב להוסיף מחדש את הריפוד באופן דטרמיניסטי ולהשתמש בשגרת פענוח התומכת ב-base64url, אחרת הניתוח שלך יהפוך לבלתי ניתן לשחזור — במיוחד כאשר אתה מתמודד עם אסימונים פגומים או פגומים בכוונה במהלך fuzzing.

JWS לעומת JWT: מה המשמעות של כל נקודה

אסימון JWS Compact הוא תמיד:

BASE64URL(כותרת) . BASE64URL(נתונים) . BASE64URL(חתימה)

הקטע השלישי אינו "hex". זהו base64url של בתים החתימה (או MAC). התייחס אליו כאל אטום, אלא אם כן אתה מאמת או מבצע מיון קריפטוגרפי.

JWT (RFC 7519) הוא מוסכמה של קבוצת טענות הנשאת בדרך כלל בתוך מטען JWS, ולכן אנשים נוטים לבלבל בין "JWT" ל-"JWS". RFC 7519 מגדיר טענות רשומות כמו iss, sub, aud, exp, ו nbf, ומתאר כיצד טענות אלה מיוצגות כאובייקט JSON. (מעקב נתונים של IETF)

מבחינה מעשית, משמעות הדבר היא ששלב פענוח בלבד יכול לספר לך מהו האסימון. תביעות, אך היא אינה יכולה לומר לך אם טענות אלה נכונות. נכון. האמת מתגלה רק לאחר אימות החתימה ואימות התביעה.

פענוח חתימת אינטרנט json

הכותרת היא משטח ההתקפה: אלג, ילד, jku כקלט לא מהימן

במערכות מתוכננות היטב, כותרת האסימון היא מטא-נתונים המסייעים למאמת לבחור אסטרטגיית אימות ידועה כטובה. במערכות מתוכננות גרוע, הכותרת הופכת לערוץ תצורה הנשלט על ידי התוקף. לכן, במהלך פענוח חתימת אינטרנט json, אנשי מקצוע רבים מתמקדים תחילה בכותרת.

ה אלג הערך רגיש במיוחד מכיוון שהוא יכול להשפיע על שיטת האימות שתופעל. בלבול אלגוריתמים (המכונה גם בלבול מפתחות) מתרחש כאשר תוקף יכול לאלץ את השרת לאמת JWT באמצעות אלגוריתם שונה מזה שהתכוון המפתח, ובכך לאפשר שימוש באסימונים מזויפים מבלי לדעת את מפתח החתימה של השרת. האקדמיה לאבטחת אינטרנט של PortSwigger מתארת סוג זה בבהירות וקושרת אותו לתצורה שגויה או לטיפול לקוי בבחירת האלגוריתמים. (PortSwigger)

ה ילד הפרמטר אינו קריפטוגרפיה; זהו אחזור מפתח. אם ילד משפיע על נתיבי קבצים, שאילתות מסד נתונים, מפתחות מטמון או פתרונות דינמיים ללא רשימת אישור קפדנית, הוא הופך למשטח הזרקה כללי בתוך גבולות ניהול המפתחות.

ה jku הפרמטר מסוכן עוד יותר כאשר נעשה בו שימוש לא נכון. אם שרת משיג JWKS מכתובת URL שצוינה בכותרת האסימון (או מגרסה שאינה מוגבלת מספיק), התוקף יכול לנסות להחליף את עוגן האמון על ידי הפניית המאמת למפתחות שבשליטת התוקף. גם כאשר מערכת "משיגה רק מ-HTTPS", היעדר רשימות אישור קפדניות, קישור למנפיק, מדיניות אחסון במטמון ושבילים ביקורת הופכים את אחזור המפתחות לבעיה בשרשרת האספקה, ולא לבעיה בקריפטוגרפיה.

מפענח לא מקוון ברמת ייצור ב-Python (פענוח בלבד, בטוח למילוי)

מאתרי באגים מבוססי אינטרנט הם נוחים, אך לעתים קרובות הם אינם מומלצים בעבודה מקצועית בתחום האבטחה. אסימונים עשויים להכיל מזהים רגישים, כתובות דוא"ל, מזהי דיירים פנימיים או אפילו מידע אישי מוטמע. נדרשים כלים לא מקוונים הניתנים לתכנות, שהם דטרמיניסטיים ובטוחים בכל הקשור לקלט פגום. היישום שלהלן אינו "מאמת" דבר בכוונה; הוא רק מפענח את מה שקיים ומאפשר לצפות במצבי כשל.

import base64 import json from typing import Any, Dict, Tuple, Optional def _b64url_decode(data: str) -> bytes: # RFC 7515 base64url בדרך כלל משמיט את המילוי "="; יש לשחזר אותו באופן דטרמיניסטי.
    pad = (-len(data)) % 4 return base64.urlsafe_b64decode((data + "=" * pad).encode("ascii"))

def _parse_json(b: bytes) -> Tuple[Optional[Dict[str, Any]], Optional[str]]: try: return json.loads(b.decode("utf-8")), None except Exception as e: return None, f"{type(e).__name__}: {e}"

def jws_decode(token: str) -> Dict[str, Any]: parts = token.split(".") if len(parts) != 3: return {"error": "Invalid JWS compact format (expected 3 parts).", "parts": len(parts)}

    header_b = _b64url_decode(parts[0]) payload_b = _b64url_decode(parts[1]) header, he = _parse_json(header_b) payload, pe = _parse_json(payload_b) out: Dict[str, Any] = {
        "header_raw": header_b.decode("utf-8", errors="replace"), "payload_raw": payload_b.decode("utf-8", errors="replace"), "signature_b64url_sample": parts[2][:16] + "..."
    } אם header אינו None: out["header"] = header אחרת: out["header_error"] = he אם payload אינו None: out["payload"] = payload אחרת: out["payload_error"] = pe החזר out

זה תואם את השימוש ב-base64url של RFC 7515 (ואת המציאות ש-JWS קומפקטי מיועד להקשרים של כותרות URL/HTTP), תוך מתן התנהגות יציבה כאשר האסימון פגום, קטוע או מעורפל בכוונה. (עורך RFC)

הפער הקריטי: פענוח לעומת אימות (ודפוס הבאגים האמיתי)

הטעות הנפוצה ביותר בנושא אבטחה סביב JWS/JWT היא בלבול בין פענוח לאימות. פענוח הוא תהליך הפיך של עיצוב; אימות הוא תהליך של אימות קריפטוגרפי בתוספת אכיפת מדיניות.

באירועים אמיתיים, דפוס הכשל הנפוץ הוא "שימוש לפני אימות" ולא תחרות ממשית. יישום מפענח את האסימון, קורא תפקיד, user_id, דייר, או היקף, ומקבל החלטות אישור לפני אימות החתימה ואימות התביעה נאכפים באופן סופי. ההנחיות של OWASP בנושא בדיקות JWT מדגישות כיצד טיפול לא נכון בציפיות האלגוריתם ובלוגיקת האימות מאפשר התקפות בעלות השפעה רבה, כולל בלבול בין זרימות אימות א-סימטריות וסימטריות. (קרן OWASP)

גם אם החתימה תקפה, האסימון עדיין זקוק לאימות תביעה. RFC 7519 מגדיר aud כפי שטוען הקהל, ומציין כי אם הגורם העיקרי המעבד את האסימון אינו מזהה את עצמו כקהל היעד, יש לדחות את האסימון כאשר aud קיים. (מעקב נתונים של IETF) זהו תזכורת לכך שתוקף קריפטוגרפי אינו שווה לתוקף קונטקסטואלי.

ניצול מתקדם: מעבר ל-"alg: none"

הנרטיב "alg: none" הוא בעל חשיבות היסטורית, אך רוב הספריות המודרניות חוסמות אותו כברירת מחדל. הכשלים המעניינים יותר כיום נוטים להתחלק לשתי קטגוריות: פגמים ביישום של ספקי הצפנה, ועקיפות לוגיות מורכבות הנגרמות על ידי צינורות אימות גמישים.

חתימות פסיכיות (CVE-2022-21449): כאשר אימות ECDSA משקר

CVE-2022-21449 — המוכר בשם "Psychic Signatures" — הוא פגיעות חמורה בקריפטוגרפיה של Java, שבה ניתן לעקוף את אימות החתימה ECDSA בתנאים מסוימים בגרסאות Java מושפעות (הוכנס לראשונה ב-Java 15 ותוקן ב-CPU של אפריל 2022). הניתוחים מדגישים עד כמה היא מחלישה באופן דרמטי מערכות המסתמכות על חתימות ECDSA, כולל תרחישים הכוללים JWTs חתומים ב-ECDSA או מנגנוני WebAuthn. (ניל מדן)

הלקח החשוב ביותר בנוגע לאבטחת אסימונים אינו החוכמה שבמעקף, אלא המציאות התפעולית לפיה "בחרתי ב-ES256" אינה מהווה ערובה. גרסת זמן הריצה, יישום ספק האבטחה ומצב התיקונים הם חלק ממודל האיומים שלכם. צוותי האבטחה צריכים להתייחס ל"נסיגות ספק הקריפטוגרפיה" כאל סיכונים מהמעלה הראשונה, עם SLA מפורש לתיקונים ובדיקות נסיגה המפעילות אימות כנגד חתימות פגומות.

בלבול אלגוריתם / בלבול מפתח: כאשר השרת מאפשר לאסימון לבחור את הכללים

התקפות בלבול אלגוריתמים מתרחשות כאשר המאמת מאפשר לאסימון להשפיע על האלגוריתם המשמש לאימות, וטיפול המפתח אינו מופרד באופן ברור בין מצבים א-סימטריים וסימטריים. PortSwigger מציין כי אם מקרה זה אינו מטופל כראוי, תוקפים עלולים לזייף JWT תקפים המכילים ערכים שרירותיים מבלי לדעת את מפתח החתימה הסודי של השרת. (PortSwigger)

בפועל, ההגנה היא פשוטה מבחינה קונספטואלית, אך לעתים קרובות היא מתפספסת: לעולם אל תאפשר "גמישות אלגוריתמית" בגבול שבו מתקבלות החלטות אימות. אם השירות שלך מצפה ל-RS256, אתה אוכף RS256. אתה לא "מקבל כל אלגוריתם שנמצא בכותרת ובודק אם הוא מאומת".

פענוח חתימת אינטרנט json

איתור מפתחות מונחה כותרת: ילד/jku כשרשרת אספקה לאימות

ברגע שאתה מקבל את העובדה שהכותרת היא קלט של התוקף, אתה גם מקבל את העובדה שבחירת המפתח היא חלק ממשטח התקיפה שלך. א ילד צריך להיות ממופה לרשימת מפתחות מותרת שהוגדרה מראש, ולא לחומר מפתחות שרירותי שהוצא, נטען או נבנה בזמן ריצה. A jku אין לאפשר לאסימון להגדיר מחדש את מקור עוגני האמון. אם אתה תומך באחזור JWKS עבור OIDC, הוא צריך להיות קשור לתצורת מנפיק מהימן ולהיות מוגן באמצעות רשימות מורשות, מטמון וניטור.

אסטרטגיות הקשחה העומדות בפני סטיות בייצור

גישה מעמיקה לאימות JWS נראית משעממת על הנייר, אך היא בדיוק מה שמונע את רוב הכשלים באסימונים.

אתה מציין במפורש את האלגוריתמים המקובלים ומחייב את המאמת לאכוף את השימוש באלגוריתם הצפוי. ההנחיות של OWASP ל-JWT עבור Java מציינות זאת במפורש כאמצעי מניעה. (סדרת דפי העזר של OWASP)

אתה מאמת את המנפיק והקהל באופן עקבי. ההגדרות של RFC 7519 לתביעות רשומות אינן אקדמיות; הן קיימות מכיוון ש"חתימה תקפה, הקשר שגוי" הוא סוג נפוץ של כשלים. בפרט, אי התאמות קהל הן אחת הדרכים הקלות ביותר לקבל בטעות אסימון שהונפק עבור שירות אחר. (מעקב נתונים של IETF)

אתה מתייחס למזהי מפתח כאל נתונים, ולא כאל שאילתת חיפוש. A ילד צריך להיפתר באמצעות מיפוי מוגבל — כינוי KMS, רישום מפתחות סטטי או מאגר מפתחות מבוקר בקפדנות — ולא באמצעות נתיב מערכת קבצים או שאילתת מסד נתונים המבוססת על קלט לא מהימן.

אתם מתקנים באופן אגרסיבי את זמני הריצה של הקריפטוגרפיה ובודקים אותם מול סוגים ידועים של תקלות קטסטרופליות. CVE-2022-21449 קיים כדי להזכיר לנו ש"בחירה נכונה של אלגוריתם" אינה יכולה לפצות על יישומים פגומים של אימות. (ניל מדן)

אתה עוקב אחר חריגות המעידות על בדיקות פעילות. כמויות גדולות של שגיאות ריפוד base64url, אסימונים לא חוקיים חוזרים או תחלופה גבוהה ב- ילד ערכים יכולים להצביע על ניסיונות מתמשכים של ערפול או בלבול. הניטור לא יתקן את הבאג, אך הוא יכול לקצר את זמן הזיהוי ולעזור לך לקשר בין פעילות חשודה לנקודות קצה ומאמתים ספציפיים.

אוטומציה של ביקורת לוגיקת האימות: היכן Penligent יכולה להתאים

בסביבות אמיתיות, הקושי אינו טמון בפענוח אסימון פעם אחת. הקושי טמון באיתור המקומות שבהם מתקבלים אסימונים, בזיהוי השירותים האוכפים את כללי האימות ובבדיקת האם האישור במורד הזרם תלוי בטענות מפוענחות בטרם עת. הלולאה "פענוח → פרשנות → שינוי → אימות השפעה" היא לולאה חוזרת, והיא בדיוק מסוג העבודות שניתן לתעש באמצעות פלטפורמות אבטחה מודרניות המסייעות בבינה מלאכותית.

פלטפורמה כמו Penligent יכולה להיות ממוצבת באופן אמין כשכבת אוטומציה לבדיקות הממוקדות בטוקנים: היא יכולה לבצע פענוח לא מקוון כדי לסווג טוקנים ולחלץ שדות בעלי אותות חזקים (מנפיק, קהל, היקפים, תפקידים), להסיק ערימות אימות סבירות מהתנהגות התגובה וטביעות אצבעות השירות, ואז לבדוק באופן שיטתי סטיות ממדיניות – כשלים ברשימת האלגוריתמים המותרים, אכיפה לא עקבית של המנפיק/קהל בין מיקרו-שירותים, ודפוסים לא בטוחים בבחירת מפתחות. הערך אינו טמון ב"שבירת אסימונים קסומה", אלא ביצירת ראיות חוזרות ובבדיקות רגרסיה רציפות, המאתרות רגרסיות אימות עדינות לפני שהן נשלחות.

אם אתה מתייחס לאימות JWS כאל גבול API קריטי לאבטחה, אז זרימת עבודה מונעת AI היא החזקה ביותר כאשר היא עוזרת לך להבטיח שהגבול יישאר עקבי בין גרסאות, סביבות ובעלי שירותים.

מניתוח Base64Url ועד כשלים באימות JWS בעולם האמיתי (RFC 7515 + CVE-2022-21449)

סיכום

הפקודה ל פענוח חתימת אינטרנט json הוא קו הזינוק, לא קו הסיום. פענוח מאפשר לך נראות, אך אבטחה נובעת מאימות קפדני ואימות טענות, ניהול מפתחות מסודר ותחזוקת סביבת ריצה גמישה.

מכשלים קטסטרופליים של ספקי קריפטוגרפיה כמו "Psychic Signatures" (CVE-2022-21449) ועד בלבול באלגוריתמים וסיכונים בשרשרת האספקה של מפתחות המונעים על ידי כותרות, אבטחת JWS היא תכונה של המערכת. צוותים המשלבים ניתוח ידני קפדני עם אוטומציה המזהה סטיות באימות יכולים לשמור על שכבות האימות שלהם חזקות — גם כאשר המערכות האקולוגיות מתפתחות ומופיעים מצבי כשל חדשים.

מקורות אמינים וקריאה נוספת

RFC 7515: חתימת JSON באינטרנט (JWS). (עורך RFC)
RFC 7519: אסימון אינטרנט JSON (JWT). (מעקב נתונים של IETF)
PortSwigger: התקפות בלבול אלגוריתמים. (PortSwigger)
OWASP WSTG: בדיקת אסימוני JSON Web. (קרן OWASP)
דף עזר של OWASP: JSON Web Token עבור Java. (סדרת דפי העזר של OWASP)
ניל מדן: חתימות פסיכיות ב-Java. (ניל מדן)
ניתוח JFrog של CVE-2022-21449. (JFrog)
הסבר קריפטומתי של CVE-2022-21449. (קריפטומתיקה)

שתף את הפוסט:
פוסטים קשורים