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

מה החולשה?

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

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

מכאן זה פשוט. לפי הרשומה, תוקף שמפרסם מאגר ב-Hugging Face Hub עם קובץ בשם None.py שמכיל מחלקה יורשת מ-DiffusionPipeline, לצד קובץ הגדרות שנראה תקני לחלוטין ומפנה לשם של צנרת לגיטימית, מקבל הרצת קוד ברגע שמישהו טוען את המאגר בקריאה סטנדרטית בלי שום פרמטר נוסף. הרשומה מתארת את זה כהרצת קוד שקטה, ובצדק: מבחינת המשתמש לא קרה שום דבר חריג.

מי מושפע?

לפי הרשומה מושפעות גרסאות diffusers שקודמות ל-0.38.0, והחולשה תוארה בגרסה 0.37.0. התיקון נמצא ב-0.38.0.

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

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

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

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

מה עושים?

עדכנו את diffusers ל-0.38.0 או מעלה. בסביבת פייתון זה pip install שמשדרג את החבילה, וכדאי לוודא אחר כך שהגרסה שמותקנת בפועל בסביבה הווירטואלית היא זו ולא גרסה ישנה שנשארה בקובץ הדרישות.

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

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

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