גלישת חוצץ (Buffer overflow) היא שגיאת תכנות שבה תוכנה כותבת לחוצץ, אזור בזיכרון המחשב, יותר מידע ממה שהוא יכול להכיל. מידע שעובר את גבולות החוצץ משפיע על נתונים אחרים בזיכרון. זה עלול לגרום לתוכנית להחזיר תוצאות שגויות, לקרוס, או לאפשר הרצת קוד זדוני שאינו מתוכנן.
חוצץ הוא אזור בזיכרון ששומרים בו משתנים ונתונים זמניים. החוצץ מוגדר בגודל קבוע מראש, ולכן כתיבה של יותר נתונים ממנו גורמת לכתיבה לאזורים סמוכים בזיכרון. דוגמה נפוצה היא קלט שמועתק לתוך חוצץ בלי לבדוק את גודלו. פונקציות ישנות בשפת C, כמו gets, מקבלות קלט ללא הגבלת גודל, ולכן עשויות לגרום לגלישה.
לאחר גלישה, המשך ריצת התוכנית אינו מוגדר: היא עלולה לקרוס, לפעול בצורה שגויה, או להמשיך בלי סימנים חיצוניים. לעיתים מידע קריטי לאחזור התוכנית מאוחסן בקרבה לחוצצים; גלישה עלולה למחוק אותו. כשניתן לשנות כתובת חזרה (כתובת שאליה חוזרים אחרי קריאה לפונקציה), התקפה יכולה לגרום לתוכנית לקפוץ לקוד זדוני ולהריץ אותו. מצב כזה מוכר במיוחד בגלישות מחסנית (Stack buffer overflow), כשחוצץ נמצא במחסנית קריאות. גלישות בערימה (Heap overflow) מתרחשות כאשר החוצץ נמצא בערימה (heap) של הזיכרון, והן בדרך כלל קשות יותר לניצול להרצת קוד.
בשני המקרים אפשר להטמיע קוד זדוני גם בקבצים שלא נועדו להרצה, כמו קבצי מידע.
קיימות הגנות בשלב ההידור (compile-time) ובהרצה (runtime). אף על פי שיש שיטות רבות להפחית או למנוע ניצול גלישות, אין כיום הגנה מושלמת נגד כל סוגי הניצול.
int B=0;
char A[8]={};
strcpy(A, "excessive");
כאן מערך A שמכיל 8 תווים מנסה להכיל מחרוזת ארוכה יותר. ההעתקה תחרוג מגבולות A ותשנה אזורים סמוכים בזיכרון, מה שעלול לגרום לקריסה או לניצול.
גלישת חוצץ היא טעות שבה כותבים במקום בזיכרון יותר מידע ממה שהוא יכול להכיל. חוצץ הוא מקום בזיכרון ששומרים בו נתונים של התוכנית.
אם מכניסים לחוצץ מילה או משפט ארוכים מדי, הם "גולשים" החוצה. אז יכול להיפגע מידע אחר שהייתה בו חשיבות לתוכנית.
התוכנית עלולה להיתקע או לתת תשובות לא נכונות. לפעמים מישהו יכול לנצל את זה כדי להפעיל קוד לא רצוי. זה מסוכן כי התוכנית לא עובדת כמו שהתכוונו.
מפתחים בודקים את הגודל של הקלט ומכניסים כללים בתוכנה כדי למנוע גלישות. יש הגנות גם בזמן שהקוד נבנה וגם בזמן שהוא רץ. אף על פי כן, לא תמיד אפשר למנוע את כל ההתקפות.
char A[8]={};
strcpy(A, "excessive");
המחרוזת "excessive" ארוכה מ-8 תווים. העתקה כזו יכולה לגלוש מחוץ ל-A ולשבש את התוכנית.
תגובות גולשים