- בלוג
- נמצא מעקף למגבלת noexec בלינוקס
נמצא מעקף למגבלת noexec בלינוקס
נמצא מעקף למגבלת noexec בלינוקס
פורסם ב 20-10-2024
“טריק” חדש, שנמצא לאחרונה, מאפשר “לעקוף” את מגבלת “noexec” (קיצור של no execution) במערכות לינוקס, גם כאשר היא מאופשרת.
המגבלה נועדה למנוע את האפשרות של הרצת קבצים בינאריים, תהליכים והוצאה לפועל של פקודות שונות, מתיקיות שנמצאות תחת כוונותיהם של תוקפים באופן תדיר, כמו tmp/ או usr/.
דוגמה טובה למתקפה דרך התיקיות האלה (כאשר noexec אינה מאופשרת) ניתן למצוא במאמר שכתבנו על נוזקת perfctl.
ה”טריק”, כפי שהוא מכונה על ידי החוקרים שגילו אותו, מאפשר שימוש בסקריפטים של PHP, Bash ו-Perl. הוא מתבצע על ידי הורדת קובץ בינארי מהאינטרנט (או ממקור חיצוני אחר), יצירת קובץ אלמוני, ומתאר-קובץ (file descriptor – מזהה ייחודי שמערכת ההפעלה מייצרת לקובץ כשהוא נפתח) לזיכרון הפנימי של המערכת, באמצעות קריאת המערכת memfd_create. לאחר מכן, מתבצעת הזרקת קוד לתהליכים וטעינת קבצים בינריים מתוך הזיכרון הפנימי של המערכת, באמצעות שימוש ב-execveat.
אין צורך בהרשאות מערכת, ואת הקובץ הבינארי ניתן “לתעל” כמעט ישירות מהאינטרנט לזיכרון הפנימי. כמו כן, הקובץ עצמו נשאר אלמוני, כלומר, ללא מזהים במערכת.
המתקפה היא מתקפת fileless execution – הוצאה לפועל ללא קבצים. התוקף למעשה מצליח, באמצעות ניצול חולשות ופרצות שונות במערכת, “להשתיל” את הרכיב הזדוני (קוד, נוזקה, קובץ בינארי וכדומה) בזיכרון הפנימי ולהריץ אותו משם.
הייתרון של מתקפות מסוג זה הוא אלמנט ההסוואה. אי אפשר לגלות את הקבצים או הנוזקות האלה באמצעים “רגילים” של מציאת קבצים.
גם באמצעים פורנזיים קשה מאוד למצוא להן עקבות – מאחר ומדובר בזיכרון פנימי נדיף, הקבצים והתהליכים נעלמים אחרי אתחול המערכת. ייתרון זה מהווה גם חיסרון – קשה לשמור על התהליך פעיל אם הוא בסכנת התפוגגות.
בנוסף, ניתן לחקות באמצעותן תהליכים לגיטימיים – מה שתורם אף יותר להסוואה שלהם.
מתקפה נוספת של הוצאה לפועל ללא קובץ היא השתלת הרכיב הזדוני ב-registry בווינדוס, והיא בעלת אותם ייתרונות (למעט הנדיפות), ומושגת באותם אמצעים.
כך זה מתבצע בשלבים:
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
בלבד.
בנוסף, זכרו תמיד שגורמים עויינים מחפשים, מוצאים ויוצרים דרכים חדשות לבצע התקפות מוצלחות. עדכון המערכת באופן תדיר, מודעות לפרצות (ומעקפים) חדשות ועירנות תמידית הם המפתח לשמירה על המערכות שלכם בטוחות ונקיות.
לשאלות, עזרה או כל דבר אחר, ניתן לפנות אלינו. צור קשר