השחתת זיכרון – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
Felagund-bot (שיחה | תרומות)
מ בוט - מחליף 'בד"כ' ב'בדרך כלל', 'קבצי ' ב'קובצי '
אין תקציר עריכה
שורה 3:
דוגמה בולטת להשחתת זכרון היא נסיון גישה לתא ב[[מערך (מבנה נתונים)|מערך]] כאשר הוא אינו קיים. בעיה זו ניתן למצוא במרבית שפות התכנות, בחלקן תהיה הודעת שגיאה ובחלק - לא. למשל ב[[C (שפת תכנות)|שפת התכנות C]], תאים במערך מקבלים ערכים סדורים החל מ־0 ולא מ־1, ולכן למעשה התא ה־n (והאחרון) מקבל את התווית 1-n. טעות תכנותית נפוצה היא נסיון כתיבה לתא הלא קיים n, דבר אשר גורם להשחתת זכרון שלא בניהול המערך (אם כי, יש לציין שרוב הסיכויים שהזכרון הנפגע שייך לתוכנית הרצה ולא למערכת ההפעלה, כך שאין סכנה ממשית לתפקוד המחשב).
 
==תקיפה זדונית של הצפת מערך (Buffer Overflow)==
השחתת זיכרון עשויה להיות גם [[חור אבטחה (תכנות)|חור אבטחה]]. דוגמה קלאסית לכך היא תוכנה המקבלת [[קלט]] באורך מסוים, ומנסה להציבו ב[[מחסנית (מבנה נתונים)|מחסנית]], מבלי לוודא שגודל הקלט אינו גדול מהמחסנית.
השחתת זיכרון עשויה להיות גם [[חור אבטחה (תכנות)|חור אבטחה]]. התקיפה הנפוצה ביותר מסוג זה מכונה "הצפת מערך".
 
בתכנות, כאשר קוראים לפונקציה מתוך תוכנית, למעשה עוצרים את רצף הקוד הנוכחי כדי לבצע סדרה של פקודות שנמצאת במקום אחר (שבו מוגדרת הפונקציה). המעבד "קופץ" משורת הקוד שקראה לפונקציה אל שורת הקוד הראשונה של הפונקציה, ושומר מספר פרמטרים על גבי המחסנית שמשמשת את התהליך. פרמטרים אלה הם פרטים שהפונקציה צריכה כדי לפעול, ובנוסף להם צריך לשמור גם את כתובת החזרה, על מנת שבסיום ביצוע הפונקציה המעבד יוכל "לקפוץ" חזרה למקום שממנו הפונקציה נקראה ולהמשיך לבצע את הקוד של התוכנית.
התוקף עשוי ליצור קלט המיועד להשחית את הזיכרון בתוכן מסוים, וכך, תיאורטית, להחדיר קוד זדוני שיאפשר חדירה למערכת.
כל הפרמטרים האלה וגם המשתנים הפנימיים של הפונקציה מוגדרים על המחסנית, ושם מוקצה להם כמות הזיכרון הדרושה להם.
 
פונקציות שמתעסקות עם קלט שמושם לתוך מערכים ולא בודקות את גודלם לפני שהן מבצעות את ההשמה הן חשופות להתקפה של הצפת מערך.
בשפות תכנות מסוימות, כגון [[Java]] מתבצעת בדיקה אוטומטית לתחומי המערך, ובדרך כלל ניסיון להשחתת זיכרון יוציא הודעת שגיאה.
אחד הפרמטרים שניתנים לפונקציה במקרה זה הוא התוכן שיש לשים במערך.
התוקף יבקש למלא את המערך בתוכן שהוא בכוונה גדול מאוד, יותר גדול מהממדים של המערך.
 
כאשר הפונקציה מנסה למלא את המערך בתוכן שקיבלה, נגמר לה המקום במערך לפני שנגמר התוכן למילוי. מאחר שהיא מבצעת את ההשמה בלי לבדוק, היא תמשיך למלא את המחסנית בתוכן ותדרוס נתונים אחרים שנכתבו בה. הקלט הזדוני דורס בכוונה את כתובת החזרה מהפונקציה עם הכתובת של תחילת אותו מערך. בצורה זו, כשיסתיים ביצוע הפונקציה, המעבד "יקפוץ" לא להמשך התוכנית שקראה לה, אלא לתחילת המערך, ויתחיל להתייחס לנתונים שבמערך בתור פקודות לביצוע. הפקודות הללו יכולות להיות כל דבר שהוא, ולכן התוקף למעשה יכול לבצע כל שברצונו על המחשב שהריץ את התוכנית הזו.
 
==התמודדות עם השחתת זיכרון==
בשפות תכנות מסוימות, כגון [[Java]] מתבצעת בדיקה אוטומטית לתחומי המערך, ובדרך כלל ניסיון להשחתת זיכרון יוציא הודעת שגיאה.
קיימים כלי תכנות אשר מזהים טעויות של גישה מעבר לגבולות מערך באופן אוטומטי, כגון Valgrind. כלים כאלה הם רבי ערך.
מציאת באגים כאלה יכולה להיות קשה. לכן כלי תכנות אשר מזהים טעויות כאלה אוטומטית, כגון Valgrind, הם רבי ערך.
 
כיוון שמרבית התוכנות המסחריות מורכבות מקובצי מקור שונים שיצאו תחת ידיהם של מתכנתים שונים, זיהוי באגים אלה הופך לכמעט בלתי אפשרי, וגם פוגע בעקרון הכימוסההכמסה של ה[[תכנות מונחה עצמים|תכנות מונחה העצמים]].
 
 
==ראו גם==
שורה 20 ⟵ 30:
==קישורים חיצוניים==
* [http://valgrind.kde.org/ Valgrind] - כלי לביצוע [[ניפוי שגיאות]] ו־[[Profiling]]
* [http://en.wikipedia.org/wiki/Buffer_overflow Buffer Overflow]
 
[[קטגוריה:תכנות]]