root על רובוט אנושי בשווי 20 אלף דולר, מטווח Bluetooth: שרשרת החולשות ב-Unitree G1
רובוט אנושי במשקל 40 קילו עומד בפינת המשרד. מישהו בטווח Bluetooth, שלא נגע בו מעולם ולא יודע עליו כלום, מריץ סקריפט אחד. תוך פחות מדקה יש לו הרשאות root על המחשב שמפעיל את המנועים, המצלמה והרמקול של הרובוט. משם הוא יכול לצותת דרך המיקרופון, לכבות את זיהוי ההתנגשויות, או פשוט להוציא את הרובוט מהבניין.
זה לא תרחיש תיאורטי. החוקר Olivier Laflamme פרסם ב-27 באוגוסט פירוק טכני מלא של שתי שרשראות חולשות ברובוט Unitree G1 EDU, הדגם האנושי שעולה כ-20 אלף דולר ומיוצר בידי חברת Unitree הסינית. שתי השרשראות קיבלו מזהי CVE נפרדים, CVE-2026-76639 בציון 8.8 ו-CVE-2026-76640 בציון 7.5, ושתיהן מגיעות לאותה נקודה: הרצת קוד כ-root על ליבת השליטה של הרובוט. בהמשך נראה איך הן עובדות, ולמה דווקא רכיב הענן של Unitree הוא זה שהפך את המתקפה מ"צריך כבל וגישה פיזית" ל"מספיק להיות ליד הרובוט".
מה יושב בתוך רובוט אנושי
בתוך ה-G1 יש כמה מחשבים שמדברים ביניהם ברשת פנימית. שניים מהם חשובים לסיפור. האחד הוא מחשב פיתוח שרץ עם SSH פתוח וסיסמת ברירת מחדל, אבל Laflamme בכוונה לא רצה שהמתקפה תסתמך על סיסמאות ברירת מחדל. השני, זה שבאמת מעניין, הוא ה-Locomotion PC: מחשב Rockchip שמריץ גרעין זמן-אמת של לינוקס, חושף בדיוק פורט TCP אחד החוצה, ומריץ 28 שירותים שכולם רצים כ-root בלי שום הפרדת הרשאות. הוא זה ששולט כמעט בכל רכיב פיזי ברובוט. Unitree עצמה מתייחסת אליו כאל קופסה שחורה סגורה, וזו בדיוק הסיבה שהיא שמורה שם כל הרגישות: מפתחות הפעלה של שירותי ענן, סודות חתימה של האפליקציה, וכ-15 סודות רגישים נוספים.
כל מה שהחוקר צריך זה דריסת רגל אחת בתוך המחשב הזה. אחרי שהיא מושגת, הרובוט כולו שלו.
החולשה הראשונה: מסלול קובץ שיוצא מהגבולות
אחד מ-28 השירותים נקרא chat_go, והוא מנהל את שיחת ה-AI של הרובוט: קול, מענה, והמרת טקסט לדיבור. חלק ממנו מאפשר לאפליקציה של הטלפון להעלות פסקאות טקסט שה-AI יתייחס אליהן, מעין מאגר ידע. הבעיה: שם הקובץ שמתקבל בהעלאה לא נבדק כמו שצריך, כך שאפשר לשתול ערכי `../` ולכתוב קובץ למקום אחר לגמרי מזה שהיה אמור. השם הטכני לזה הוא Path Traversal (יציאה מתיקיית היעד המיועדת בעזרת רצף חזרה למעלה במערכת הקבצים).
וזה בדיוק המקום שנכנס bashrunner, שירות אחר שמריץ סקריפטים מתוך תיקייה מסוימת. התוקף כותב, דרך החולשה ב-chat_go, סקריפט לתוך אותה תיקייה, מבקש מ-bashrunner להיטען מחדש כדי שיוסיף אותו לרשימת ההרצה שלו, ואז מפעיל אותו. bashrunner רץ כ-root, אז הקוד רץ כ-root. הנתונים ל-chat_go מגיעים דרך אותו פורט WebRTC היחיד שחשוף החוצה, אחרי שהתוקף פותח אליו ערוץ. עד כאן צריך עדיין להכניס כבל רשת לצוואר הרובוט. הצד הבא של הסיפור, איך מוותרים על הכבל, מעניין יותר.
הלב של המתקפה: הענן שפענח כל מפתח
כדי לתקשר עם ה-G1, גם דרך WebRTC וגם דרך Bluetooth, צריך מפתח הצפנה AES ייחודי לכל רובוט. המפתח נוצר פעם אחת, לא מתחלף, ויושב בקובץ קטן על ה-Locomotion PC. בלי המפתח הזה אי אפשר אפילו לקרוא את התשובות של הרובוט. אז איך תוקף אקראי משיג אותו?
כאן מגיעה הבעיה החמורה באמת. כשמחברים G1 חדש לטלפון, הרובוט מוסר את המפתח שלו ארוז: הוא מצפין אותו במפתח RSA ומחזיר רק את הגרסה המוצפנת, כזו שרק שרתי הענן של Unitree אמורים לפתוח. הרעיון הגיוני. הבעיה היא מה שקורה אחר כך. האפליקציה שולחת את הבלוב המוצפן ל-endpoint בענן של Unitree בשם `/device/bindExtData`, והשרת מחזיר בתגובה את מפתח ה-AES הגלוי. השרת בדק שהבקשה הגיעה מחשבון Unitree תקין, אבל לא בדק בכלל שהחשבון הזה הוא הבעלים של הרובוט. במילים אחרות, האימות היה קיים אבל ההרשאה חסרה. כל מי שפתח חשבון חינם יכול היה לשלוח בלוב של רובוט זר ולקבל בחזרה את המפתח שלו.
זו הנקודה שהפכה שרת שנועד לפענח-ולשייך לכלי שמפענח מפתחות של רובוטים זרים לכל דורש. ואת הבלוב המוצפן אפשר למשוך מהרובוט מטווח Bluetooth בלי צימוד ובלי אימות: ה-G1 מקבל כתיבה על מאפיין GATT מסוים בלי לדרוש pairing, ופקודת bootstrap גלויה גורמת לו להחזיר את החבילה המוצפנת. גם המספר הסידורי, שנדרש לבקשת הענן, משודר לכל מי שבטווח. Unitree תיקנה את חולשת הענן ביולי 2026 והוסיפה בדיקת בעלות, אחרי שהחוקר דיווח עליה.
מכבל רשת ל-Bluetooth בלבד
עם המפתח ביד, התוקף יכול להשלים את לחיצת היד המוצפנת מול הרובוט ולפתוח את פקודות הגדרת ה-WiFi דרך Bluetooth. כאן נמצאת החולשה השנייה. כשמגדירים לרובוט רשת WiFi, סקריפט bash פנימי מרכיב קובץ הגדרות ומכניס לתוכו את שם הרשת והסיסמה שקיבל, בלי לנקות תווים מיוחדים. אם הסיסמה ארוכה מספיק, הסקריפט נופל לנתיב יצירה ידני, ושם התוקף יכול לסגור את שדה הסיסמה בגרשיים, לפתוח בלוק רשת חדש משלו ולהכריח את הרובוט להתחבר לנקודת גישה שהוא שולט בה. זו לא הרצת פקודות, אלא הזרקה לתוך קובץ ההגדרות, אבל התוצאה מספיקה: הרובוט קופץ לרשת של התוקף תוך כ-45 שניות, בלי כבל ובלי גישה פיזית.
החלק האחרון הוא גלישה של חוצץ (buffer overflow, כתיבה של יותר נתונים ממה שהמשתנה יכול להכיל, שדורסת זיכרון סמוך). מנגנון איסוף שם הרשת מעתיק כל מקטע נתונים לחוצץ בגודל 500 בייט בלי לבדוק גבולות, והמונה שלו שורד ניתוקים של Bluetooth. כך אפשר לבנות מטען של 1,050 בייט לאורך שלושה חיבורים נפרדים, לדרוס מצביע פונקציה בזיכרון, ולגרום ללולאת הניקוי של השירות לקרוא ל-`system()` עם פקודה של התוקף, שוב כ-root. כדי לחשב את הכתובות המדויקות בזיכרון, החוקר חזר לחולשה הראשונה: chat_go, שרץ כ-root, קורא עבורו את מפת הזיכרון של התהליך ומגלה את כתובת הבסיס. שתי השרשראות משתלבות זו בזו.
למה זה מעבר לרובוט בודד
Laflamme קרא לשרשרת UniBLEed, והדגיש נקודה מטרידה: היא ניתנת להפצה עצמית. רובוט G1 שנפרץ יכול לתקוף רובוט G1 אחר בטווח Bluetooth, וזה את הבא. הוא בדק רק שני רובוטים באותו חדר, ולא יודע כמה אפשר לשרשר, אבל העיקרון עובד. הוא שחזר את החולשות על ארבעה רובוטים שונים בגרסת קושחה 1.5.2 ומטה, וקיבל על שתי השרשראות תגמול של 5,000 דולר במסגרת תוכנית הבאג-באונטי של Unitree.
יש כאן גם הערת שוליים ששווה לשים לב אליה, דווקא בשבוע שבו הכותרות מלאות בסיפורים על תוקפים שמפעילים סוכני AI. החוקר ציין שהמחקר הזה נמצא כולו בידי אדם, בלי AI בלולאת החיפוש והניצול. הרובוטיקה, הוא כותב, היא תחום שבו כמעט לא מתפרסם מחקר אבטחה, ורוב חברות הרובוטיקה כלל לא מגייסות אנשי אבטחה. ה-G1 הוא מקרה מבחן נדיר של מה שמסתתר בקושחה של מכשיר שאפשר להזמין באמזון ולהעמיד בסלון תוך שבוע.
מה זה אומר בפועל
מי שמפעיל רובוטים של Unitree בסביבה ארגונית צריך לוודא שהם על גרסת הקושחה העדכנית, ולזכור שהתיקון המרכזי, בדיקת הבעלות בענן, כבר בוצע בצד של Unitree ולא דורש פעולה מהמשתמש. חשוב יותר מכך: רובוט אנושי הוא endpoint לכל דבר, מחשב מרושת עם מצלמה, מיקרופון ומנועים, ולא צעצוע. הוא צריך לשבת ברשת מבודדת, הרחק מנכסים רגישים, ומי שמפעיל אותו במרחב ציבורי כדאי שיניח שכל מי שבטווח Bluetooth הוא תוקף פוטנציאלי עד שיוכח אחרת.
תגובות