• בלוג
  • נמצא מעקף למגבלת noexec בלינוקס

נמצא מעקף למגבלת noexec בלינוקס

    נמצא מעקף למגבלת noexec בלינוקס

    פורסם ב 20-10-2024

    information-security

    “טריק” חדש, שנמצא לאחרונה, מאפשר “לעקוף” את מגבלת “noexec” (קיצור של no execution) במערכות לינוקס, גם כאשר היא מאופשרת.
    המגבלה נועדה למנוע את האפשרות של הרצת קבצים בינאריים, תהליכים והוצאה לפועל של פקודות שונות, מתיקיות שנמצאות תחת כוונותיהם של תוקפים באופן תדיר, כמו tmp/ או usr/.
    דוגמה טובה למתקפה דרך התיקיות האלה (כאשר noexec אינה מאופשרת) ניתן למצוא במאמר שכתבנו על נוזקת perfctl.

    ה”טריק”, כפי שהוא מכונה על ידי החוקרים שגילו אותו, מאפשר שימוש בסקריפטים של PHP, Bash ו-Perl. הוא מתבצע על ידי הורדת קובץ בינארי מהאינטרנט (או ממקור חיצוני אחר), יצירת קובץ אלמוני, ומתאר-קובץ (file descriptor – מזהה ייחודי שמערכת ההפעלה מייצרת לקובץ כשהוא נפתח) לזיכרון הפנימי של המערכת, באמצעות קריאת המערכת memfd_create. לאחר מכן, מתבצעת הזרקת קוד לתהליכים וטעינת קבצים בינריים מתוך הזיכרון הפנימי של המערכת, באמצעות שימוש ב-execveat.
    אין צורך בהרשאות מערכת, ואת הקובץ הבינארי ניתן “לתעל” כמעט ישירות מהאינטרנט לזיכרון הפנימי. כמו כן, הקובץ עצמו נשאר אלמוני, כלומר, ללא מזהים במערכת.

    כך זה מתבצע בשלבים:

    1. ייצור מתאר-קובץ בזיכרון הפנימי באמצעות memfd_create – מתאר-הקובץ שייך לקובץ ש”מאוכסן” בזיכרון הפנימי. הצורך באכסון “רגיל” (למשל כמו דיסק קשיח) כבר לא קיים.
    2. השלב הבא הוא שימוש בממשק proc/self/mem/ כדי להחדיר לזיכרון של תהליך מסויים קוד ייעודי (shellcode), בהתאם למה שהתוקף מנסה להשיג – במקרה זה, הוצאה לפועל של קובץ בינארי.
    3. הקוד הייעודי יחליף את מצביע-ההוראה (instruction pointer) – יחידת בקרה בזיכרון המטפלת בהבאת ההוראה הבאה בתהליך ובפיענוח שלה. כך, למעשה, המעבד ימשיך לעבד את התהליך, רק שהקוד הייעודי והזדוני יחליף את הקוד הראשי של התהליך עליו הוא “התלבש”.
    4. שוב מתבצע שימוש ב-memfd_create, כדי להעתיק את הקוד הבינארי למתאר-הקובץ מ-stdin.
    5. הקוד-הייעודי משתמש ב- execveat כדי להריץ את הקובץ הבינארי ישירות מהזיכרון הפנימי.

    הערות:

    * ניצול המעקף דרך Perl לא מצריך קוד ייעודי. אין צורך גם בגישה לתהליך /proc/self/mem/. משמעות הדבר היא שניתן, בעיקרון, להשתמש בו גם בקונטיינרים.
    * שימוש ב-PHP יכול לעקוף גם את מגבלת shell_exec (המונעת את האפשרות להוציא לפועל קודים ייעודיים).

    דוגמאות לניצול המעקף:

     בשימוש ב-Perl (ללא שימוש בהרשאות מנהל):
    source memexec-perl.sh
    cat /usr/bin/id | memexec -u

     שימוש ב-Bash מתבצע באופן דומה:
    source memexec-bash.sh
    cat /usr/bin/id | memexec

     שימוש ב-PHP מתבצע כך:
    א. מעלים את memexec.php (הקובץ המיועד לזיכרון הפנימי) ואת הקובץ הבינארי (המהווה “דלת אחורית”) למערכת הקורבן. שימו לב שבניגוד ל-Perl ול-Bash, מדובר בסקריפט בפורמט “רגיל” של PHP, ולא בסקריפט בשפה אחרת שנמצא בקובץ shell (סיומת sh).
    ב. משתמשים ב- curl -SsfL https://target/memexec.php כדי להוציא לפועל את הקובץ הבינארי.

    צעדי התגוננות מומלצים:

    1. אם אין שימוש ב-memfd_create, כדאי לבטל אותו.
    1. ניתן להגביל או לחסום את הגישה ל-proc/self/mem/. אמנם שימוש ב-Perl עדיין יתאפשר, אבל שימוש בסקריפטים אחרים (PHP ו-Bash) לא.
    2. המעקף מתבצע בתנאי שאחד מהבאים מאופשר במערכת: memfd_create, mmap או ptrace. פוטנציאלית, חסימת הגישה אליהם תמנע מהטריק לעבוד. כלים כמו SELinux ו-GRSecurity עשויים, למשל, למנוע גישה ל-memfd-create.
    3. שימוש בכלים לניטור המערכת, כמו Auditd, בכדי לנטר תהליכים וקריאות מערכת כמו memfd_create ו-proc/self/mem/.
    4. שימוש בכלים לניטור “יושרת” הזיכרון הפנימי ותהליכי המערכת יכולים להצביע על שינויים לא שגרתיים.
    5. שימוש במסננים של Seccomp, המוטמעת במערכות לינוקס. המסננים יכולים להגביל את קריאות המערכת (syscalls) שתהליך יכול לבצע למתארי-קובץ ל- read, write, signature ו-exit בלבד.

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

    השותפים שלנו

    Skip to content