یک آسیبپذیری روز صفر جدید در فریم ورک Spring Core جاوا به صورت عمومی فاش شده است که با عنوان Spring4Shell ردیابی میشود. این آسیب پذیری که از نوع اجرای کد از راه دور (RCE) است، با شناسه CVE-2022-22965 و درجه خطر ۹.۸ از ۱۰ (بحرانی) شناخته میشود و بر برنامههای Spring MVC و Spring WebFlux که روی JDK 9+ اجرا میشوند، تأثیر میگذارد.
Spring Core یک فریم ورک جاوا بسیار محبوب برای ساخت برنامههای کاربردی سازمانی وب مدرن جاوا است.
پیکربندی خاص جهت سوءاستفاده از آسیبپذیری نیاز به استقرار اپلیکیشن در یک پکیج WAR و اجرا تحت Tomcat دارد. اگر برنامه به عنوان یک jar اجرایی Spring Boot، یعنی حالت پیشفرض، مستقر شده باشد، در برابر اکسپلویت آسیبپذیر نیست. با این حال، ماهیت آسیبپذیری عمومیتر است و ممکن است راههای دیگری برای بهرهبرداری از آن وجود داشته باشد.
آیا من آسیبپذیر هستم؟
- بالقوه آسیبپذیر: هر برنامهای که از نسخههای Spring Framework قبل از 5.2.20، 5.3.18 و نسخه 9 و یا بالاتر JDK استفاده میکند، آسیبپذیری در آن وجود دارد.
- بالفعل آسیبپذیر: اگر علاوه بر شروط بند ۱، از حاشیهنویسی(annotation) RequestMapping@ و مشابه آن (@PostMapping و …) در برنامه استفاده شده است و حداقل در یکی از توابع از پارامتر شیگرا یعنی Plain Old Java Object (POJO) استفاده شده است، آسیبپذیری قطعا در اختیار نفوذگر قرار دارد.
- فوقالعاده در معرض خطر: هر برنامهای که علاوه بر موارد بالا، از Tomcat استفاده کند، با خطر بالای سوء استفاده مواجه است، چرا که کدهای اکسپلویت برای نفوذ علیه برنامههای مبتنی بر Tomcat به راحتی در دسترس عموم است.
راهکار
- بهترین و قطعیترین راه حل، ارتقا به Spring Framework 5.3.18 و 5.2.20 میباشد.
- برای نسخههای قدیمیتر و پشتیبانینشده Spring Framework، ارتقاء به Apache Tomcat 10.0.20، 9.0.62 یا 8.5.78، حفاظت کافی را فراهم میکند. با این حال، این باید به عنوان یک راه حل موقت تلقی گردد و بایستی در اسرع وقت به یک نسخه پشتیبانی شده Spring Framework ارتقا دهید.
- اگر نه میتوانید Spring Framework را ارتقا دهید و نه آپاچی Tomcat را ارتقا دهید، برگشت به نسخه قدیمیتر جاوا 8 یک راه حل قابل قبول است.
- اگر هیچ یک از راههای ذکر شده برای شما مقدور نبود، در Spring Framework ،DataBinder دارای قابلیتی برای غیر مجاز کردن الگوهای خاص است. به عنوان یک راه حل موقت برای این آسیبپذیری، توصیه میشود که یک مؤلفه ControllerAdvice (که جزء Spring مشترک بین Controllerها است) و اضافه کردن الگوهای خطرناک به فهرست انکار، ایجاد کنید.