לדלג לתוכן

מבוא לניצול ה-Heap - כשהזיכרון הדינמי הופך לזירת קרב

אחרי שמבינים גלישת חוצץ על הסטאק, השלב הטבעי הבא בעולם הניצול הבינארי הוא ה-Heap. זה תחום שיש לו מוניטין - אנשים אומרים "ניצול heap זה קשה" בנשימה אחת עם כבוד ופחד. ובכן, זה אכן מורכב יותר, אבל יש סיבה טובה מאוד להבין למה.

מה זה בכלל ה-Heap

כשתוכנית רצה, היא לא יודעת מראש כמה זיכרון היא תצטרך. לפעמים היא צריכה לאחסן רשימה שגדלה ומצטמצמת, קובץ שגודלו לא ידוע מראש, או מבנה נתונים מורכב. בשביל זה קיים ה-Heap - אזור זיכרון שהתוכנית יכולה לבקש ממנו "חתיכות" בזמן ריצה, להשתמש בהן, ואז לשחרר אותן כשהיא סיימה.

בשפת C זה נעשה עם פונקציות כמו malloc (בקש זיכרון) ו-free (שחרר אותו). זה נשמע פשוט, אבל בדיוק כאן טמון הקושי - בניגוד לסטאק, שמנוהל אוטומטית ובצורה מסודרת (מה שנכנס אחרון יוצא ראשון), ה-Heap הוא בלגן מבוקר. חתיכות זיכרון בגדלים שונים נכנסות ויוצאות בסדר לא צפוי, וזה יוצר המון הזדמנויות לטעויות.

למה ניצול Heap נחשב מורכב יותר

בגלישת חוצץ קלאסית על הסטאק, המטרה ברורה יחסית - דורסים את כתובת ההחזרה. ב-Heap, אין "כתובת החזרה" נוחה שמחכה לכם ליד. במקום זה, אתם צריכים להבין את המבנה הפנימי שבו מנהל הזיכרון (allocator) עוקב אחרי החתיכות שהוא הקצה - איזה חלק פנוי, איזה תפוס, ואיפה כל אחד נמצא. הניצול לרוב לא פוגע ישירות בזרימת התוכנית, אלא מנצל את המבנים הפנימיים האלה כדי לגרום למנהל הזיכרון עצמו "לטעות" ולכתוב היכן שלא היה אמור.

זו הסיבה שחולשות heap דורשות הבנה טובה יותר של האלוקטור הספציפי שבו משתמשים (למשל glibc בלינוקס), ולא רק הבנה כללית של זיכרון.

סוגי חולשות נפוצות בעולם ה-Heap

כמה מונחים שכדאי להכיר כבר עכשיו, גם בלי לצלול לפרטים הטכניים המלאים שלהם:

  • Use After Free. התוכנית משחררת חתיכת זיכרון עם free, אבל ממשיכה להשתמש בה כאילו היא עדיין תקפה. זו אחת מהחולשות הכי נפוצות ומסוכנות בעולם המודרני, ומופיעה שוב ושוב בדפדפנים ובמערכות הפעלה.
  • Double Free. שחרור אותה חתיכת זיכרון פעמיים, מה שמבלבל את מנהל הזיכרון ופותח דלת לניצול.
  • Heap Overflow. בדיוק כמו גלישת חוצץ על הסטאק, אבל כאן הגלישה קורית בתוך ה-Heap ודורסת חתיכות זיכרון סמוכות, כולל מטא-דאטה פנימי של האלוקטור.

כל אחת מהחולשות האלה יכולה להוביל בסופו של דבר להרצת קוד, אבל הדרך לשם עוברת דרך הבנה של המנגנון הפנימי, לא רק "שפכתי יותר מדי בייטים".

למה זה שווה את המאמץ

יש סיבה שחוקרי חולשות בכירים מתמחים בדיוק בתחום הזה - חולשות heap הן מה שנמצא בלב הרבה מאוד ניצולים מודרניים נגד דפדפנים, מערכות הפעלה, ואפליקציות מורכבות. בעולם שבו הגנות כמו stack canary ו-NX הפכו את ניצול הסטאק למאתגר בהרבה, ה-Heap נשאר שדה קרב פורה, כי המבנים הפנימיים שלו מורכבים מספיק כדי שתמיד יימצאו בהם באגים.

מי שמבין heap לעומק פותח לעצמו דלת לתפקידים ברמה הכי גבוהה בתעשיית מחקר החולשות.

איך ניגשים ללמידה בלי להיבהל

הטעות הכי נפוצה היא לנסות להבין heap לפני שביססתם טוב את היסודות - זיכרון, סטאק, ROP, קריאת אסמבלי בנוחות. heap הוא לא נקודת התחלה, הוא הצעד הבא. ברגע שהבסיס מוצק, לימוד המבנה הפנימי של אלוקטור הופך למאתגר ומרתק, ולא למבוך בלתי חדיר.

בקורס מחקר חולשות אנחנו מגיעים ל-heap רק אחרי שמיצינו את הסטאק, בדיוק כדי לבנות את הביטחון הזה בהדרגה, עם תרגול מעשי בכל שלב.

תחום כזה כדאי ללמוד עם אנשים לידכם. בדיסקורד שלנו יש אנשים שממש עכשיו מתמודדים עם אותם אתגרי heap, ואפשר להתייעץ, להיתקע ביחד, ולהתקדם מהר יותר.

הצטרפו לקהילה בדיסקורד

לסיכום

ניצול Heap הוא אחד התחומים המורכבים והמכובדים בעולם ניצול החולשות, בדיוק כי הוא דורש הבנה של מבנה פנימי, לא רק ניצול ישיר של זרימת תוכנית. זה לא מקום להתחיל בו, אבל זה בהחלט המקום שאליו כדאי לשאוף להגיע.