نمای کلی اجرایی و اهمیت معماری
تیم پاسخ به امنیت Rust، تحلیل امنیتی حیاتی و اصلاح فوری را برای یک رفتار معماری در Miri (مفسر تجربی مبتنی بر MIR در Rust) منتشر کرده است. این مشکل ناشی از نحوه سریالسازی و ذخیرهسازی تاریخی متغیرهای محیطی توسط cargo miri مستقیماً در دایرکتوری کامپایل target/ برای اتصال حالت در چندین فراخوانی داخلی Miri است. در حالی که این انتخاب طراحی با موفقیت زمینه اجرای لازم را حفظ کرد، اما هنگام ادغام با پلتفرمهای رایج یکپارچهسازی مداوم (CI)، بهویژه مکانیسمهای کش کردن GitHub Actions، یک آسیبپذیری جدی در پاییندست ایجاد کرد.
در امنیت زنجیره تامین نرمافزار مدرن، تقاطع کشهای ماندگار و جریانهای کاری درخواست کشش (PR) یک بردار تهدید پیچیده را تشکیل میدهد. GitHub Actions به مخازن اجازه میدهد تا آرتیفکتهای بیلد مانند target/ را کش کنند تا زمانهای اجرای پایگاه داده بهینه شود. بهطور معمول، نگهدارندهها محدودیتهای دسترسی را اعمال میکنند که در آن شاخههای اصلی در کش مینویسند، در حالی که شاخههای PR غیرقابل اعتماد فقط میتوانند از آن بخوانند تا از مسمومیت کش جلوگیری شود. با این حال، از آنجا که Miri کل نقشه متغیر محیطی — از جمله توکنهای حساس و اعتبارنامهها — را در target/ حفظ کرد، هر بازیگر مخربی که قادر به باز کردن یک PR بود میتواند اجرای CI را آغاز کند، آن رازها را از کش مشترک استخراج کند، و متعاقباً با فشردن اجباری یا بازنویسی کامیتها، ردپای خود را بپوشاند. این تحلیل مکانیسمهای افشا، اصلاحات معماری اعمالشده و مراحل کاهش خطر لازم برای نگهدارندههای Rust را تجزیه و تحلیل میکند.
بهبودهای هسته و ارگونومی توسعهدهنده
اصلاح میانمدت پیادهسازی شده توسط تیم توسعه Miri، نحوه رهگیری و حفظ متغیرهای محیطی در طول کامپایل را بهطور اساسی تغییر میدهد. بهجای گرفتن یک عکس فوری فراگیر از کل محیط اجرای زمان اجرا، منطق بهروزرسانیشده Miri صراحتاً فقط فضاهای نام تعیینشده را فیلتر و حفظ میکند. بهطور خاص، این چارچوب اکنون متغیرهای محیطی CARGO_* را ایزوله میکند — در حالی که صراحتاً اعتبارنامههای حساسی مانند CARGO_*_TOKEN را حذف میکند — و در کنار آن متغیر استاندارد OUT_DIR را نگه میدارد. این محدوده دقیق تضمین میکند که فرآیندهای داخلی Miri پارامترهای ساخت لازم را بدون سریالسازی ناخواسته اعتبارنامههای زمان اجرای حساس در آرتیفکتهای ساخت که مقصدشان استمرار کش است، حفظ کنند.
از دیدگاه ارگونومی توسعهدهنده، این بهروزرسانی نیازی به پیکربندی مجدد جریان کار برای پروژههایی که از بهداشت محیط امن پیروی میکنند، ندارد. با این حال، ارزیابی مجدد ساختاری نحوه مدیریت اسرار توسط خطوط لوله CI را اجباری میکند. با باریک کردن پنجره افشا در سطح ابزار، Rust موضعی پیشگیرانه در مورد سختسازی زنجیره تامین نشان میدهد. توسعهدهندگان دیگر مجبور نیستند بین زمانهای ساخت بهینه از طریق کش کردن و امنیت مطلق یکی را انتخاب کنند؛ خود کامپایلر اکنون به عنوان یک مرز حفاظتی عمل میکند، و حتی اگر پیکربندیهای سطح شغل بیش از حد مجاز باشند، از خروج تصادفی راز جلوگیری میکند.
ماتریس مقایسه معماری
| متریک / بعد | مبنای قبلی (cargo miri) |
نسخه بهروزرسانیشده (github-actions-leaking-secrets-w) |
تأثیر معماری |
|---|---|---|---|
| سریالسازی محیطی | ثبت کامل تمام متغیرهای محیطی میزبان فعال. | ثبت فیلترشده (CARGO_* به استثنای توکنها، OUT_DIR). |
سطح حمله برای استخراج کش را به شدت کاهش میدهد. |
| سربار حافظه و ذخیرهسازی | ردپای بالاتر به دلیل سریالسازی نقشههای محیطی اضافی در target/. |
ردپای سبکتر که فقط کلیدهای زمینه مرتبط با ساخت را ذخیره میکند. | بهبود عملکرد حداقلی با دستاورد امنیتی قابل توجه. |
| API و ادغام ابزار | برای Cargo شفاف است، اما به شدت به وضعیت محیط محیطی وابسته است. | محدودسازی صریح اعمال شده در cargo-miri/src/util.rs. |
اتصال ادغام محکمتر بین فازهای اجرای Cargo و Miri. |
| پروفایل ایمنی کش | بسیار آسیبپذیر هنگام جفت شدن با کشهای اشتراکی GitHub Actions. | مقاوم در برابر استخراج غیرمجاز راز از طریق کشهای PR. | عملکرد ایمن خارج از جعبه برای مخازن عمومی و خصوصی. |
تغییرات مخرب و نکات مهاجرت
این نسخه تغییرات هدفمندی را معرفی میکند که ممکن است روی جریانهای کاری خاصی که به متغیرهای محیطی دلخواه منتقل شده به Miri از طریق اسکریپتهای ساخت یا فراخوانیهای سفارشی متکی هستند، تأثیر بگذارد. اگر مجموعه تست Miri شما به متغیرهای محیطی غیر CARGO_* که بهصورت سراسری در کار CI تزریق شدهاند متکی است، آن متغیرها دیگر برای نمونههای Miri در سراسر اجراهای کششده قابل مشاهده نخواهند بود.
پروژهها باید پیکربندیهای CI خود را ممیزی کنند تا اطمینان حاصل کنند که مقادیر پیکربندی مورد نیاز صراحتاً از طریق پرچمهای خط فرمان یا متغیرهای پیشونددار محدود CARGO_* منتقل میشوند، نه اینکه به نشت محیط محیطی متکی باشند. علاوه بر این، نگهدارندههایی که قبلاً پیکربندیهای آسیبپذیر را اجرا کردهاند، باید فوراً کشهای موجود GitHub Actions خود را پاک کنند و هر راز یا کلید API که ممکن است در معرض مسیرهای اجرای PR تاریخی قرار گرفته باشد را چرخش (Rotate) دهند.
راهنمای ارتقای گام به گام
برای اطمینان از اینکه مخزن شما در برابر نشت متغیرهای محیطی از طریق Miri و کشهای GitHub Actions کاملاً محافظت میشود، مراحل اصلاح زیر را انجام دهید:
بهروزرسانی ابزار یا اعمال اصلاحات سریع اطمینان حاصل کنید که از یک ابزار شبانه حاوی اصلاحیه Miri استفاده میکنید، یا با محدود کردن اسرار منحصراً به مراحل غیر Miri، یک اصلاح سریع در فایل جریان کار خود پیادهسازی کنید.
ایزولهسازی اسرار جریان کار پیکربندی YAML مربوط به GitHub Actions خود را تغییر دهید تا اسرار محیطی سراسری حذف شوند و آنها را فقط به مراحل خاصی که نیاز به احراز هویت دارند منتقل کنید:
jobs: miri-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run Miri # اسرار از محیط این مرحله مستثنی شدهاند run: cargo miri testپاکسازی کشها و چرخش اعتبارنامهها به تنظیمات GitHub مخزن خود در بخش Actions > Caches بروید، تمام ورودیهای کش موجود برای
target/را حذف کنید، و فوراً هر توکن یا کلید API که در طول اجراهای قبلی CI قابل دسترسی بوده است را چرخش دهید.
