مانیتورینگ آسیبپذیریهای لاراول با Oh Dear و Laravel Health
خلاصهٔ کاملتر
چند ماه پیش یه آسیبپذیری RCE بحرانی توی Livewire v3 با شناسه CVE-2025-54068 منتشر شد. این باگ به مهاجمان ناشناس اجازه میداد کد دلخواه رو روی سرور اجرا کنن، فقط بهخاطر اینکه یه کامپوننت آسیبپذیر به شکل خاصی mount شده بود. پچ سریع اومد، ولی مشکل اصلی اینجاست: بین انتشار پچ و دیپلوی واقعی روی سرور، یه فاصله وجود داره که توی همین فاصلهست که سرورهای پروداکشن هک میشن.
دلیلش نه کُندی تیم نگهداریکننده پکیجه، نه حتی غفلت آشکار. بیشتر اتفاق میافته چون هیچکس توی تیم advisory رو ندیده، یا PR مربوطه merge شده ولی دیپلوی بیصدا شکست خورده، یا وابستگی چند لایه عمیقتره و کسی نمیدونه روی نسخه آسیبپذیره.
راهحل عملی ترکیب دو ابزاره: پکیج spatie/laravel-health که چکها رو داخل خود اپ اجرا میکنه، و سرویس Oh Dear که این چکها رو روی یه schedule میخونه و اعلان میده. پکیج امنیتی هم از همون دیتابیس FriendsOfPHP استفاده میکنه که دستور composer audit ازش بهره میبره، با این تفاوت که این یکی مداوم روی سرور پروداکشن داره اجرا میشه.
بعد از نصب پکیجها، باید یه service provider بسازی که چکهای موردنظرت رو ثبت کنه. SecurityAdvisoriesCheck اولین و مهمترینه، ولی میشه چکهای دیگهای مثل وضعیت دیتابیس، debug mode، فضای دیسک و Horizon رو هم کنارش اضافه کرد:
Health::checks([
SecurityAdvisoriesCheck::new(),
UsedDiskSpaceCheck::new(),
DebugModeCheck::new(),
EnvironmentCheck::new(),
DatabaseCheck::new(),
HorizonCheck::new(),
OptimizedAppCheck::new(),
]);بعدش باید این چکها رو روی یه schedule بذاری تا هر دقیقه اجرا بشن. اجرای هر دقیقهای مشکلی نیست چون چکها سبکن و دیتاست advisory بهصورت لوکال کش میشه.
برای اینکه Oh Dear بتونه نتایج رو بخونه، باید endpoint مخصوص رو توی config/health.php فعال کنی و یه secret تصادفی براش تنظیم کنی. وقتی یه آسیبپذیری پیدا بشه، جواب JSON این endpoint چیزی شبیه به این میشه:
{
"checkResults": [
{
"name": "SecurityAdvisories",
"status": "failed",
"notificationMessage": "Found 1 security vulnerability in livewire/livewire",
"meta": {
"vulnerabilities": [
{
"package": "livewire/livewire",
"version": "3.6.2",
"advisories": ["CVE-2025-54068"]
}
]
}
}
]
}Oh Dear هر چیزی که status اش failed باشه رو بهعنوان اعلان میفرسته؛ از طریق ایمیل، اسلک، دیسکورد، تیمز، وبهوک یا هر کانال دیگهای که تنظیم کرده باشی.
یه نکته مهم اینه که این سیستم با Dependabot رقیب نیست، مکمله. Dependabot ریپو رو اسکن میکنه، ولی Laravel Health + Oh Dear وضعیت چیزی که واقعاً روی سرور اجراست رو چک میکنه. خیلی وقتها این دو تا فرق دارن: مثلاً وقتی PR مرج شده ولی دیپلوی شکست خورده، یا یه staging server قدیمی هنوز نسخه آسیبپذیر داره.
برای لایه امنیتی بیشتر، میشه composer audit رو هم توی GitHub Actions اضافه کرد تا هم موقع push و هم روی یه schedule خودکار (مثلاً هر ۶ ساعت) اجرا بشه. این یعنی CVEهای جدید که علیه lockfile فعلی منتشر میشن هم گیر میافتن، حتی بدون اینکه کسی چیزی commit کرده باشه.
نکات کلیدی:
- spatie/laravel-health پکیجهای نصبشده رو در برابر دیتابیس FriendsOfPHP چک میکنه، همون منبعی که composer audit ازش استفاده میکنه
- Oh Dear endpoint رو هر دقیقه میخونه و با اولین failed شدن چک امنیتی اعلان میده
- این روش برعکس Dependabot، وضعیت واقعی سرور پروداکشن رو مانیتور میکنه نه فقط ریپو رو
- اضافه کردن composer audit به CI با یه schedule خودکار، CVEهای جدید علیه lockfile موجود رو هم میگیره
- هر سه لایه (health check روی سرور، Oh Dear برای اعلان، composer audit در CI) با هم یه پوشش کامل میسازن




