החוקרת הישראלית שמצאה חולשה בנאס"א חושפת את 4 הטעויות שנעשו בפיתוח
פריצה בציון חומרה של 9.4, שרשרת תקיפה מ-4 כשלים בנאליים ופתרון שהגיע בשילוב סוכני AI. חוקרת הסייבר יובל אלבר לוקחת אותנו אל מאחורי הקלעים של גילוי חולשת אבטחה בכלי המבצעי של NASA/JPL
תמונה: NASA
![]()
מאת: יובל אלבר
בעולם הפיתוח, טעויות כמו "שכחנו לסנן קלט" או "אין אימות ב-POST" הן עניין די יומיומי. במקרה הרע, האקר יחליף תמונה בדף הבית או ידליף רשימת מיילים. אבל מה קורה כששורות הקוד האלו מתגנבות ישר לתוך ממשק הבקרה של NASA/JPL, השרת שאחראי על ניטור חלליות, שידור פקודות וסנכרון ציוד בגלקסיה רחוקה רחוקה מכאן?
במחקר שביצענו לאחרונה התחלנו לחטט בקוד של AIT-GUI – ממשק המשתמש מבוסס הווב של ערכת הכלים AMMOS Instrument Toolkit. מדובר במערכת קוד פתוח שמהנדסים ומפעילים בנאס"א משתמשים בה כדי לתקשר עם ציוד במשימות חלל. לא דמיינו שנגלה שם חולשת אבטחה קריטית (GHSA-p9r8-2q67-fp86) שזכתה לציון חומרה כמעט מקסימלי של CVSS 9.4.
איך 4 פשלות קטנות מייצרות כרטיס טיסה חופשי להרצת פקודות מרחוק?
כדי להבין עד כמה הסיטואציה הייתה רגישה, תדמיינו שורת דלתות נעולות, רק שהמפתחים פשוט שכחו להתקין בהן מנעולים והשאירו שלט בו כתוב "נא לא להיכנס". לא נדרשו לשם כך סיסמה, שם משתמש או הרשאות מיוחדות. צירוף של ארבע שגיאות פיתוח קטנות יצר שרשרת תקיפה קטלנית.
1. שרת שאמר "אני מקשיב לכולם": בקוד היה משתנה host שקרא מתוך ההגדרות את הכתובת localhost. רעיון מצוין, נכון? רק שמי שכתב את הפונקציה שמקימה את השרת פשוט שכח להעביר אליה את המשתנה הזה.
host = getattr(self, "host", "localhost") # value is read, then never used
...
gevent.pywsgi.WSGIServer(
("0.0.0.0", port), # hardcoded: all interfaces
App, handler_class=WebSocketHandler,)
התוצאה: השרת נשאר מקובע (Hardcoded) על הכתובת 0.0.0.0. מפעיל המערכת בטוח שהוא מבודד ברשת המקומית, בזמן שהשרת שלו פתוח לרווחה לכל פנייה מכל כתובת IP ברשת.
2. אפס מנגנוני הגנה בסיסיים: במערכת לא הוטמעו מנגנוני התחברות (Login), אסימוני CSRF או הגבלות CORS. גרוע מכך, בקשות השינוי נשלחו בפורמט שהדפדפן מזהה כבקשה "פשוטה" (application/x-www-form-urlencoded), מה שמאפשר שיגור Cross-Origin ללא בדיקה מקדימה. במילים פשוטות: מספיק שמפעיל המערכת יגלוש לאתר תמים למראה בזמן עבודתו, כדי שהאתר ייזום ברקע בקשה שקטה שיכולה להריץ פקודות בשמו.
3. קו פתוח לשידור פקודות (POST /cmd): המערכת חשפה נקודת קצה שאפשרה לשלוח פקודות ישירות לרכיבים המבצעיים. בלי שכבת מגן ובלי פילטרים, הקלט שהגיע בטופס פשוט פורק והועבר ישירות ל-Command Bus של המערכת:
command = bottle.request.forms.get("command").strip()
args = command.split()
name = args[0].upper()
args = [util.toNumber(t, t) for t in args[1:]]
if self.send(name, *args): # the command is relayed to the bus
4. בריחה מהסנדבוקס (Path Traversal): הדובדבן שבקצפת התגלה ברכיב שאחראי על הרצת סקריפטים (POST /seq). הקוד לקח את שם הקובץ שמתקבל מהמשתמש ושרשר אותו לנתיב הראשי ללא בדיקת גבולות:
bn_seqfile = bottle.request.forms.get("seqfile")
seqfile = os.path.join(SEQRoot, bn_seqfile)
# no confinement; only os.path.isfile
gevent.subprocess.Popen(["ait-seq-send", seqfile], ...)
התוצאה: תוקף יכול להזריק נתיב מבוסס ../../../../ ולצאת מגבולות התיקייה המוגדרת כדי להריץ כל קובץ או סקריפט שקיים על השרת:
# sequence outside SEQRoot curl -i -X POST http://TARGET:8080/seq \ --data-urlencode 'seqfile=../../../../path/to/any/file'
כשהחוקרת פוגשת סוכני AI
אחד הדברים המרתקים בתהליך הגילוי היה השימוש שעשינו ב-Agentic AI – סוכנים אוטונומיים מבוססי בינה מלאכותית לניתוח קוד. בעוד שעין אנושית נוטה לפספס משתנה קטן שנקרא בקוד אך לא מועבר הלאה (כמו בשרת ה-0.0.0.0), סוכני ה-AI סרקו את תזרימי המידע והצליחו לחבר במהירות בין הקלט הלא-מסונן (Tainted Input) לבין הפעולות הדרמטיות ברכיבי הקצה. השילוב בין האינטואיציה של חוקר סייבר אנושי לבין היכולת של ה-AI לסרוק עומקים של קוד בקנה מידה רחב, הוא בדיוק מה שאיפשר לנו לפענח את שרשרת התקיפה המלאה תוך זמן קצר.
כמו בכל מחקר שאנחנו עושים, מיד עם גילוי החולשה פנינו לצוותי הפיתוח של נאס"א במסגרת הליך אסגרה מתואם. בנאס"א הגיבו במהירות, קיבלו את הדיווח, ותיקנו את הרכיבים החשופים בגרסת AIT-GUI 2.5.2 מעודכנת.
תמונה: NASA
אי אפשר לסמוך על סביבה סגורה
עולם ה-Web ועולם ה-OT (מערכות תפעוליות) חופפים היום יותר מתמיד. אם בקשת POST פרוצה באפליקציה רגילה תסתיים במקסימום בשיבוש בסיס הנתונים של האתר, במערכות OT – ובטח ובטח במערכות חלל – מדובר בפקודות שנשלחות לרכיבים פיזיים בשטח, ורדיוס הפיצוץ כאן הוא שונה לחלוטין.
ה-Firewalls הן כבר מזמן לא תוכנית עבודה. אי אפשר לסמוך על סביבה סגורה מתוך הנחה ש"אף אחד לא יגיע לשרת הפנימי". קוד פתוח – אפילו כזה שנכתב עבור פרויקטים של נאס"א – חייב להיבנות מתחילתו בגישת Zero Trust, עם מנגנוני אימות קפדניים, בקרת הרשאות הדוקה וסניטציה יסודית של כל קלט ברמת הקוד הבודדת.
ברמה האישית, כחוקרת סייבר, יש משהו כמעט עוצר נשימה ברגע הזה שבו את יושבת מול המסך בתל אביב, מסתכלת על כמה שורות פייתון, ומבינה שאת מביטה ישר לתוך מנוע השליטה של נאס"א. זה רגע שמזכיר שגם מאחורי המשימות הכי שאפתניות של האנושות עומדים בסופו של דבר בני אדם שכותבים קוד. הדיווח לצוות הפיתוח של נאס"א והתיקון המהיר שלהם היו תזכורת מעולה למה אנחנו עושים את מה שאנחנו עושים: לעזור למפתחים – על כדור הארץ או בחלל.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.