میری چگونه کش آشنای `target/` را به خطر افشای اسرار تبدیل کرد
هشدار امنیتی Rust میگوید `cargo miri` ممکن است متغیرهای محیطی را در `target/` بنویسد؛ اگر این پوشه در GitHub Actions کش شود و گردشکارهای pull request به آن دسترسی داشته باشند، اسرار CI ممکن است در دسترس نویسندگان PR قرار گیرد.

تیم پاسخگویی امنیتی Rust خطر افشای اسرار در GitHub Actions را که به Miri مربوط است اعلام کرده است؛ Miri مفسر Rust برای نمایش میانی سطح پایین یا MIR است. مشکل فقط خود Miri نیست، بلکه زمانی پدیدار میشود که سه شرط همزمان برقرار باشند: CI دستور cargo miri را اجرا کند، اسرار در محیط پردازش Miri وجود داشته باشند، و گردشکار پوشه target/ را به شکلی کش کند که jobهای pull request بتوانند آن را بخوانند.
Miri برای حفظ دادههای مرتبط با ساخت در بخشهای مختلف اجرای خود به اطلاعات محیطی نیاز دارد. رفتار آسیبپذیر همه متغیرهای محیطی را در target/ ذخیره میکرد؛ بنابراین کشکردن این پوشه میتوانست اعتبارنامهها، توکنها یا اسرار دیگر را کنار خروجیهای ساخت نگه دارد. سپس یک گردشکار pull request که به کش دسترسی داشت میتوانست دادههای باقیمانده را بررسی کند.
مستندات رسمی GitHub نیز هشدار میدهند که اطلاعات حساس نباید در مسیرهای کش قرار گیرند، زیرا هر کسی که بتواند برای مخزن pull request باز کند ممکن است بتواند کشهای محدوده شاخه پایه را بخواند. GitHub همچنین توضیح میدهد که گردشکارهای pull request میتوانند کشهای شاخه پایه را بازیابی کنند؛ همین مرز دسترسی است که رفتار خاص Miri را به یک مسئله امنیتی عملی تبدیل میکند.
راهحل کوتاهمدت Rust دامنه محیط حفظشده توسط Miri را به متغیرهای CARGO_* محدود میکند، با استثنای CARGO_*_TOKEN، و همچنین OUT_DIR را نگه میدارد. در راهحل بلندمدت، ممکن است Miri و Cargo روش دقیقتری برای تشخیص متغیرهای واقعاً مرتبط با ساخت پیدا کنند. این هشدار همچنین میگوید وصله ممکن است فوراً در nightly در دسترس نباشد؛ بنابراین تیمها باید نسخه toolchain واقعی مورد استفاده خود را بررسی کنند.
برای مخزنهای در معرض خطر، تیم پاسخگویی خاموشکردن کش برای job مربوط به Miri، اطمینان از در دسترس نبودن اسرار برای stepهایی که Miri را اجرا میکنند، یا توقف موقت Miri را پیشنهاد میکند. پس از اعمال راهکار، کشهای قبلی را پاک کنید و در صورت احتمال افشا، چرخش یا تعویض اعتبارنامهها را در نظر بگیرید. در سطحی گستردهتر، jobهایی که کش عمومی یا قابلخواندن برای pull request میسازند نباید به اسرار دسترسی داشته باشند؛ حتی ابزارهای غیرمرتبط با Miri نیز ممکن است متغیرهای محیطی را از طریق build scriptها یا ابزارهای کامپایل به artifactها منتقل کنند.
Rust گزارش میدهد که در بررسی اکوسیستم، یک مخزن را دارای این مشکل و هفت مخزن دیگر را ظاهراً غیرآسیبپذیر اما نیازمند احتیاط شناسایی کرده است. این بررسی کامل تضمین نشده است؛ بنابراین نگهدارندگان باید گردشکارهای خود را برای وجود همزمان Miri، محیطهای دارای secret، کش target/ و دسترسی pull request به کش بررسی کنند. این محدودیتِ کاملنبودن بررسی و احتمال آمادهنبودن فوری وصله در nightly، دو caveat مهمی هستند که باید هنگام تصمیمگیری عملی در نظر گرفته شوند.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


