Nacos הוא שרת שמערכות מרובות שירותים מחזיקות בו את ההגדרות שלהן ואת רשימת השירותים הפעילים. בגרסאות שקודמות ל-1.4.1 יש בו רכיב ניהול ובתוכו שני endpoint-ים, אחד מוגן בבדיקת הזדהות והשני לא, וזה שאינו מוגן פתוח לכל מי שמצליח לפנות לשרת. הציון שנקבע לחולשה הוא 8.6 מתוך 10, והיא נסגרה בגרסה 1.4.1.

מה החולשה?

ברכיב בשם ConfigOpsController יש פעולות תחזוקה על מסד הנתונים של Nacos. אפשר להריץ דרכן שאילתה, ולפי התיאור ברשומה אפשר גם למחוק את תוכנו. פעולות כאלה אמורות להיות סגורות בפני מי שלא הזדהה, והמנגנון שסוגר אותן קיים בקוד: הגדרה בשם @Secured שנצמדת לפעולה ומחייבת בדיקת הרשאה לפני שמפעילים אותה.

ההגדרה הזאת אכן נמצאת על ה-endpoint שאחראי על מחיקה, /data/remove. על ה-endpoint השני, /derby, היא אינה נמצאת. אין כאן מנגנון שבור ואין עקיפה מחוכמת, אלא פעולה אחת שלא קיבלה את ההגדרה שחברתה קיבלה, ולכן בקשה שמגיעה אליה אינה נבדקת כלל. ברשומה הסוג הזה מסומן CWE-306, היעדר אימות לפעולה קריטית.

הפער בין שני ה-endpoint-ים הוא כל החולשה.

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

מי מושפע?

כל גרסת Nacos שקודמת ל-1.4.1. אבל יש כאן תנאי שמצמצם מאוד, והוא מופיע בתיאור עצמו: הפעולות האלה תקפות רק כשהשרת עובד עם אחסון מוטבע, כלומר עם מסד הנתונים Derby שמגיע בתוך Nacos. לפי אותו תיאור, התקנות שמחוברות למסד נתונים חיצוני, למשל MySQL, אינן אמורות להיות מושפעות.

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

האם מנוצלת בפועל?

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

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

מה עושים?

1. התחילו מהשאלה הקלה: איזו גרסה רצה אצלכם. הטווח שברשומה הוא כל מה שקודם ל-1.4.1.

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

3. עדכנו ל-1.4.1 ומעלה. בקשת המשיכה שמצורפת לרשומה כעדכון היא השינוי עצמו, הדיון שנפתח סביבה מתאר את הבעיה כפי שדווחה, ויש גם התראה רשמית ב-GitHub.

4. עד שתעדכנו, הגבילו מי יכול בכלל לפנות לשרת. endpoint שאינו דורש הזדהות מסוכן במידה שבה הוא נגיש, ושרת Nacos שאינו חשוף לאינטרנט מקטין את מספר מי שיכול להגיע אליו מלכתחילה.