یک آسیبپذیری حیاتی (CVE-2022-29176) در مخزن بسته RubyGems.org شناسایی شده است که بدون مجوز مناسب، امکان جایگزینی بستههای افراد دیگر در مخزن را با شروع یک یانک از یک بسته قانونی و بارگذاری در جای آن میدهد. فایل دیگری با همین نام و شماره نسخه.
برای بهره برداری موفقیت آمیز از آسیب پذیری، سه شرط باید رعایت شود:
- حمله فقط بر روی بسته هایی انجام می شود که به نام خود خط فاصله دارند.
- مهاجم باید بتواند یک بسته جم با بخشی از نام قبل از کاراکتر خط فاصله قرار دهد. به عنوان مثال، اگر حمله روی بسته "rails-html-sanitizer" باشد، مهاجم باید بسته "rails-html" خود را در مخزن قرار دهد.
- بسته مورد حمله باید در 30 روز گذشته ایجاد شده باشد یا برای 100 روز به روز نشده باشد.
این آسیبپذیری ناشی از یک خطا در کنترلکننده عمل «yank» است که بخشی از نام را پس از خط فاصله به عنوان نام پلتفرم تعبیر میکند، که امکان شروع حذف بستههای خارجی را که با بخشی از نام مطابقت دارند، آغاز میکند. قبل از خط فاصله به طور خاص، در کد کنترل کننده "yank" از فراخوان "find_by!(full_name: "#{rubygem.name}-#{slug}")" برای یافتن بسته ها استفاده شد، در حالی که پارامتر "slug" توسط صاحب بسته برای تعیین نسخه حذف شود. صاحب بسته "rails-html" می تواند "sanitizer-1.2.3" را به جای نسخه "1.2.3" مشخص کند، که باعث می شود این عملیات روی بسته شخص دیگری "rails-html-sanitizer-1.2.3" اعمال شود. ".
این مشکل توسط یک محقق امنیتی به عنوان بخشی از برنامه جایزه HackerOne برای یافتن مسائل امنیتی در پروژههای منبع باز شناخته شده شناسایی شد. این مشکل در 5 می در RubyGems.org برطرف شد و به گفته توسعهدهندگان، آنها هنوز هیچ اثری از سوء استفاده از آسیبپذیری در لاگها در 18 ماه گذشته شناسایی نکردهاند. در عین حال، تاکنون فقط یک ممیزی سطحی انجام شده و در آینده ممیزی عمیق تری در نظر گرفته شده است.
برای بررسی پروژه های خود، توصیه می شود تاریخچه عملیات را در فایل Gemfile.lock تجزیه و تحلیل کنید؛ فعالیت مخرب در صورت وجود تغییرات با حفظ نام و نسخه یا تغییر پلت فرم بیان می شود (به عنوان مثال، زمانی که نام جواهر بسته -1.2.3 به gemname-1.2.3-java به روز می شود). به عنوان یک راه حل برای محافظت در برابر جایگزینی بسته پنهان در سیستم های یکپارچه سازی مداوم یا هنگام انتشار پروژه ها، به توسعه دهندگان توصیه می شود از Bundler با گزینه های "-frozen" یا "-deployment" برای رفع وابستگی ها استفاده کنند.
منبع: opennet.ru