Loading...
آیکون دسته‌بندی CVE

CVE-2025-31486 - Vite

...
فهرست مطالب

تحلیل و اکسپلویت آسیب‌پذیری Path Traversal در Vite (CVE-2025-31486)

در این مقاله، به صورت عمیق یکی از آسیب‌پذیری‌های امنیتی جالب توجه یعنی Path Traversal را در بستر ابزار توسعه وب مدرن، Vite، بررسی می‌کنیم. این آسیب‌پذیری که با شناسه فرضی CVE-2025-31486 شناخته می‌شود، نشان می‌دهد چگونه یک مهاجم می‌تواند با استفاده هوشمندانه از پسوندهایی مانند .svg و .wasm، محدودیت‌های امنیتی سرور توسعه (Dev Server) را دور زده و به فایل‌های حساس سیستم دسترسی پیدا کند. این راهنما به صورت گام به گام از مفاهیم پایه تا اکسپلویت عملی پیش می‌رود.

مفاهیم پایه: آشنایی با Vite

قبل از ورود به جزئیات فنی آسیب‌پذیری، لازم است با ابزارهایی که با آن‌ها سر و کار داریم آشنا شویم.

فریم‌ورک Vite:

Vite (تلفظ می‌شود «ویت») یک ابزار ساخت (build tool) و سرور توسعه مدرن برای پروژه‌های وب است که هدف اصلی آن بهبود چشمگیر «تجربه توسعه‌دهنده» (Developer Experience) از طریق افزایش فوق‌العاده سرعت است. برخلاف ابزارهای سنتی، Vite در محیط توسعه از ماژول‌های ES نیتیو بهره می‌برد که باعث راه‌اندازی تقریباً آنی سرور و اعمال تغییرات با سرعت بی‌نظیر می‌شود.

سرور توسعه (Dev Server):

سرور توسعه (Dev Server) یک وب سرور محلی و سبک است که به طور خاص برای تسریع فرآیند توسعه نرم‌افزار طراحی شده. این سرور با ارائه قابلیت‌هایی مانند جایگزینی سریع ماژول (HMR)، به توسعه‌دهنده اجازه می‌دهد تا نتایج تغییرات خود در کد را به صورت آنی در مرورگر ببیند. این ابزار فقط برای محیط توسعه است و نباید با سرور نهایی (Production) اشتباه گرفته شود.

حالا بریم سراغ آسیب‌پذیری CVE-2025-31486

حالا که با بستر آشنا شدیم، بیایید آسیب‌پذیری را به صورت دقیق بررسی کنیم.

آسیب پذیری Vite: چگونه رخ داد؟

ریشه این آسیب‌پذیری در نحوه پردازش فایل‌های Asset در Vite نهفته است. در فایل packages/vite/src/node/plugins/asset.ts، از خط285 تا 290، منطقی وجود داشت که URLهای دارای پسوند خاص مانند .svg یا .wasm را به شیوه‌ای متفاوت پردازش می‌کرد. مشکل اینجا بود که وقتی یک URL با پارامترهای فریبنده‌ای مانند ?.svg یا ?.wasm?init همراه می‌شد، یا هدر sec-fetch-dest: script در درخواست وجود داشت، مسیر پردازش کد تغییر می‌کرد. این تغییر مسیر باعث می‌شد که بررسی‌های امنیتی مهم، به ویژه تابع server.fs.deny که وظیفه مسدود کردن دسترسی به مسیرهای حساس را دارد، نادیده گرفته شود.

شرایط وقوع حمله

برای موفقیت‌آمیز بودن این حمله، چند شرط باید برقرار باشد:

  • نسخه‌های آسیب‌پذیر: این ضعف در محدوده‌های نسخه‌ زیر وجود دارد: تمام نسخه‌ها قبل از 4.5.12، نسخه‌های 5.0.0 تا قبل از 5.4.17، نسخه‌های 6.0.0 تا قبل از 6.0.14، نسخه‌های 6.1.0 تا قبل از 6.1.4 و نسخه‌های 6.2.0 تا قبل از 6.2.5.
  • قرار گرفتن سرور در معرض شبکه: سرور توسعه باید با فلگ --host اجرا شده باشد تا از خارج از سیستم لوکال قابل دسترسی باشد.
  • محدودیت اندازه فایل: این تکنیک تنها برای خواندن فایل‌های کوچک‌تر از مقدار build.assetsInlineLimit (که به طور پیش‌فرض 4 کیلوبایت است) کار می‌کند، زیرا Vite فایل‌های کوچک‌تر را به صورت Base64 در پاسخ جاوااسکریپت جاسازی (inline) می‌کند.

راهنمای عملی اکسپلویت (Walkthrough)

در این بخش، به صورت گام به گام نشان می‌دهیم چگونه می‌توان با یک دستور واحد، آسیب‌پذیری را اکسپلویت کرده و محتوای یک فایل حساس را مستقیماً استخراج کرد.

حالا پیلود چی باشه؟

به جای ارسال یک درخواست ساده و سپس تلاش برای جدا کردن اطلاعات از پاسخ، می‌توانیم از یک دستور زنجیره‌ای (Chained Command) در ترمینال استفاده کنیم. این دستور به طور همزمان درخواست مخرب را ارسال می‌کند، رشته Base64 را از پاسخ استخراج کرده و آن را رمزگشایی می‌کند تا محتوای فایل به صورت خوانا نمایش داده شود.

برای خواندن فایل /etc/passwd، دستور کامل زیر را اجرا می‌کنیم:


curl -s 'http://127.0.0.1:5173/etc/passwd?.svg?.wasm?init' | grep -oP '"data:application/octet-stream;base64,\K[^"]+' | base64 -d
    

اما دستور بعدی چیه؟:

  • curl -s '...': این بخش درخواست مخرب را به سرور آسیب‌پذیر Vite ارسال می‌کند. URL ساخته شده (/etc/passwd?.svg?.wasm?init) سرور را فریب می‌دهد تا محتوای فایل /etc/passwd را در قالب یک پاسخ جاوااسکریپت و به صورت Base64 برگرداند. فلگ -s برای حالت سکوت (silent) است تا اطلاعات مربوط به فرآیند دانلود نمایش داده نشود.
  • grep -oP '...': خروجی دستور curl به grep فرستاده می‌شود. این دستور با استفاده از یک عبارت منظم (Regex)، فقط رشته‌ی Base64 را از میان پاسخ کامل جاوااسکریپت پیدا و استخراج می‌کند.
  • base64 -d: در نهایت، رشته‌ی Base64 استخراج شده به دستور base64 -d ارسال می‌شود تا رمزگشایی (decode) شده و محتوای اصلی فایل /etc/passwd در خروجی استاندارد نمایش داده شود.
بهره‌برداری موفق از آسیب‌پذیری و خواندن فایل etc/passwd

راهکارهای پیشگیری و امن‌سازی

امن‌سازی پروژه در برابر این نوع حملات بسیار ساده و حیاتی است:

  • به‌روزرسانی فوری Vite: همیشه از آخرین نسخه پایدار Vite (نسخه‌های 4.5.12، 5.4.17، 6.0.14 و بالاتر) استفاده کنید.
  • استفاده از ابزارهای بازرسی امنیتی: به طور منظم دستور npm audit یا yarn audit را برای شناسایی بسته‌های آسیب‌پذیر اجرا کنید.
  • عدم قراردادن Dev Server در معرض شبکه عمومی: تا حد امکان از اجرای سرور توسعه با فلگ --host در محیط‌های غیرقابل اعتماد خودداری کنید.

منابع برای مطالعه بیشتر

برای درک عمیق‌تر مفاهیم مرتبط با این آسیب‌پذیری، مطالعه منابع زیر به شدت توصیه می‌شود:



سلب مسئولیت: این مقاله صرفاً با اهداف آموزشی و پژوهشی تهیه شده است. هرگونه سوءاستفاده از این اطلاعات در سیستم‌های واقعی غیرقانونی و غیراخلاقی است و مسئولیت آن بر عهده فرد خاطی خواهد بود.