פגיעויות ב-Snapd וב-Rust Coreutils מאפשרות גישת Root באובונטו

חברת Qualys זיהתה פגיעות (CVE-2026-3888) בחבילות snap-confine ו- systemd-tmpfiles באובונטו, המאפשרת למשתמש לא מורשה לקבל גישת root למערכת. הבעיה מתבטאת בתצורת ברירת המחדל של אובונטו החל מגרסה 24.04. באובונטו 16.04-22.04, ניתן לנצל את הפגיעות בתצורות שאינן ברירת מחדל המחקות את התנהגותן של גרסאות חדשות יותר של ההפצה. תיקון עבור אובונטו זמין בעדכון חבילת snapd מאתמול. הבעיה תוקנה בעדכון 2.75 של snapd.

הפגיעות נובעת מאינטראקציה שגויה בין כלי השירות snap-confine ו- systemd-tmpfiles, ששניהם פועלים עם הרשאות מוגברות. Snap-confine יוצר סביבת ארגז חול להפעלת יישום snap, בעוד ש- systemd-tmpfiles מנקה אוטומטית קבצים וספריות זמניים. כברירת מחדל, systemd-tmpfiles מוגדר למחוק את כל הקבצים והספריות הישנים ב- /tmp, אשר יכולים לשמש תוקף כדי להחליף את ספריית /tmp/.snap לאחר שנמחקה על ידי systemd-tmpfiles אך לפני שנוצרה מחדש על ידי snap-confine.

ההתקפה מורכבת מהמתנה להתחלת תהליך ניקוי הקבצים הזמניים, החלפת הספרייה /tmp/.snap לאחר מחיקתה, והצבת עותק שונה של הספריות ב- /tmp/.snap/usr/lib/x86_64-linux-gnu.exchange. ייתכן שהתוקף יצטרך להמתין מספר ימים עד ש- systemd-tmpfiles יתחיל, מכיוון שתהליך הניקוי פועל כל 10 ימים באובונטו 24.04, וכל 30 יום בגרסאות חדשות יותר. לאחר החלפת הספרייה, התוקף מאתחל סביבת ארגז חול חדשה באמצעות snap-confine.

בזמן בניית מטען סביבת ארגז החול (sandbox) בספרייה הזמנית /tmp/.snap, התוקף ממתין לרגע הנכון ומשנה את שם /tmp/.snap/usr/lib/x86_64-linux-gnu.exchange ל- /tmp/.snap/usr/lib/x86_64-linux-gnu, ובכך מחליף את הספריות ומבטיח את הרכבת הקישור שלהן עם הרשאות root. זה נותן לתוקף שליטה על הספריות המשותפות ועל טוען ld.so הפועל בסביבת ארגז החול snap ומאפשר לו לבצע קוד שרירותי עם הרשאות root על ידי הפעלת כל תוכנית suid המשתמשת בקישור דינמי.

עם גישת root בסביבת sandbox המבודדת על ידי AppArmor ומסנן קריאות מערכת מבוסס seccomp, תוקף יכול להעתיק את /bin/bash לספרייה /var/snap/$SNAP/common/ ולהגדיר את ההרשאות שלה ל-"04755" (suid root). למרות שההרשאות משתנות בתוך סביבת sandbox, הקובץ עם ההרשאות שהשתנו נגיש גם במערכת המארחת. לכן, כדי לקבל גישת root מלאה, פשוט הפעל את /var/snap/<snap_package_name>/common/bash כמשתמש רגיל, ללא הרשאות, מסביבת המערכת המוגדרת כברירת מחדל.

פגיעות התגלתה גם בשרשרת הכלים uutils coreutils (Rust Coreutils), מקבילה מבוססת Rust לחבילת GNU Coreutils. הפגיעות מאפשרת למשתמש לא מורשה לקבל הרשאות root. הבעיה התגלתה במהלך יומן השינויים של אובונטו 25.10 וטופלה באמצעות פתרון עוקף לפני שחרור אובונטו 25.10 על ידי הפצת /usr/bin/gnurm במקום uutils rm. הבעיה תוקנה בגרסה 0.3.0 של החבילה uutils coreutils, מבלי לציין את אמצעי ההפחתה של הפגיעות ביומן השינויים (צוין כי rm, du, chmod ו-chgrp יישמו שיטת חציית נתיבים מאובטחת).

הבעיה נגרמת עקב מצב מרוץ בכלי השירות "rm", המאפשר למשתמש מקומי להחליף את תוכן הספרייה בקישור סמלי בעת מחיקת קובץ הנשלט על ידי המשתמש באמצעות תהליך "rm" עם הרשאות root. בין היתר, ניתן לנצל את הפגיעות על ידי הפעלת הסקריפט /etc/cron.daily/apport מדי יום מ-cron. סקריפט זה, המופעל עם הרשאות root, מוחק באופן רקורסיבי את תוכן הספרייה /var/crash, הניתנת לכתיבה על ידי כל המשתמשים במערכת.

בעת מחיקה רקורסיבית של ספריות, כלי השירות rm סורק תחילה את כל הספריות ולאחר מכן מוחק אותן בסדר הפוך על ידי קריאה לפונקציה rmdir(). אם ספריית אב מוחלפת בקישור סמלי מיד לאחר סריקת הספרייה אך לפני סריקת ספריות הצאצא שלה, הפעולה תגרום למחיקת הספרייה שאליה מצביע הקישור הסמלי. זה מאפשר לא רק מחיקה של כל קובץ במערכת אלא גם הסלמת הרשאות על ידי מחיקת הספרייה /tmp/snap-private-tmp/$SNAP/tmp/.snap כדי להחליף את תוכן סביבת ארגז החול של חבילת ה-snap (השיטה להשגת root דומה לפגיעות הראשונה).

מקור: OpenNet.ru

הוספת תגובה