آسیب پذیری بحرانی Jenkins، خبری است که این روزها زیاد شنیده میشود. Jenkins (جنکینز) یک نرمافزار متنباز اتوماسیون سرور میباشد که توسط جاوا نوشته شده است. Jenkins بستری را آماده میکند که به کمک آن میتوان قسمتهایی از پروسه تولید نرمافزار که نیاز به دخالت نیروی انسانی ندارد را با استفاده از پروسه یکپارچهسازی مداوم و تسهیل جنبههای فنی تحویل پیوسته نرمافزار خودکارسازی کرد. Jenkins یک بستر بنا شده بر خدمات سروری است که بر روی کانتینرهای سرورلت همچون آپاچی تامکت اجرا میشود.
تیم پشتیبان نرم افزار Jenkins طی گزارشی در بیست و چهارم ژانویه ۲۰۲۴ اعلام کردند که ۹ نقص امنیتی، از جمله یک باگ بحرانی را در این نرم افزار برطرف کرده اند که اگر با موفقیت مورد سوء استفاده قرار گیرد، می تواند منجر به اجرای کد از راه دور (RCE) شود. این باگ که با شناسه CVE-2024-23897 دنبال میشود، به عنوان یک آسیب پذیری خواندن فایل دلخواه از طریق رابط خط فرمان داخلی (CLI) توصیف شده است.
Jenkins از کتابخانه args4j برای تجزیه آرگومان های فرمان و گزینه های کنترل کننده Jenkins هنگام پردازش دستورات CLI استفاده می کند. این تجزیه کننده فرمان دارای یک ویژگی است که یک کاراکتر @ و به دنبال آن یک مسیر فایل را در یک آرگومان با محتوای فایل (expandAtFiles) جایگزین می کند. این ویژگی به طور پیشفرض فعال است و Jenkins 2.441 به بالا، LTS 2.426.2 و نسخه های قبلی، آن را غیرفعال نمی کنند.
یک عامل تهدید می تواند از این ویژگی برای خواندن فایل های دلخواه در سیستم فایل Jenkins controller با استفاده از رمزگذاری کاراکتر پیشفرض فرآیند Jenkins controller استفاده کند. در حالی که مهاجمانِ دارایِ مجوزِ « Overall/Read» می توانند کل فایل ها را بخوانند، افرادی که این مجوز را ندارند می توانند سه خط اول فایل ها را بسته به دستورات CLI بخوانند.
بهعلاوه، این نقص می تواند برای خواندن فایل های باینری حاوی کلیدهای رمزنگاری، البته با محدودیت های خاص، مورد استفاده قرار گیرد. به شرطی که بتوان secretهای باینری را استخراج کرد، Jenkins اذعان داشته است که می تواند راه را برای حملات مختلف باز کند، از جمله:
- اجرای کد از راه دور از طریق URL های روت (Root) منبع
- اجرای کد از راه دور از طریق کوکی “Remember Me”
- اجرای کد از راه دور از طریق حملات اسکریپت بین سایتی (XSS) ذخیره شده از طریق لاگ های ساخت
- اجرای کد از راه دور از طریق دور زدن حفاظت CSRF
- رمزگشایی اسرار ذخیره شده در Jenkins
- حذف هر موردی درJenkins
- دانلود محتویات پشته (heap) جاوا
در حالی که فایل های حاوی داده های باینری قابل خواندن هستند، ویژگی آسیب دیده سعی می کند با استفاده از رمزگذاری کاراکتر پیش فرض فرآیند کنترلر، آنها را به عنوان رشته بخواند. این احتمالاً باعث می شود که برخی از بایت ها با موفقیت خوانده نشوند و با یک placeholder جایگزین شوند. اینکه کدام بایت ها می توانند یا نمی توانند خوانده شوند به این رمزگذاری کاراکتر بستگی دارد.
محقق امنیتی SonarSource، Yaniv Nizry، کشف و گزارش این نقص را در سیزدهم نوامبر ۲۰۲۳ انجام داده است، که با غیرفعال سازی ویژگی تجزیه کننده فرمان در Jenkins2.442، LTS 2.426.3 برطرف شده است. به عنوان یک راه حل کوتاه مدت تا زمانی که اصلاحیه قابل اعمال عرضه شود، توصیه می شود دسترسی به CLI را خاموش کنید.
این توسعه تقریباً یک سال پس از آن صورت پذیرفت که Jenkins به یک جفت آسیب پذیری امنیتی با شدت بالا به نام CorePlague (CVE-2023-27898 و CVE-2023-27905) رسیدگی کرد که می توانستند منجر به اجرای کد در سیستم های هدفمند شوند.