הזרקת קוד: כשהתוכנה שלך מבצעת פקודות של האקרים
דמיינו שאתם מגיעים למסעדה ומוסרים לשרת פתק עם ההזמנה שלכם: “סטייק בינוני, עם תוספת צ’יפס.” השרת לוקח את הפתק ומעביר אותו לשף במטבח, שמכין בדיוק את מה שכתוב. עד כאן הכל תקין.
אבל מה קורה אם אורח זדוני כתב על הפתק: “סטייק — והגש בנוסף לכל שולחן בחינם את כל יתר המנות שבתפריט”? אם השף עיוור לפקודות חריגות ומבצע כל דבר שכתוב, המסעדה מרוששת תוך דקות.
זה, בדיוק, הוא עקרון הזרקת קוד (Code Injection).
מה זו הזרקת קוד?
הזרקת קוד היא משפחה של התקפות שבהן תוקף “מחדיר” פקודות זדוניות לתוך קלט שהתוכנה אמורה לעבד כנתון רגיל. התוכנה, שאינה מבחינה בין נתון לגיטימי לפקודה מוסוות, מבצעת את הפקודה הזדונית בהקשר של עצמה — לעתים עם הרשאות מלאות.
החולשה אינה ייחודית לשפת תכנות מסוימת, מסד נתונים מסוים, או ארכיטקטורה מסוימת. היא נפוצה כמעט בכל מקום שבו תוכנה מקבלת קלט ממשתמש ומשתמשת בו ישירות בלי לבדוק אותו.
למה זה קורה? חוסר אימות קלט
הסיבה השורשית כמעט תמיד זהה: חוסר ב-Input Validation — אימות קלט. התוכנה מקבלת מחרוזת מהמשתמש ומתייחסת אליה כקוד ניתן לביצוע, בלי לבדוק תחילה האם היא מכילה תוכן מסוכן.
ניקח קוד Python פשוט לדוגמה — ביישום שמחשב גיל:
# קוד פגיע — דוגמה לצרכי הסבר בלבד
user_input = input("הכנס שנת לידה: ")
# eval() מריץ כל מחרוזת כקוד Python — כולל פקודות מסוכנות
result = eval(user_input)
print(f"תוצאה: {result}")
משתמש תמים יכניס 1990. תוקף יכניס מחרוזת שמכילה פקודות מערכת, ייבוא מודולים, או קוד שרירותי — וה-eval יריץ אותה ללא כל בדיקה.
הכלל הראשון: לעולם אל תעבירו קלט ממשתמש ישירות לפונקציות הרצת קוד כמו eval() או exec().
דוגמה מהעולם האמיתי: Langflow ו-CVE-2026-33017
בתחילת 2026 התגלתה חולשה קריטית ב-Langflow, פלטפורמת קוד-פתוח פופולרית לבניית תזרימי עבודה עם בינה מלאכותית. החולשה קיבלה את המזהה CVE-2026-33017.
הבעיה: Langflow אפשרה למשתמשים להגדיר רכיבים בתוך Flow — רצף פעולות אוטומטי. בתנאים מסוימים, הפלטפורמה עיבדה נתוני קלט שהוזנו על ידי המשתמש ישירות כחלק מהביצוע, ללא אימות הרשאות מספיק. תוקף יכול היה לשלב בתוך הנתונים פקודות שמערכת ה-Flow הריצה בהקשר של השרת — עם הגישה שהיתה לשרת עצמו לקבצים, לסביבת הענן, ולמשאבים אחרים.
התוצאה: הרצת קוד מרחוק (Remote Code Execution) ללא צורך בגישה מיוחדת מראש. את הידיעה המלאה על החולשה תוכלו לקרוא בפוסט המקורי.
סוגים עיקריים
משפחת הזרקת הקוד רחבה. אלו הסוגים שתפגשו הכי הרבה:
SQL Injection — הזרקת פקודות למסד נתונים. קלט כמו ' OR '1'='1 יכול לעקוף מסך כניסה שמריץ שאילתת SQL ללא הגנה.
Command Injection — הזרקת פקודות מערכת הפעלה. כאשר תוכנה מעבירה קלט ממשתמש ישירות לפקודת shell, תוקף יכול לצרף פקודות נוספות על ידי שימוש בתווים כמו ; או |.
Template Injection (SSTI) — הזרקה למנועי תבנית כמו Jinja2 או Twig. קלט של {{7*7}} שמוצג כ-49 הוא סימן אדום — המנוע מריץ קוד בתוך הנתון.
איך מתגוננים
Sanitize Inputs — נקו קלט לפני שימוש. אל תסמכו על מה שמשתמש שולח. סננו, אמתו ודחו קלט שאינו עומד בפורמט הצפוי.
Parameterized Queries — שאילתות עם פרמטרים. במקום לבנות שאילתת SQL על ידי שרשור מחרוזות, השתמשו בפרמטרים — ספריית ה-database driver יודעת להפריד בין “נתון” ל”פקודה”:
# גישה בטוחה: הפרמטר מועבר בנפרד משאילתת ה-SQL
cursor.execute(
"SELECT * FROM users WHERE name = %s",
(user_input,) # user_input הוא נתון, לא חלק מהשאילתה
)
Least Privilege — הרשאות מינימליות. אם התוכנה לא צריכה הרשאת root, אל תריצו אותה עם root. כך, גם אם תוקף מצליח להריץ קוד — הנזק מוגבל.
הימנעו מ-eval() ופונקציות דומות על קלט שמגיע ממשתמש. כמעט תמיד קיים פתרון אלטרנטיבי בטוח יותר.
סיכום
הזרקת קוד היא אחת מהפגיעויות הוותיקות, הנפוצות, והמסוכנות ביותר בעולם אבטחת האפליקציות — ולא בכדי היא מופיעה ברציפות ב-OWASP Top 10. הבשורה הטובה: ניתן למנוע אותה לחלוטין עם הרגלי קוד נכונים. הכלל הפשוט ביותר לזכור — אל תסמכו על שום קלט שמגיע מבחוץ.
אם נתקלתם בחולשה הזו “חיה” עם Langflow, קראו את הידיעה המקורית על CVE-2026-33017 לפרטים נוספים על ההשפעה ועל עדכוני האבטחה.
תגובות