מאפס לקרנל: מדריך ללימוד עצמי של מערכות הפעלה, יהונתן כהן סקאלי‎

מאפס לקרנל: מדריך ללימוד עצמי של מערכות הפעלה, יהונתן כהן סקאלי‎
 יהונתן כהן סקאלי
תאריך: 12 במרץ 2019

הקדמה:

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

אני חוקר ולומד מערכות הפעלה שונות במשך שנים, ומסכם הרבה מהחומר במחברת OneNote אותה אשתף אתכם בהמשך.

הפוסט מחולק לשניים:

תחילה אתן טיפים כלליים ללימוד ומחקר מערכות הפעלה אשר משקפות את התהליך הלימודי שלי.

הגישה הכללית שלי ללימודים, כמו בהרבה דברים בחיי, כוללת שני דעות דיי סותרות:

לטעמי אין דרך לימוד אחת המתאימה לכל; אי-פרסונליזציה של שיטות הלימוד היא אחת מהבעיות המשמעותיות ביותר במערכת הלימוד והאוניברסיטאות המודרניות.

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

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

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

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

בהמשך הפוסט אכתוב על הסיכום שלי ואשתף אותו עמכם כמקור לימוד נוסף. לחלקכם הוא יתאים כמקור לימוד עיקרי אך לרובכם הוא יתאים כמקור לימוד לקריאה שניה או כreference.

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

טיפים ללימוד עצמי של מערכות הפעלה – טיפים ללמידה של נושא ספציפי:

Concepts First: התהליך החשיבתי שלנו כבני אדם כרוך במידה רבה בדמיון והכללה. אך בשביל שנוכל לתת לצד היצירתי שלנו מעוף אנו חייבים לתת לו חומרי גלם. חומרי הגלם הללו הם הדוגמאות, ובמקרה שלנו הם יהיו דוגמאות המימוש. מהרגע שנראה כמה דוגמאות שונות, נוכל להבדיל בין העיקר לטפל, לזהות דפוסים החוזרים על עצמם, ולזהות את השינויים בין המימושים השונים ולהבין את מהותם. וכשנראה מספיק דוגמאות ונבין אותן מספיק לעומק ולפרטי פרטים – אז נוכל להכליל אותם בצורה האולטימטיבית. ההבנה הזו בדיוק מגולמת בהבנה קונפסטואלית של נושא מסוים. כפי שאיינשטין אמר: “אם אינך יכול להסביר משהו בצורה פשוטה, אינך מבין אותו בצורה טובה מספיק.” הבנה עמוקה של נושא לימוד מסוים תמיד תכיל הבנה קונספטואלית מדויקת של אותו נושא – וזו המטרה הראשונה שלי, תמיד.

רוב חומר הלימוד האקדמי (וגם המחברת שלי) מסודר בסדר הפוך מתהליך הלימוד האנושי. קודם הקדמה או הגדרה, בו הנושא מוסבר מנקודת מבט גבוהה (high level) וצלילה הדרגתית לפרטים. המטרה היא לאפשר מוטיבציה לקריאת החומר ולהנחות את הקורא בתהליך הקריאה שלו. המטרה הזו חשובה ואתם צריכים לזכור להשתמש בו כפי שתוכנן, אך להבין שזה בסדר לחלוטין להרגיש המומים ומבולבלים בשלב הזה של הקריאה. האסימונים לרוב לא נופלים כאן; במקרה הטוב, התת-מודע שלנו מפנים את הבעיה והאתגר ומתכונן לחשיבה עליו במהלך הקריאה ולאחריה. במקרה הרע – אתם תרגישו שזה גדול מדי עליכם ותפרשו.

כשאני אומר concepts first אני מתכוון לכך שהבנה קונספטואלית היא ראשונה בחשיבות מבחינתי, לא ראשונה בסדר הלימודי. אני מעודד אותכם “להתעלם” מהרגשות השליליים שעולים במהלך הקריאה של ההקדמות וההגדרות. אתם עוד לא אמורים להבין אותם בצורה מושלמת. תכתבו לעצמכם מה אתם לא מבינים, תכתבו שאלות מנחות, ותמשיכו הלאה. תשמרו את הרגשות האלו, תאחזו בעצמכם ותלחמו באכזבה לפחות עד השלב שבו נכנסים לדוגמאות. דוגמא אחת מספיקה לי כשאני מסכם, כי הסיכום בראש ובראשונה נועד לשרת אותי לקריאה חוזרת ולשימור ידע, אך ממש לא מספיקה בלימוד ראשוני של נושא חדש. תראו הרבה דוגמאות ותחשבו על המשותף והשונה ביניהם. אחר כך תחזרו בקריאה שניה שוב לחלקים הקונספטואלים ותראו שרוב השאלות נענות ורוב האסימונים נפלו.

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

אתן דוגמה על מנת להמחיש עד כמה אני רציני כשאני אומר לכם לא לוותר אף פעם. בעבר עשיתי מחקר שתוצאתו לא הייתה מובנת לי, ולאחר שמיציתי את כיווני המחקר שלי ואת מקורות הלימוד באינטרנט, שאלתי חברים המתמקצעים בתחום – ועדיין לא קבלתי תשובה. אז פרסמתי שאלה בפורום של מפתחי קרנל לוינדוס (מערכת ההפעלה בה הבעיה ההבנתית ההיא קרתה לי) וקבלתי הרבה מאוד תשובות, רובן ככולן לא רלוונטיות. המשכתי לשאול אותם עד שלבסוף אלקס יונסקו, מכותבי  הספר Windows Internals האגדי, ענה לי ואמר לי לפנות אליו במייל פרטי. וכך יצא שמעבר לזה שקבלתי תשובה סוףסוף לשאלה שלי, גם התכתבתי אם אחד האנשים החזקים בתחום בעולם על הדרך. זוהי דוגמה מאוד נדירה ולרוב השאלות שלכם יענו קודם – אנחנו בכל זאת במדעי המחשב ולא במדעי המוח – תיהיו בטוחים שיש לשאלות שלכם תשובה, ושיש אנשים בעולם שכבר יודעים אותה. אתם פשוט צריכים לגלות אותה שוב, או לשאול את אלו שכבר יודעים.

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

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

Code Flow: השלב האחרון בלימוד הנושא שלנו לרוב יהיה קריאה והבנה של הflow השלם. על השלב הזה תוכלו בעתיד לדלג, או שתוכלו להבין אילו חלקים חשובים להבנה ואילו פחות רלוונטיים למטרה הנוכחית שלכם, אבל לפחות בהתחלה זה חשוב מאוד להתעמק בזה מאוד. Windows Internals כולל חלקים שלמים המסכמים flowים קרייטים במערכת ההפעלה, כמו לדוגמא יצירת פרוסס חדש. המחברת שלי גם כן כוללת חלקים כאלו. אבל לא תמיד תמצאו את השלב הזה מסוכם מראש ותצטרכו פשוט לקרוא את הקוד בעצמכם.

טיפים ללימוד עצמי של מערכות הפעלה – סדר למידה כללי:

אני מאמין שצריך להתחיל בנקודת מבט רחבה על מערכת ההפעלה. להבין את הsubsystems השונים ומטרתם בגדול. ראו כדוגמא את העמוד The Windows NT Architecture תחת Windows. אני לא משקיע בשלב הזה הרבה זמן ומאמצים.

לאחר מכן נקודה מעולה להתחלה היא סדר עליית המערכת (Boot sequence.) יש ציטוט מביולוגיה שאני מאוד אוהב שמתקשר לי לנושא:

Nothing Makes Sense Except in the Light of Evolution. המון דברים הגיוניים רק כשרואים אותם מנקודת ההתחלה שלהם.

עם כמה ששני הנושאים האלו חשובים, אפשרי (אך לא מומלץ) לדלג עליהם אם תבחרו, אך הנושא הבא, והחשוב מכל הוא אכריטקטורת החומרה והקונספטים הכרוכים בכך (זכרון וירטואלי, אינטרפטים, קריאות מערכת וכו’) אתם חייבים לקרוא עליו לפני שתמשיכו לנושאים הבאים מכיוון שזהו ללא ספק הוודו המרכזי של כל נושא המחשבים ומערכות ההפעלה בפרט. אם יש שלב שבו אנשים מאבדים את זה – שבו הם חושבים שדברים נעשים על ידי קסם, או שגורם לבלבול בהבנה של נושאים שונים, אפילו ביוזר ספייס, זה לרוב יהיה בגלל הבנה לקויה של הנושא הזה, ויותר מכך את הקשר בין מערכת ההפעלה וארכיטקטורת החומרה. ולכן, אם הייתי צריך לבחור עמוד אחד מכל המחברת שברצוני שתקראו הוא יהיה דווקא עמוד תיאורתי לחלוטין שחברתי בדיוק בעבור המחשה של העקרונות האלו. תוכלו למצוא אותו תחת:

Hardware Architecture / The Hardware – Operating System Interface.

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

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

מאיזו מערכת הפעלה כדאי להתחיל? פירוט מערכות ההפעלה השונות וחומרי הלימוד המומלצים:

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

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

אני חושב שלקוד פתוח של הקרנל יש חשיבות בלתי ניתנת להחלפה ולכן ממליץ לכם לבחור במערכת הפעלה עם קוד פתוח, ולכן FreeBSD, Linux וAndroid הם בחירות טובות. בנוסף, אני חושב שלספר לימוד טוב יש משמעות קריטית. אני מאוד אוהב את הספרים:

Windows Internals

The Design and Implementation of the FreeBSD Operating System

ופחות אוהב את Understanding the Linux Kernel ולכן כשאני קורא על לינוקס אני לרוב קורא מאמרים, ספרים על אנדרויד והרבה מאוד קוד.. אבל אני כן אשתף אתכם מקור לימוד מעולה המתעד את הקוד של לינוקס בצורה טובה מאוד מהשלב הכי נמוך בעליית המערכת:

http://bit.ly/2TNkTT6

במקרה הזה FreeBSD מביאה את השילוב הטוב ביותר של ספר לימוד מעולה ומערכת קוד פתוח, אך היא מאוד נישתית ולכן תצטרכו לשקול לפי מטרת הלימוד שלכם האם לבחור בה או לא. עבור לימוד קונספטואלי ותיאורותי היא ללא ספק מעולה. אחרת, אמליץ על Android או Linux. לאנדרואיד יש כמה ספרים לא רעים (לדוגמת Android Internals) והיא מערכת הפעלה מאוד “חמה” אז היא גם בחירה מאוד טובה.

מחברת הOneNote שלי על מערכות הפעלה ואבטחת מידע:

המחברת מהווה סיכומים שלי אשר נעשו לאורך שנים רבות במהלכם למדתי וחקרתי מערכות הפעלה שונות, וכוללת, בין היתר, את מערכות ההפעלה: Windows, Linux, FreeBSD ו Android. המחברת נכתבה בראש ובראשונה בעבורי: עצם תהליך הכתיבה מכריח אותי להגיע לרמת הבנה הגבוהה ביותר, ומשמש אותי בעבור שימור ידע וקריאה חוזרת. לכן המחברת נמצאת תמיד במצב של Work in progress ותמיד יהיו עמודים חלקיים או ריקים, בין אם בגלל שאני עובד עליהם כרגע, נטשתי אותם לבנתיים או אם הם נמצאים רק כplaceholder בעבור קישורים נכונים מעמודים אחרים. המחברת הזו מאוד מותאמת אליי אישית ולכן לא תתאים לכל אחד מכם כמקור לימוד ראשוני, גם בגלל שהיא לא מכסה את כל החומרים בכל מערכות ההפעלה. אני כן ממליץ להשתמש בה כרפרנס וקריאה שניה לכל נושא אשר אתם קוראים וסכמתי עליו. בדפים המושלמים שלי אני לפעמים משקיע גם שבועות של לימוד ומחקר וסיכום של מקורות לימוד שונים, ואני מרגיש הרבה פעמים שהסיכום שלי לבסוף מלמד יותר מאשר כל אחד מהם בנפרד והיה יכול לחסוך לי המון זמן לימוד אם היה לי גישה למקור לימוד שכזה. אני מספק קישור אל המחברת מלווה בהזהרה זו, ובנוסף בתיקיית Drive שתכיל רק עמודים ברמת גימור מספקת.

המחברת מחולקת לנושאים הבאים:

OS Concepts – מכיל הגדרות לקונספטים בסיסיים במערכות הפעלה.

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

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

Hardware Architecture – מכיל הגדרות קונספטואליות של נושאים הקושרים לארכיטקטורת החומרה והממשק שלה עם הקרנל, ודוגמת מימוש מארכיטקטורת x86-64.

זה הנושא השלם ביותר במחברת שלי ולדעתי גם החשוב ביותר, אבל עוד על כך בהמשך.

Exploitation Methods and Mitigations – נושא זה מכיל את רוב הידע הקשור לאבטחת מידע במחברת. הרוב כאן הוא דווקא בצד ההגנתי והמיטגציות, ולצערי מסיבות שונות פחות ייצא לי לסכם במחברת את הידע הרב שלי בצד ההתקפי. מקווה שבעתיד אסכם לשם יותר שיטות התקפיות.

Virtualization – נושא קצר יחסית המסביר על קונספטים שונים בוירטואליזציה והתמיכה החומרתית של x86-64.

כעת אסביר כיצד המידע מאורגן בכל עמוד. העמוד על LSM (תחת Linux/Security) מהווה דוגמה טובה לכללים האלו. לטעמי זה מאוד חשוב לשמור על קונבנציות כאלו בכתיבה ולא פחות חשוב להבינם בקריאת חומר, ולכן ממליץ לכם לעקוב:

כל עמוד יתחיל בOverview. השורה-שניים הראשונות בו יכילו הגדרה מדוייקת ומתומצתת של הנושא וימשיך בהסבר ברמה גבוהה (high-level) של הנושא, מבלי להכנס לפרטי מימוש (ככל הניתן.)

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

כל עמוד מכיל, במידת הצורך, שני סוגי הפניות חיצוניות:

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

הפניות חיצוניות יסומנו במהלך העמוד על ידי סוגריים מרובעים ומספר (לדוגמא: [3] מפנה להפניה החיצונית השלישית.)

Source Code References – במערכות הפעלה עם קוד פתוח אני נוהג לציין אילו קבצים ופונקציות רלוונטיים לנושא.

הפניות לקוד פתוח יסומנו במהלך העמוד על ידי סוגריים משלושות ומספר (לדוגמא: {3}) כדומה להפניות החיצוניות.

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

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

מתחום מערכות ההפעלה בחרתי בדף Page Table Management של Windows. למה? כי אי פעם שאלתם את עצמכם – אם הקרנל נגיש רק לזכרון וירטואלי, והpage tables נשמרים בדפים פיזיים – איך הקרנל מנהל אותם? למה אין פה אבסורד אנסופי? הדף הזה עונה בדיוק על זה. מעבר לכך, הוא מסביר על פתרון לחור אבטחתי אותו אסביר איך מנצלים ממש עכשיו.

הדף מתחום אבטחת המידע מסביר על שיטה סופר גנרית לניצול חולשות privilege escalation בWindows התופסת עד גרסת Redstone 1 של Windows 10. הניצול מתבסס על כך שבכל page table וינדוס הגדירה באינדקס קבוע self-reference entry. באמצעות שימוש נכון במידע זה אפשר בצורה דטרמינטסית לקבוע כתובת וירטואלית (קרנלית) המצביעה לpage-table entry של כל כתובת user space. הניצול בעצם מתבסס על הקצאת shellcode ביוזר ספייס, סימונו כניתן להרצה, ואז שימוש בחולשת כתיבה קרנלית ובפרימיטיב הקודם בשביל לסמן את השלקוד כקוד קרנלי ואז להריץ אותו.

את הדף תוכלו למצוא תחת Exploitation Methods and Mitigations בשם Self-Reference Entry in Paging Structures ותוכלו לקרוא קוד שכתבתי שממש בדיוק את הניצול הזה (בהתבסס על דרייבר מוחלש המייחצן חולשת כתיבה) כחלק מפרויקט (אשר נטשתי) לגנרליזציה של ניצול חולשות בגיט שלי:

http://bit.ly/2TI1KTi

בעיה כאן בעצם שוברת את כל המנגוני מיטגציה נגד הרצת קוד קרנלי: SMEP, KASLR & DEP. השימוש בself-reference entry ובכתובת הקבועה PTE_BASE הינו כלכך מושרש במערכת ההפעלה שהמפתחים ידעו במשך שנים על קיומו ולא תקנו אותו כי זה היה פשוט קשה מדי (וגם כי הם מפתחים קרנליים ובשבילם זהו לא באמת חור אבטחתי “כי צריך חולשה בשביל לנצל אותו”….) אבל לבסוף הצליחו לפתור זאת וזה מתואר בעמוד על ניהול הpage-tables בוינדוס כפי שאמרתי קודם.

את החומר אשתף בשני תצורות: כמחברת OneNote (למי שלא מכיר – תכנה מעולה המאפשרת סיכום של נושאי לימוד שלמים וארגונם לפי נושאים וקישורים, בצורה דומה קצת לויקיפדיה) אפשר לגשת אליה (לקריאה אונליין) בכתובת:

http://bit.ly/2F2XByY

וכתיקייה בDrive אליה אייצא עמודים אשר סיימתי לסכם, אליה תוכלו לגשת דרך:

http://bit.ly/2HjkySp

אשמח לשאלות, הארות והערות, ואשמח לשמוע מאנשים שבאמת יקראו וזה יעזור להם

Email Us

אודות המחבר

 יהונתן כהן סקאלי
יהונתן כהן סקאלי

מטייל בעולם תוך כדי מחקר חולשות ומערכות הפעלה