حملهٔ زنجیرهٔ تأمین به crates.io: سه پکیج Rust آلوده شدن
خلاصهٔ کاملتر
روز ۲۰ آگوست ۲۰۲۶ مهاجمها نسخههای آلودهٔ سه پکیج پرکاربرد Rust رو روی crates.io، رجیستری رسمی این زبان، منتشر کردن. تیم امنیتی Iru که این تحلیل رو نوشته میگه نسخههای دستکاریشده arrayref@0.3.10، internment@0.8.7 و append-only-vec@0.1.9 بودن و کنارشون یه وابستگی مخرب به اسم proc-macro1 اضافه شده بود. پکیجها فقط حدود دو ساعت روی رجیستری موندن و بعد برداشته شدن.
چیزی که این حمله رو خطرناک میکنه اینه که هیچ تعامل کاربری لازم نیست. Cargo موقع بیلد اسکریپت build.rs هر وابستگی رو خودکار اجرا میکنه، پس همون لحظهای که پروژه کامپایل میشه پیلود هم اجرا میشه. اسکریپت آدرس سرور تحویل رو از تکههای Base64 سرهم میکنه، یه verifier جعلی نصب میکنه که هر گواهی TLS رو قبول کنه، سیستمعامل و معماری CPU رو تشخیص میده و باینری متناسب رو تو مسیر /tmp/rust-setup مینویسه و اجراش میکنه.
نمونهٔ macOS یه فایل Mach-O حدوداً ۳ مگابایتی برای arm64 هست که self-signed شده و Team ID معتبر اپل نداره. کانفیگ داخلیش با AES-128-GCM رمز شده و کلیدش یه رشتهٔ ثابت داخل خود باینریه، نه چیزی که از سرور بگیره. بعد از باز شدن کانفیگ، بازهٔ بیکن یکدقیقهای و لیست هدفها بیرون میآد: کلیدهای SSH، تنظیمات AWS و Kubernetes، کیفپولهای ارز دیجیتال مثل Exodus و Ledger Live، و پروفایل مرورگرهای خانوادهٔ Chromium.
برای موندگاری یه LaunchAgent میسازه تا بعد از ریاستارت دوباره بالا بیاد، و دادهها رو به شکل JSON کدشدهٔ Base64 با POST روی HTTPS میفرسته. سطح دستوراتش کوچیکه: kill برای خاموش کردن خودش، minicfg برای عوض کردن آدرس سرور، startup برای نصب موندگاری و runscript که هرچی اپراتور بخواد رو دانلود و اجرا میکنه. اگه سرور اصلی در دسترس نباشه، یه الگوریتم تولید دامنه سراغ دامنههای جایگزین میره.
یه نکتهٔ جالب هم تو تحلیل هست: سازندهها میخواستن دستورها با کلید RSA-2048 امضا و اعتبارسنجی بشه، ولی کلید خصوصی رو هم داخل خود ایمپلنت گذاشتن، پس عملاً این احراز هویت بیاثره. نویسندهها انتساب به بازیگرهای مرتبط با کرهٔ شمالی رو با اطمینان بالا و انتساب به گروه Sapphire Sleet رو با اطمینان پایین ارزیابی میکنن. مهاجمها نسخههای پایدار قبلی رو yank هم کردن تا resolver خودکار سراغ نسخهٔ آلوده بره.
نکات کلیدی:
- نسخههای آلودهٔ arrayref@0.3.10، internment@0.8.7 و append-only-vec@0.1.9 حدود دو ساعت روی crates.io بودن
- آخرین نسخههای امن: 0.3.9، 0.8.6 و 0.1.8
- اجرای خودکار build.rs توسط Cargo یعنی فقط کامپایل پروژه برای آلوده شدن کافیه
- کانفیگ ایمپلنت با AES-128-GCM رمز شده و بازهٔ بیکن یک دقیقهست
- کلید خصوصی RSA داخل خود ایمپلنت بود، پس احراز هویت دستورها بیاثر شد
- هر محیطی که تو اون بازه بیلد گرفته باید آلوده فرض بشه و کلیدهاش عوض بشه




