RefluXFS: חולשה בת תשע שנים ב-XFS נותנת root על מיליוני שרתי לינוקס, וקוואליס מצאה אותה עם AI
חוקרי Qualys חשפו השבוע חולשה בליבת לינוקס שמאפשרת למשתמש מקומי רגיל, בלי שום הרשאה מיוחדת, להשיג הרשאות root מלאות. החולשה, שקיבלה את השם RefluXFS ואת המזהה CVE-2026-64600, יושבת במערכת הקבצים XFS, ברירת המחדל של משפחת Red Hat, וקוואליס מעריכה שהיא נוגעת ליותר מ-16.4 מיליון מערכות בעולם.
שלוש עובדות הופכות אותה למעניינת במיוחד. הבאג יושב בקוד מאז 2017 ופשוט חיכה שם. אין דרך לעקוף אותו או להתגונן ממנו בלי לעדכן את הליבה ולאתחל. והכי מסקרן, קוואליס לא מצאה אותו לבד, אלא כיוונה מודל AI של Anthropic אל קוד הליבה וביקשה ממנו למצוא באג ממשפחת Dirty COW. הפעם ה-AI ישב בצד של החוקרים, לא של התוקפים.
מה זה XFS ולמה reflink נכנס לתמונה
XFS היא מערכת קבצים ותיקה וביצועית שמשמשת כברירת המחדל ל-root filesystem בכל משפחת Red Hat: RHEL 8, 9 ו-10, וגם CentOS Stream, Oracle Linux, Rocky, AlmaLinux, CloudLinux, Amazon Linux ו-Fedora Server. הרכיב שעומד במרכז החולשה נקרא reflink, מנגנון של העתקה עצלה שנקרא גם copy-on-write.
כשמשכפלים קובץ עם reflink (דרך קריאת המערכת FICLONE), הנתונים לא מועתקים בדיסק. שני הקבצים מצביעים על אותם בלוקים פיזיים וחולקים אותם, עד שמישהו כותב. רק ברגע הכתיבה XFS מקצה בלוק פרטי חדש לכותב וממפה אליו מחדש את הקובץ שלו, כך שהעותק השני נשאר שלם. זו שיטה יעילה ובטוחה, כל עוד הרישום של מי חולק איזה בלוק מדויק לחלוטין. RefluXFS הוא בדיוק כשל ברישום הזה, כשמריצים שתי כתיבות במקביל.
הבאג: מרוץ בין שתי כתיבות
החולשה היא מצב מרוץ (race condition, מצב שבו שתי פעולות רצות במקביל והתוצאה תלויה במי מהן סיימה קודם) במסלול ה-copy-on-write. כך זה עובד, לפי קוואליס.
תוקף משכפל עם FICLONE קובץ בבעלות root, למשל /etc/passwd או קובץ הרצה עם דגל SUID (קובץ שרץ עם ההרשאות של הבעלים שלו, כלומר root, גם כשמשתמש רגיל מפעיל אותו), כך שהוא חולק בלוקים עם המקור. אז הוא יורה שתי כתיבות O_DIRECT במקביל אל הקובץ המשותף. O_DIRECT היא כתיבה ישירה לדיסק שעוקפת את מטמון הדפים בזיכרון.
במצב תקין, כשמגיעה כתיבה לבלוק משותף, XFS מקצה בלוק פרטי חדש וממפה מחדש. אלא שבזמן שהוא ממתין למקום ב-transaction log, יומן הרישום של הפעולות, הוא משחרר לרגע את נעילת ה-inode, הנעילה שאמורה להבטיח שרק פעולה אחת נוגעת במפת הבלוקים של הקובץ בכל רגע. הוא עושה זאת כדי להימנע מקיפאון (deadlock).
בחלון הקצר הזה הכותב השני משלים מחזור copy-on-write משלו, ממפה מחדש את הקובץ, ומוריד את מונה ההפניות של הבלוק המשותף לאחת. כשהכותב הראשון מקבל בחזרה את הנעילה, הוא בודק שוב את המונה לפי כתובת בלוק פיזית שלכד לפני השחרור, כתובת מיושנת. הוא רואה מונה שווה לאחת, מסיק שהבלוק פרטי, וכותב ישירות אליו ב-O_DIRECT. אבל הבלוק הזה עדיין שייך לקובץ המקורי בבעלות root, והנתונים של התוקף נוחתים בתוך הקובץ המוגן על הדיסק.
התוצאה היא שינוי מדויק של /etc/passwd או של קובץ SUID, שינוי שנכתב לדיסק, שורד אתחול, ולא משאיר שום שורה ביומן הליבה.
למה ההגנות הרגילות פשוט מפספסות
מה שהופך את RefluXFS לכל כך רחב הוא שכמעט כל שכבת הגנה מודרנית לא רלוונטית כאן. "מנגנוני הגנת זיכרון כמו KASLR, SMEP ו-SMAP מכוונים למשטחי תקיפה שונים לגמרי ופשוט לא חלים על כתיבות בשכבת הבלוקים", כתבו החוקרים. אלה הגנות מפני שחיתות זיכרון, ו-RefluXFS לא משחית זיכרון, הוא כותב לבלוקים בדיסק.
גם השאר לא עוזר. SELinux במצב enforcing לא חוסם את המסלול. ה-kernel lockdown לא מגביל את O_DIRECT או את FICLONE. seccomp יעזור רק אם יחסום את write ואת ioctl, קריאות מערכת שתוכנות רגילות זקוקות להן. גם קונטיינר לא מכיל את זה. קוואליס מתארת את הניצול כאמין וחוזר על עצמו תחת הקשחה סטנדרטית, ובלי שהתוקף זקוק ליכולת מיוחדת כלשהי מעבר לחשבון משתמש רגיל, מה שמעלה משמעותית את הסיכון שהחולשה תשמש בשטח. "זו לא חולשה שאפשר להקשיח סביבה, לבודד, או לתקן חם", מסכמת קוואליס. הדרך היחידה היא לעדכן את הליבה ולאתחל. זו גם הסיבה שהמספר 16.4 מיליון משמעותי: לא מדובר בכשל שמופיע רק בתצורה שגויה, אלא בהתקנת RHEL סטנדרטית עם XFS ו-reflink=1 שפגיעה מהרגע הראשון.
הפעם ה-AI חיפש את החולשה, לא ניצל אותה
החלק שמייחד את הסיפור הוא איך הבאג התגלה. "הגילוי צמח מיוזמת מחקר מובנית בין Qualys ל-Anthropic, שבה שילבנו את Claude Mythos Preview בתהליך הביקורת הידני שלנו כדי להאיץ את המחקר", כותבת החברה. החוקרים הטילו על המודל לחפש חולשות מרוץ ממשפחת Dirty COW, אותה חולשת copy-on-write מפורסמת בליבת לינוקס משנת 2016 (CVE-2016-5195) שגם היא נתנה root מקומי. בהדרגה הם צמצמו את המיקוד לקוד ניהול הזיכרון ומערכות הקבצים, והמודל אף הפיק קוד הדגמה עובד.
חשוב לא פחות מה שבא אחר כך: חוקרים אנושיים בדקו, שחזרו ואימתו באופן עצמאי כל ממצא. "כל ממצא כאן עבר את אותו רף ראיות שאנחנו מחילים על כל התראת אבטחה של Qualys", מדגישים בקוואליס. רוב הכותרות של השנה האחרונה על AI ואבטחה עוסקות בתוקפים שהופכים סוכני AI לכלי נשק. כאן אותה יכולת יושבת על שולחן העבודה של המגן, ובאג בן תשע שנים שחוקרים אנושיים חלפו על פניו במשך שנים צף כשכיוונו מודל אל הקוד הנכון עם השאלה הנכונה.
אותו שבוע, אותה קבוצה: תורו של אובונטו
יום לפני RefluXFS פרסמה אותה קבוצת מחקר של קוואליס חולשה שנייה, CVE-2026-8933, הפעם ברכיב snap-confine של אובונטו. זה הרכיב שבונה את סביבת הבידוד (sandbox) לאפליקציות snap, והחולשה בו מדורגת 7.8 ב-CVSS ופוגעת בהתקנות ברירת המחדל של Ubuntu Desktop 24.04, 25.10 ו-26.04.
גם כאן שורש הבעיה הוא שינוי הקשחה שהשתבש. Canonical העבירה את snap-confine ממודל set-uid-root למודל set-capabilities, מתוך כוונה לצמצם הרשאות. בפועל הרכיב רץ עכשיו עם ה-UID של המשתמש הקורא אך שומר על יכולות קרובות ל-root, ופותח חלון מרוץ בזמן הקמת ה-sandbox. התוקף מעגן (mount) מערכת קבצים מסוג FUSE מעל התיקייה הזמנית, משתמש בקישור סימבולי כדי להפנות פעולות לקובץ שרירותי, ומרחיב הרשאות לפני שהבעלות עוברת ל-root. בשלב האחרון הוא משתיל קובץ udev מסוג rules.d תחת /run/udev כדי לעקוף את AppArmor ולגרום ל-systemd-udevd להריץ פקודות כ-root. התוצאה זהה ל-RefluXFS: משתמש מקומי בלי הרשאות הופך ל-root. את המחקר הוביל Saeed Abbasi, ראש יחידת המחקר של קוואליס, והתיקון מגיע דרך עדכוני snapd בתיאום עם Canonical.
מה זה אומר בפועל
שתי החולשות מקומיות, כלומר התוקף צריך קודם חשבון על המכונה. לכן הן מסוכנות במיוחד בשרתים משותפים ורב-משתמשים, בשרתי ענן, ובכל מקום שבו דריסת רגל ראשונית (web shell, מפתח SSH גנוב) יכולה להפוך ל-root מלא. במשפחת Red Hat אין קיצור דרך: צריך לעדכן את הליבה לגרסה המתוקנת ולאתחל, כי שום שינוי תצורה לא חוסם את RefluXFS. משתמשי אובונטו דסקטופ צריכים רק את עדכון ה-snapd האחרון. בשני המקרים, החלון שקובע הוא הפער בין דריסת הרגל של התוקף לבין החלת העדכון.
תגובות