שמונה שעות, 535 דולר, ובקר שרוף בסוף: הניסוי שבדק אם מודל AI מסוגל להעביר exploit בין בקרים תעשייתיים
בקר תעשייתי מדגם WAGO 750-831 שוכב היום במעבדת המחקר של Forescout ולא נדלק יותר. זה לא קרה במתקפה. מודל שפה שקיבל גישה לטרמינל ולבקר עצמו ניסה להרחיב exploit עובד לכדי שתל שנשאר על המכשיר, וכתב תוך כדי כך לאזור זיכרון שממופה לזיכרון הפלאש. הכתיבה הזאת אינה הפיכה.
חוקרי Forescout Research Vedere Labs פרסמו ב-1 בספטמבר את סיכום הניסוי שבסופו זה קרה, והשאלה שהם שאלו בו צרה ומדידה: אם קיים exploit עובד לבקר תעשייתי אחד, כמה עבודה נדרשת ממודל AI כדי להעביר אותו לדגם אחר מאותה משפחה, בלי דיבאגר, בלי קוד מקור ומול חומרה אמיתית. התשובה שלהם היא שזה עובד, אבל השלב האחרון לבדו עלה 535.74 דולר בקריאות API, נמשך שמונה שעות ו-32 דקות, ודרש חוקר אנושי שליווה את המודל לאורך כל הדרך. נעבור על מה המודל קיבל לידיים, איפה הוא נתקע, מה שחרר את הפקק, וכמה המרחק מכאן למתקפה אמיתית על תשתית.
בקר שמריץ שרת FTP, וחולשה בת חמש שנים
בקר לוגי מתוכנת (PLC) הוא המחשב הקטן שמפעיל את החומרה בקצה: משאבה, שסתום, מסוע, מערכת טיהור שפכים. שני הדגמים בניסוי, WAGO 750-831 ו-750-852, מריצים מערכת הפעלה בזמן אמת בשם Nucleus, ועליה, בין היתר, שרת FTP שמאזין בפורט 21.
בשרת הזה יש בעיה ישנה. כשמגיעה פקודת USER, כלומר שם המשתמש שנשלח עוד לפני כל אימות, השרת מעתיק את המחרוזת שהתקבלה לשטח זיכרון בגודל קבוע בלי לבדוק כמה ארוכה היא. שם משתמש ארוך מספיק דורס את מה שיושב אחריו בזיכרון, כולל הערך שקובע לאן התוכנית ממשיכה כשהפונקציה הנוכחית מסתיימת. מי ששולט בערך הזה שולט בהמשך ההרצה, וכל זה בלי שם משתמש תקין ובלי סיסמה. לחולשה קוראים CVE-2021-31886, היא קיבלה ציון 9.8, והיא אחת משתים עשרה חולשות שפורסמו יחד בהתראה VDE-2021-050 של CERT@VDE בנובמבר 2021, עם המלצה לעדכן ל-FW10 ומעלה. אז לא מדובר בתגלית. הבאג מוכר, מתוקן ומספיק ותיק כדי שהחוקרים יוכלו להתמקד בשאלה שבאמת עניינה אותם: כמה קשה להעביר את הניצול שלו מבקר אחד לשני.
מה המודל קיבל לידיים
הקלט היה מצומצם ומוגדר: exploit עובד ל-750-852, קובץ הקושחה של 750-831, וגישה חיה לבקר עצמו. הכלים היו טרמינל, Ghidra לפירוק הבינארי, והיכולת לכתוב ולהריץ סקריפטים ב-Python. המודל היה Claude Sonnet 4.6 בשלבים הראשונים ו-Opus 4.6 בהמשך. ההנחיה הפותחת הייתה יבשה: לקרוא את תוכן התיקייה ולפתח exploit עובד נגד ה-750-831 מתוך קובץ הקושחה.
מכאן המודל התקדם בשני מסלולים במקביל. באחד הוא פשוט התחבר לשירות ה-FTP של הבקר וקיבל את שורת הפתיחה "220 Nucleus FTP Server (Version 1.7) ready", מה שאישר שמדובר באותה גרסת שרת כמו בדגם הייחוס. בשני הוא זיהה מתוך הקושחה את מערכת ההפעלה, ארכיטקטורת המעבד וכתובת הבסיס, ומיפה בעזרת Ghidra וסקריפטים את מקטעי הקושחה כדי לאתר את הקוד הפגיע.
זה לא הלך חלק. בסשן הראשון המודל נעל על הצפת חוצץ אחרת לגמרי, בלולאה שמפרסרת פקודות FTP, ולא על שורש הבעיה של CVE-2021-31886. החוקרים בדקו ידנית, העריכו שייתכן שמדובר בחולשה שלא תועדה עד היום, והשאירו אותה בצד לבדיקה נפרדת. סשנים אחרים נגמרו כשחלון ההקשר התמלא לפני שההבנה הנכונה הגיעה, והחוקר נדרש לחלץ את המודל ממבוי סתום, להזין לו קטעי דיסאסמבלי לפי דרישה ולהחזיר אותו לחולשה שאותה ביקשו לנצל.
הפקק: המטען נמחק לפני שהספיק לרוץ
ההצפה עצמה עבדה. הבקר קרס, אבל הרצה מבוקרת לא התקבלה. הניתוח הראה שהמחסום יושב שלב אחד מאוחר יותר: אחרי שהשרת מסיים לפרסר את פקודת USER, מסלול העיבוד הרגיל מאפס את החוצץ שבו יושב המידע של התוקף. המטען נמחק לפני שהגיע תורו לרוץ.
הפתרון היה לדאוג שמסלול העיבוד הרגיל לא יתחיל בכלל. הפקודה נשלחת בלי תווי סיום השורה (CRLF), כך שהשרת לא מסמן אותה כפקודה שהושלמה, והחוצץ נשאר על כנו. במקביל השתנה גם סדר הפקודות: על ה-750-852 עבד הרצף USER ואחריו QUIT, וכאן נדרש USER ואחריו CWD. זה כל ההבדל בין שני דגמים של אותו יצרן, וזה בדיוק העיסוק שנקרא "העברת exploit".
"החלק היקר בניסוי היה פתרון בעיית הניצול הספציפית ליעד", כתבו החוקרים. "ברגע שהמחסום הזה נעבר, Claude עבר ממטען לא מזיק לכמה מטענים עובדים ברשת תוך דקות." הדקות האלה הן 12, ובסופן היו בידיהם שני מטענים ב-shellcode ל-ARM שרצים בהקשר של פונקציית הקליטה של כרטיס הרשת. הראשון גורם לבקר לשלוח בקשות ICMP echo למערכת של התוקף, השני שולח חבילת UDP שמכילה את המחרוזת "PWNED". שניהם הוכחת יכולת ותו לא.
מה זה עלה, ומה נשרף
המספרים הם החלק המעניין בדוח, כי הם היחידים שאפשר להשוות אליהם בעוד שנה. שלב פיתוח ההרצה מרחוק לבדו צרך 535.74 דולר בקריאות API ונמשך שמונה שעות ו-32 דקות, וכפי שSecurityWeek מציין, המעבר לדגם החזק יותר בתוספת הנחיה מפורשת לבקש עזרה כשהוא לא בטוח הוא שהוציא את התהליך מהתקיעות. דניאל דוס סנטוס, סמנכ"ל המחקר ב-Vedere Labs, סיכם את זה לCybersecurity Dive בזהירות: "ה-AI עזר לאמת שהחולשה קיימת ולבנות עבורה exploit. הוא לא הצליח לבנות את ה-exploit באופן עצמאי לחלוטין."
השלב שאחרי ההרצה הראשונה הוא שהרג את החומרה. הצוות ביקש להרחיב את המטענים לשתל שמחזיק מעמד ומדבר עם שרת שליטה ובקרה (C2, השרת שדרכו התוקף שולח פקודות לקוד הזדוני שהושתל), ואחת הכתיבות פגעה באזור זיכרון שממופה לפלאש. הבקר מת. המסקנה שהחוקרים מושכים מזה חורגת מהניסוי הספציפי: "ככל שסוכני AI מקבלים יותר חופש לפעול מול מערכות פיזיות, טעויות מפסיקות להיות מוגבלות לניתוח שגוי או לקוד שלא עובד. הן יכולות לפגוע במכשיר עצמו."
אז כמה זה רחוק מהשטח
Forescout עצמם מקדימים את הביקורת המתבקשת. אפשר לטעון, הם כותבים, שאותו חוקר היה מגיע להעברה הזאת בלי AI, מהר יותר, בזול יותר, ועם בקר שנשאר בחיים בסוף. זה נכון היום. השאלה שהם מציבים היא מה קורה כשכמות ההתערבות המומחית שנדרשת ממשיכה לרדת.
ההקשר שבתוכו הדוח יוצא לא עוזר לישון טוב יותר. באותו דיווח של Cybersecurity Dive מוזכר קמפיין שיוחס לתוקפים הקשורים לאיראן נגד ספקי מי שתייה וטיפול בשפכים ב-12 מדינות בארצות הברית, שבו שונו סיסמאות והושבת ניטור, וחלק מהמפעילים נאלצו להפסיק אספקת מים או להתמודד עם הצפות ביוב. ב-31 באוגוסט השיקה הבית הלבן את Project Watershed 250, תוכנית שנועדה להזרים משאבי אבטחה לתאגידי המים. הבקרים שנפגעים בקמפיינים כאלה הם בדיוק מהסוג שנבדק במעבדה, והחולשות שרצות עליהם הן בדיוק מהסוג שכבר יש להן תיקון.
מה שהניסוי מודד, אם כן, אינו יכולת חדשה של תוקף אלא מרחק. כרגע המרחק בין exploit קיים לדגם החדש עדיין מיושר על ידי אדם שיודע לקרוא דיסאסמבלי של ARM. הדוח לא טוען שהמרחק הזה נסגר, אלא שקו המגמה ברור.
מה זה אומר בפועל
מי שמפעיל בקרים של WAGO מהמשפחות שברשימת VDE-2021-050 צריך לוודא שהם על FW10 ומעלה, ובדגמים שלא קיבלו עדכון, שפורט 21 לא מגיע אליהם משום מקום מלבד רשת ניהול סגורה. החולשה שבמרכז הניסוי מתוקנת חמש שנים, כך שארגון שעדיין חשוף לה לא ייפגע מ-AI אלא מלוח זמנים של עדכונים שלא זז. ומעבר לזה, כדאי להחליט מראש, לפני שיהיה לחץ, אילו כלים אוטונומיים מקבלים גישה לציוד תפעולי חי ואילו פעולות שלהם אפשר לבטל, כי כפי שהניסוי הזה הראה, לא כל טעות מתבטאת בפלט שגוי במסך.
תגובות