تحقیقات جدید در حوزه امنیت وب، تکنیکی به نام Cache Key Injection را معرفی کرده است که به مهاجمان اجازه میدهد با دستکاری کلیدهای حافظه پنهان (Cache Keys)، به دادههای محدود دسترسی پیدا کنند، وبسایتها را مختل نمایند یا صفحات کش شده را با محتوای مخرب مسموم کنند.
مکانیسم حمله و تداخل کلیدها
در حالت عادی، Web Cache برای بهبود عملکرد، پاسخها را ذخیره کرده و در صورت دریافت درخواستهایی با کلید یکسان، همان پاسخ را بازگرداند. در وبسرور Nginx، کلید کش معمولاً از ترکیب اجزای درخواست HTTP مانند پروتکل، Hostname، URI و Headerها ساخته میشود. مشکل زمانی رخ میدهد که این متغیرها بدون هیچگونه جداکننده (Separator) در کنار هم قرار گیرند.
برای مثال، اگر پیکربندی Nginx به صورت proxy_cache_key "$scheme$host$request_uri$http_accept"; باشد، دو درخواست متفاوت میتوانند یک کلید یکسان ایجاد کنند. درخواستی برای مسیر /home با هدر Accept: / ممکن است دقیقاً همان کلیدی را تولید کند که درخواستی برای مسیر /h با هدر Accept: ome*/* تولید میکند. این تداخل (Collision) به مهاجم اجازه میدهد پاسخی را در حافظه کش ذخیره کند که بعداً برای یک کاربر قانونی نمایش داده شود.
سناریوهای خطرناک: از دور زدن دسترسی تا CPDoS
- دسترسی به پنلهای مدیریتی: در یک Proof of Concept، مهاجم توانست با دستکاری مسیر درخواست و مقادیر هدر، پاسخی را که توسط مدیر (Administrator) برای مسیر
/adminکش شده بود، بازیابی کند؛ در حالی که دسترسی مستقیم او به این مسیر توسط قوانین دسترسی مسدود شده بود. - حملات CPDoS: مهاجم میتواند با ایجاد تداخل کلید بین یک منبع موجود (مانند
/home) و یک منبع ناموجود (مانند/h)، پاسخ 404 Not Found را در کش ذخیره کند. در نتیجه، تمامی کاربران بعدی هنگام درخواست صفحه اصلی، با خطای 404 مواجه میشوند. - تزریق کد (XSS): با بهرهبرداری از تداخل بین پروتکلهای HTTP و HTTPS، مهاجم میتواند مقدار Host را جابجا کرده و باعث شود صفحه کش شده، اسکریپتهای جاوااسکریپت را از دامنه تحت کنترل مهاجم بارگذاری کند که منجر به Stored XSS میشود.
تأثیر بر زیرساختهای ابری و CDN
این تحقیق همچنین نشان داد که در محیطهایی که از Cloudflare در کنار Nginx استفاده میکنند، مهاجمان میتوانند با استفاده از هدر Authorization، لایه Edge Cache کلاودفلر را دور زده و مستقیماً حافظه کش Origin (سرور Nginx) را هدف قرار دهند تا محتوای مسموم را در لایه داخلی ذخیره کنند.
راهکارهای مقابله و پیشگیری
برای رفع این آسیبپذیری، مدیران سیستم باید از متصل کردن مستقیم قطعات کلید بدون مرزهای مشخص خودداری کنند. استفاده از هش (Hashing) به تنهایی مشکل را حل نمیکند زیرا رشتههای ورودی همچنان یکسان خواهند بود. راهکار صحیح، استفاده از جداکنندههای واضح یا کدگذاری ساختاریافته است:
پیکربندی امن: proxy_cache_key "$scheme|$host|$request_uri|$http_accept";
علاوه بر این، توصیههای زیر برای افزایش امنیت پیشنهاد میشود:
- عدم ذخیرهسازی پاسخهای احراز هویت شده یا محدود در Shared Cache.
- اعتبارسنجی سختگیرانه Host Headerها.
- اجبار به استفاده از HTTPS و یکسانسازی رفتار کش در لایههای CDN و Origin.