
באג ב-soundness של Rust: קוד עובר את גבולות אורך החיים 'static באמצעות הקצאת שדה
באג שזוהה לאחרונה ב-Rust מציג כי הקצאה קובריאנטית של שדה מפרה את מגבלת אורך החיים 'static של המבנה ומאפשרת לקוד Drop להחשיב רפרנסים קצרי חיים כ-static ולקרוא זיכרון שנמחק.
הבאג
חור ב-soundness במערכת הטיפוסים של Rust מאפשר לקוד, באמצעות הקצאת שדה קובריאנטית, לעבור את דרישת אורך החיים 'static של המבנה. הבעיה, המתועדת כ-rust-lang/rust#164250, נוגעת למבנה גנרי Q<T: 'static + Send>, שלו יכול להיות מוקצה שדה עם רפרנס לערך מקומי קצר חיים. מכיוון שהשדה קובריאנטי, ההקצאה מתקבלת גם כאשר הערך אינו עומד במגבלת 'static. לאחר מכן יישום Drop של המבנה מתייחס לרפרנס השמור כ-static, מה שעלול לגרום לקריאה של זיכרון במחסנית ששוחרר לאחר סיום ה-scope.
השפעה וחומרה
המפעיל מתקמפל בכלי nightly הנוכחיים ובמהדורות stable, החל מ-1.85.0 לפחות. לפי אחד התורמים, דפס זה מתקמפל מאז 2017, החל מ-Rust 1.18.0. ללא סניטייזרים התוכנית מדפיסה את תוכן מחרוזת ששוחררה; בזמן AddressSanitizer היא קורסת עם שגיאת stack-use-after-scope. המחזק lcnr סיווג את הבעיה כ-P-high ולא P-critical, מכיוון שזה 11 שנה שלא זוהתה ומכיוון שניצולה דורש יישום Drop זדוני מכוון ולא שימוש שגוי אקראי.
התגובה
לבעיה הוקצו תגיות עבור borrow checker, דסטרקטורים, מוחלות חיים וקובריאנטיות, והיא נמצאת תחת פיקוח צוות Types. הקבוצה ציינה כי תיקון ה-soundness של מערכת הטיפוסים הוא עדיפות גבוהה מאוד, כמו גם העבודה על trait solver של הדור הבא, עיבוד region constraint ו-Project Zero. לאחר הדיון בפתירה, הוזנג במהרה commit שכותרתו היא „fix: refuse handles in aggregate storage on both front ends“. השרשור ב-GitHub נחסם זמנית והוגבל לשותפים בלבד לאחר שעורר דיון תוסס.
מקורות: Hacker News
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.