ברובוט Unitree G1 EDU, בקושחה עד גרסה 1.5.2, מי שנמצא בטווח Bluetooth יכול להריץ עליו קוד בהרשאות root בלי להצטמד למכשיר ובלי שום פרטי אימות. הרכיב שדרכו זה קורה הוא השירות שנועד להגדיר לרובוט את רשת ה-Wi-Fi. הציון הוא 7.7 מתוך 10, ושני תנאים הם שמחזיקים אותו שם: קרבה פיזית וניצול שאינו פשוט לביצוע.

מה החולשה?

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

מכאן מצטרפים שני באגים נפרדים.

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

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

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

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

מי מושפע?

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

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

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

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

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

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

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

מה עושים?

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

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

אל תסמכו כאן על הפרדת רשת. היא נכונה מסיבות אחרות וכדאי שתהיה, אבל מול החולשה הזאת היא אינה מוסיפה הגנה, כי הערוץ הוא Bluetooth ולא IP.

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

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