پرستاشاپ 8.2.3 منتشر شد.
پرستاشاپ 8.2.3 منتشر شد. این نسخه، یک انتشار وصلهای با محوریت امنیت برای شاخهی 8.2 است. هدف اصلی آن رسیدگی به یک آسیبپذیری شمارش ایمیل (email enumeration) در قابلیت بازیابی رمز عبور در بخش مدیریت (back office) است. تعداد اندکی از بهبودها و رفع باگهای کمریسک که پیشتر اعتبارسنجی شدهاند نیز در این نسخه گنجانده شدهاند.
چرا این انتشار در حال حاضر انجام شد؟
پرستاشاپ 8.2 در مرحلهی پشتیبانی توسعهیافته (extended support phase) قرار دارد، بنابراین فقط اصلاحات امنیتی و بحرانی منتشر میشوند. در روزهای گذشته، ما از طریق گزارشهای جامعه و شرکای خود، فعالیتهای خودکاری را مشاهده کردیم که از صفحهی بازیابی رمز عبور بخش مدیریت برای شمارش ایمیلهای کارمندان سوءاستفاده میکردند. این امر ما را بر آن داشت تا یک نسخهی امنیتی برای شاخهی 8.2.x
برنامهریزی کنیم.
جزئیات آسیبپذیری
یک مهاجم بدون احراز هویت (unauthenticated attacker) میتوانست از صفحهی بازیابی رمز عبور با ساخت پارامترهای id_employee
و reset_token
برای کشف اینکه کدام حسابهای کارمندان وجود دارند (شمارش ایمیل) سوءاستفاده کند. استفاده از این آسیبپذیری مستلزم آن است که مهاجم از قبل آدرس URL بخش مدیریت شما را بداند (یا آن را حدس زده یا کشف کرده باشد). پنهان کردن یا سفارشیسازی این URL میتواند نویز ناشی از اسکنهای اتفاقی را کاهش دهد، اما نباید به عنوان یک اقدام کافی در نظر گرفته شود.
به نسخهی 8.2.3 بهروزرسانی کنید یا پچ دستی زیر را اعمال نمایید. جزئیات کامل در اطلاعیه رسمی در دسترس است:
GHSA-8xx5-h6m3-jr33.
نسخهی پرستاشاپ 9 تحتتأثیر قرار نگرفته است.
بهروزرسانی به پرستاشاپ 8.2.3
توصیه میشود در اسرع وقت به نسخهی 8.2.3 بهروزرسانی کنید.
Update Assistant فرآیند بهروزرسانی را تا حد زیادی با چند کلیک ساده انجام میدهد: حالت نگهداری را فعال کنید، بهروزرسانی را اجرا کنید، لاگها را مرور کنید، تست بگیرید، و سپس فروشگاه خود را دوباره باز کنید.
دانلود
دانلود PrestaShop 8.2.3 اکنون!
راهکارهای احتمالی
فقط بهروزرسانی به 8.2.3 (یا اعمال پچ دستی) مشکل را به طور کامل برطرف میکند. مراحل زیر مشکل را رفع نمیکنند، اما میتوانند ریسک را کاهش دهند و نویز اسکنهای خودکار را تا زمان بهروزرسانی کمتر کنند:
- محدود کردن دسترسی شبکه به بخش مدیریت (VPN، فهرست مجاز IP، reverse proxy).
- افزودن یک لایه احراز هویت HTTP اضافی در جلوی بخش مدیریت.
- سفارشیسازی یا مبهمسازی (obfuscate) آدرس URL بخش مدیریت.
- افزودن محدودیت نرخ (rate limiting) یا قوانین WAF برای مسیر بازیابی رمز عبور و درخواستهای تکراری با
id_employee
متفاوت. - پایش لاگها برای شناسایی الگوهای انفجاری از ترکیب پارامترهای
reset_token
/id_employee
. - فعال کردن احراز هویت دو مرحلهای (2FA) برای حسابهای کارمندان (از طریق ماژول شخص ثالث) برای محدود کردن تأثیرات بعدی.
به یاد داشته باشید: این مراحل ریسک را کاهش میدهند اما جایگزین بهروزرسانی یا رفع مشکل اصلی نیستند.
پرستاشاپ 9
پرستاشاپ 9، که بر پایهی جریان مدرن Symfony برای احراز هویت و بازیابی رمز عبور ساخته شده است، از این مشکل تأثیر نمیپذیرد. ما تاجران را تشویق میکنیم تا برای بهرهمندی از معماری امنیتی مقاومتر آن و توسعهی مستمر قابلیتها، برنامهی مهاجرت خود را تنظیم کنند.
از آنجا که (طبق توضیح دادهشده در
PrestaShop 8.2.x enters the extended support phase)
شاخهی 8.2.x اکنون فقط اصلاحات امنیتی و بحرانی را دریافت میکند، شما باید برنامهریزی برای انتقال به پرستاشاپ 9 را آغاز کنید تا به ویژگیهای جدید و معماری امنیتی پیشرفتهی آن دست یابید.
دستورالعملهای پچ دستی (برای کاربران پیشرفته)
بهروزرسانی به نسخهی 8.2.3 ایمنترین روش است، اما اگر نمیتوانید فوراً بهروزرسانی کنید، میتوانید به صورت دستی پچ را اعمال کنید:
جزئیات اصلاح
پچ تضمین میکند که:
- هر دو پارامتر
reset_token
وid_employee
باید وجود داشته باشند. - شیء کارمند (employee object) باید با موفقیت بارگذاری شود.
- توکن بازنشانی معتبر ذخیرهشده که از طریق
Employee::getValidResetPasswordToken()
بازیابی میشود باید با توکن ارائهشده مطابقت داشته باشد. - فقط در این صورت است که مقادیر
reset_email
،reset_token
، وid_employee
به قالب (template) اختصاص داده میشوند. در غیر این صورت، هیچ چیز فاش نمیشود که وجود ارتباطی میان یک ایمیل و یک کارمند را تأیید کند.
در قالب سادهشده، کد تصحیحشده اکنون به شکل زیر است:
// For reset password feature
$reset_token = Tools::getValue('reset_token');
$id_employee = Tools::getValue('id_employee');
if ($reset_token !== false && $id_employee !== false) {
$this->context->smarty->assign('reset_token', $reset_token);
$this->context->smarty->assign('id_employee', $id_employee);
$employee = new Employee($id_employee);
$valid_reset_token = $employee->getValidResetPasswordToken();
if ($valid_reset_token !== false && $valid_reset_token === $reset_token) {
$this->context->smarty->assign('reset_email', $employee->email);
}
}
نحوهی اعمال پچ به صورت دستی
- از فایلها و پایگاه داده بکآپ بگیرید.
- فایل
controllers/admin/AdminLoginController.php
را باز کنید. - بخشی را که با
// For reset password feature
آغاز میشود و پیش از اعتبارسنجی توکن، مقادیرid_employee
/reset_email
را اختصاص میدهد، پیدا کنید. - کل آن بلوک را با دنبالهی کد اصلاحشدهای که در بالا نشان داده شده جایگزین کنید.
- تست کنید: درخواست بازیابی رمز عبور ارسال کنید، از لینک ایمیلشده استفاده کنید، سپس سعی کنید پارامترهای
id_employee
/reset_token
را تغییر دهید تا مطمئن شوید هیچ ایمیل دیگری فاش نمیشود. - (فقط اگر از لایههای کش opcode یا کشهای خارجی استفاده میکنید) کش OPcache، Varnish، CDN یا reverse proxy را پاک کنید. پاکسازی کش Smarty به تنهایی برای این تغییر لازم نیست.
- اگر مطمئن نیستید، ترجیح دهید بهجای این روش، به نسخهی 8.2.3 بهروزرسانی کامل انجام دهید.
سپاسگزاریها
ما صمیمانه از افراد زیر تشکر میکنیم:
- Maxime Morel-Bailly برای گزارش مسئولانهی آسیبپذیری.
- @M0rgan01 و @matthieu-rolland برای پیادهسازی اصلاح.
- OpenServis و TouchWeb برای هشدار دربارهی موجهای جاری تلاشهای شمارش ایمیل در محیط واقعی.
- @jolelievre برای بهبود Distribution API Client.
- @Codencode و @touxten برای مشارکت در رفع باگهایی که در این نسخه گنجانده شدهاند.
همکاری شما به حفظ امنیت اکوسیستم کمک میکند.