העדכון שאתם לא יכולים להרשות לעצמכם לדלג עליו: סוף התמיכה ב-Office 2016 ו-Office 2019

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

IngressNightmare: פגיעות ותיקון של ביצוע קוד מרחוק CVE-2025-1974

עַל יְדֵי OPSWAT
שתף את הפוסט הזה

מאי 2025 סימן את חשיפתה של פגיעות אבטחה קריטית, CVE-2025-1974, המכונה IngressNightmare, המשפיעה על בקר ingress-nginx של Kubernetes הפרוס באופן נרחב בתשתיות ענן מקוריות. פגיעות זו מאפשרת לתוקפים לא מאומתים להחדיר תצורות שרירותיות ל-NGINX, מה שעלול להוביל ל-RCE (ביצוע קוד מרחוק) לא מורשה ולפגיעה מלאה באשכול.

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

סקירה כללית של CVE-2025-1974 

CVE-2025-1974 היא פגיעות קריטית של הזרקת תבניות שזוהתה בגרסאות ingress-nginx עד 1.11.4 ובאופן ספציפי 1.12.0. תוקפים בעלי גישה ברמת הצומת לאשכול Kubernetes יכולים לנצל פגם זה כדי לבצע קוד שרירותי באמצעות RCE דרך בקר ingress-nginx אשר, כברירת מחדל, בעל הרשאות נרחבות, כולל גישה לסודות קריטיים בתוך האשכול.

ועדת התגובה לאבטחה של Kubernetes הקצתה לפגיעות זו ציון CVSS v3.1 של 9.8 (חומרה קריטית):

ממשק משתמש של מדדי CVSS עבור CVE-2025-1974 המציג אפשרויות ניצול והשפעה עבור IngressNightmare

רכיבים מרכזיים בניתוח זה

סקירה כללית של קוברנטס

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

בקר כניסה של NGINX

בקר כניסה של NGINX (ingress-nginx) הוא בקר כניסה בקוד פתוח הבנוי על גבי שרת האינטרנט של NGINX. הוא פועל בתוך אשכול Kubernetes, ומתפקד בעיקר כ-reverse proxy ומאזן עומסים. בקר זה מפרש משאבי כניסה המוגדרים על ידי משתמשים ומתרגם אותם לתצורות NGINX ניתנות לפעולה כדי לנתב את זרימת התעבורה לתוך ובתוך האשכול.

סקירת קבלה ותפקידה

Ingress-nginx משתלב עם Kubernetes באמצעות שירות webhook בשם AdmissionReview. שירות זה חיוני לעיבוד אובייקטי Ingress מקוריים של Kubernetes ותרגומם לתצורות NGINX מאומתות ונכונות מבחינה תחבירית. בעוד AdmissionReview מבטיח דיוק תצורה, הוא פועל באופן עצמאי מבקר ingress-nginx ובדרך כלל חסר בקרות אימות מחמירות. חוסר אימות קפדני זה הוא גורם מפתח שתרם לניצול CVE-2025-1974.

דיאגרמת CVE-2025-1974 (IngressNightmare) המציגה את AdmissionReview בתהליך עבודה של בקר NGINX של Kubernetes Ingress

ניצול פגיעויות וניתוח טכני

מנגנון ניצול

בליבתה, ניצול ה-CVE-2025-1974 מתחיל בבקשה זדונית. תוקפים יוצרים בקשה זדונית ל-webhook של AdmissionReview, מה שמאלץ את NGINX לטעון באופן דינמי ספרייה משותפת בזמן ריצה. בהתבסס על מנגנון זה, עמיתינו ניתחו הן את webhook של AdmissionReview והן את זרימת העבודה של NGINX כדי להבין את נתיב הניצול.

דיאגרמת CVE-2025-1974 (IngressNightmare) המציגה את נתיב ניצול Kubernetes דרך אובייקט ingress זדוני ו-NGINX

פגיעות בהזרקת תבנית

ב-webhook של AdmissionReview, בעת עיבוד בקשות נכנסות, הפונקציה CheckIngress הופכת אובייקטי Kubernetes Ingress לקבצי תצורה חוקיים של NGINX. הזרימה מתנהלת באופן הבא:

קטע קוד של Go המציג לוגיקת הזרקת תבנית הקשורה לפגיעות CVE-2025-1974 (IngressNightmare)
  1. כל תצורה מנותחת ומועברת ל- generateTemplate כדי שתעוצב בהתאם לתבניות NGINX מוגדרות מראש.
  2. לאחר מכן, testTemplate מאמת את התצורה שנוצרה מול הקובץ הבינארי NGINX הבסיסי.

כל תצורות NGINX מבוססות על תבניות מוגדרות מראש הנמצאות בקובץ nginx.tmpl בתוך קוד המקור ingress-nginx:

קטע קוד המציג פגיעות של הזרקת תבנית הקשורה ל-CVE-2025-1974 (IngressNightmare)

בתוך הפונקציה generateTemplate , התצורה מעובדת כפי שמוצג בקטע הקוד הבא:

קטע קוד Go המציג לוגיקת ניתוח הערות הקשורה להזרקת תבנית CVE-2025-1974 (IngressNightmare)

עם זאת, אימות וחיטוי הקלט אינם מספיקים. באופן ספציפי, שדה ה- uid מאובייקט Ingress מוכנס ישירות לתבנית התצורה של NGINX, ויוצר נקודת הזרקה. תוקף יכול לנצל זאת על ידי אספקת קלט מעוצב כגון uid="1234#;\n\n}\n}\n}\n injection_value" .

קלט זדוני זה מאפשר הזרקת היקף גלובלי לתבנית NGINX, מה שמאפשר לתוקפים להפעיל הנחיות NGINX שרירותיות ואולי להשיג RCE.

קוד תצורה של Nginx המציג הזרקת תבנית הקשורה לפגיעות CVE-2025-1974 (IngressNightmare)

מהזרקת תבנית לביצוע קוד מרחוק

הסבר על הפונקציה testTemplate()

לאחר יצירת תצורת NGINX על ידי הפונקציה generateTemplate , הפונקציה testTemplate יוצרת קובץ תצורה זמני ומפעילה את ספריית NGINX באמצעות הפקודה nginx -c {config_file} -t . פעולה זו מאלצת את הקובץ הבינארי של NGINX לנתח ולאמת את התצורה.

קוד Go עבור הפונקציה testTemplate() וממשקים הקשורים לפגיעות CVE-2025-1974 (IngressNightmare)

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

צילום מסך של הקוד המציג את התחביר וההקשר של load_module, הרלוונטיים ל-CVE-2025-1974 (IngressNightmare)
פלט הטרמינל מציג כשל בבדיקת הגדרות nginx הקשור לשגיאת load_module של CVE-2025-1974 (IngressNightmare).

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

צילום מסך של קוד המסביר את תחביר התקן ssl_engine עבור הקשר CVE-2025-1974 (IngressNightmare)

הבנת הוראת ssl_engine

כדי להבין לעומק את האופן שבו NGINX מטפל בהוראת ssl_engine , וכן לקבוע את התנאים שבהם NGINX מאפשר טעינה דינמית של מודולים נוספים באמצעות הוראת ssl_engine, בדקנו את קוד המקור של NGINX.

קטע קוד C המציג ניתוח תצורת NGINX, רלוונטי להוראת ssl_engine של CVE-2025-1974 (IngressNightmare)

בעת ההפעלה, NGINX טוען את מצבו ההתחלתי, ולאחר מכן מנתח את קבצי התצורה שורה אחר שורה. כל הוראה מטופלת על ידי המבנה nginx_command_t , כאשר ההנחיה ssl_engine מפעילה ישירות את ngx_openssl_commands .

הגדרת struct C עבור ngx_command_s הקשורה להוראת ssl_engine של CVE-2025-1974 (IngressNightmare)
איור 1. הגדרת ngx_command_s
קטע קוד המציג מערך של הנחיות ssl_engine, הרלוונטי להקשר של CVE-2025-1974 (IngressNightmare).
איור 2 מבנה ssl_engine ngx_command_t

לאחר ניתוח הפונקציה ngx_openssl_commands , גילו עמיתינו שהיא מסתמכת על תמיכה ב-OpenSSL, ובפרט על הפונקציה ENGINE_by_id המשמשת עבור מודולי SSL המואצים על ידי חומרה.

קטע קוד C המציג את לוגיקת ההנחיה ssl_engine, הרלוונטית לניתוח CVE-2025-1974 (IngressNightmare)

ובזמן ניתוח הפונקציה ENGINE_by_id , קבענו שהיא מאפשרת טעינה דינמית של ספריות משותפות. יתר על כן, אם הספרייה עוברת קומפילציה עם הסיומת __attribute__((constructor)) , ניתן לבצע את הפונקציה המשויכת מיד לאחר הטעינה. משמעות הדבר היא שעל ידי ניצול הוראת ssl_engine , תוקף יכול לטעון ספריות משותפות שרירותיות על המארח, מה שעלול להוביל ל-RCE.

מיקוד בספריות משותפות ואסטרטגיית תקיפה

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

קוד nginx.conf המציג נתיבי זמניים והגדרות מאגר, רלוונטי למתקפת CVE-2025-1974 (IngressNightmare).

כברירת מחדל, כאשר בקשה נכנסת עולה על 8KB, NGINX כותב את גוף הבקשה לקובץ זמני הממוקם בכתובת /tmp/nginx/client-body, תוך שימוש בשם קובץ בפורמט cfg-{random_value}. קבצים זמניים אלה נשמרים עד 60 שניות בין קטעים מוצלחים של הודעה שהתקבלה.

דיאגרמת CVE-2025-1974 (IngressNightmare) המציגה את זרימת ההתקפה המכוונה לספריות משותפות וקבצי NGINX זמניים

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

תרשים המציג את זרימת ההתקפה CVE-2025-1974 (IngressNightmare) המכוון לספריות משותפות של NGINX ולמחיקת קבצים

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

קוד פייתון המנצל את CVE-2025-1974 (IngressNightmare) עם כתיבת קבצים ולוגיקת לולאה אינסופית

This code opens a file and keeps it in an active state, closely mimicking the behavior of NGINX's client body buffer mechanism. Using /proc/{pid}/fd directory, attackers can find symbolic links created by the Linux kernel that map open file descriptors to their corresponding file paths. This route allows attackers to reduce the brute-force space to only two variables: the process ID (pid) and the file descriptor (fd).

פלט הטרמינל המציג פרטים על תהליכים ומתארי קבצים הרלוונטיים לאסטרטגיית ההתקפה CVE-2025-1974 (IngressNightmare)

סימולציה של ניצול

בהתבסס על הניתוח לעיל, גישת ניצול מעשית עבור RCE בתוך פוד Ingress-NGINX היא:

  1. העלה ספרייה משותפת זדונית באמצעות מנגנון המאגר של גוף הלקוח של NGINX כדי לאחסן אותה באופן זמני במערכת הקבצים.
  2. השתמשו בהזרקת תבנית כדי להתחיל ניסיון Brute Force שמאלץ את NGINX לטעון את הספרייה המשותפת שהועלתה בעבר באמצעות הנחיות פגיעות.
דיאגרמת זרימה של VE-2025-1974 (IngressNightmare) המציגה את נתיב ההתקפה דרך Ingress-NGINX ל-NGINX

יצירת המטען המכיל את הספרייה המשותפת

כדי להבטיח ביצוע קוד בעת הטעינה, פונקציית נקודת כניסה (entrypoint function) עם סיומת בנאי מוגדרת בתוך הספרייה המשותפת הזדונית. פונקציה זו מבוצעת בעת הטעינה על ידי NGINX ונועדה ליצור חיבור shell הפוך (reverse shell) למארח מרוחק. 

קוד C עבור יצירת מטען CVE-2025-1974 (IngressNightmare) עם ספרייה משותפת ופקודת מעטפת הפוכה

לאחר הקומפילציה, גודל הספרייה המשותפת שהתקבלה עלה בנוחות על 8KB, מה שאפשר לאחסן אותה במאגר על ידי NGINX ללא צורך בריפוד נוסף.

רשימת טרמינלים המציגה את הספרייה המשותפת danger.so עבור יצירת מטען CVE-2025-1974 (IngressNightmare)

לאחר מכן, חברינו יצרו בקשה עם ערך Content-Length מנופח (למשל, 1MB) כדי ליצור אי-התאמה בגודל. זה גרם ל-NGINX לאחסן במאגר את כל הגוף במקום לעבד אותו באופן מיידי, מה שהבטיח שהאובייקט המשותף ייכתב למיקום צפוי.

קוד Go ליצירת מטען עם ספרייה משותפת, הקשור לניצול CVE-2025-1974 (IngressNightmare)

הפעלת הספרייה המשותפת באמצעות הזרקה

לאחר שהספרייה המשותפת הייתה קיימת, הזרקנו הנחיה זדונית לתצורת NGINX באמצעות השדה vulnerable uid . הנחיה זו כללה ssl_engine שהצביע על נתיב הקובץ המאוחסן במאגר:

קוד JSON המציג אובייקט Kubernetes Ingress עם הזרקה עבור פרצת CVE-2025-1974 (IngressNightmare)

RCE מוצלח דורש שההוראת ssl_engine תפנה לנתיב הנכון לקובץ המאוחסן במאגר. ניתן להשיג זאת באמצעות סקריפט Brute Force אוטומטי שמבצע איטרציות שיטתיות על צירופים אפשריים של מזהי תהליכים ותיאורי קבצים כדי לזהות את הקישור הסמלי התקף המצביע על האובייקט המשותף המאוחסן במאגר.

קוד Go המנצל את CVE-2025-1974 (IngressNightmare) באמצעות הזרקת ספרייה משותפת ואימות Webhook

להלן דוגמה לתבנית NGINX שנוצרה שהפעילה את הניצול לרעה.

קוד קונפיגורציה של Nginx המציג הזרקת CVE-2025-1974 (IngressNightmare) דרך ssl_engine והנחיות mirror

לאחר ניצול מוצלח, התוקף יכול היה לקבל גישה ל-shell תחת ההקשר של pod ingress-nginx, אשר כברירת מחדל הייתה לו גישה לסודות אשכול רגישים של Kubernetes.

פלט טרמינל המציג את הפקודה kubectl get secrets -A, הרלוונטית ל-CVE-2025-1974 (IngressNightmare)

הפחתה ותיקון

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

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

צילום מסך של ממשק המשתמש המציג את הפגיעות הקריטית CVE-2025-1974 (IngressNightmare) ב-nginx-ingress-controller

בדוגמה לעיל, טכנולוגיית SBOM ב MetaDefender Core™‎ סרק את חבילת nginx-ingress-controller שהכילה את הפגיעות CVE-2025-1974. המערכת סימנה אוטומטית את הבעיה כקריטית וסיפקה הנחיות לגבי גרסאות מתוקנות זמינות, מה שאפשר לצוותים לתעדף ולתקן במהירות את הפגיעות לפני שניתן יהיה לנצל אותה.

OPSWAT SBOM זמין ב MetaDefender Core ו MetaDefender Software Supply Chain™, המאפשר לצוותי אבטחה לזהות ולפעול על פגיעויות מהר יותר . עם OPSWAT SBOM, צוותי אבטחה יכולים:

  • איתור מהיר של רכיבים פגיעים - זהה באופן מיידי את רכיבי הקוד הפתוח שנפגעו מהתקפות ביטול סריאליזציה. זה מבטיח פעולה מהירה בתיקון או החלפת הספריות הפגיעות. 
  • ודא תיקון ועדכונים פרואקטיביים - ניטור רציף של רכיבי קוד פתוח באמצעות OPSWAT SBOM כדי להקדים את תהליכי ביטול הסידורים בנוגע לפגיעויות. OPSWAT SBOM יכול לזהות רכיבים מיושנים או לא מאובטחים, מה שמאפשר עדכונים בזמן והפחתת החשיפה להתקפות. 
  • לשמור על תאימות ודיווח – OPSWAT SBOM מסייעת לארגונים לעמוד בדרישות התאימות, כאשר מסגרות רגולטוריות מחייבות יותר ויותר שקיפות בשרשראות אספקה ​​של תוכנה.
תגיות:

הישאר מעודכן עם OPSWAT !

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