پژوهشگران امنیتی تکنیک جدیدی از مسمومسازی حافظه پنه (Cache Poisoning) تحت عنوان Cache Key Injection را معرفی کردهاند. این متد به مهاجمان اجازه میدهد تا کنترلهای دسترسی (Access Controls) را دور زده، صفحات حساس کششده را افشا کنند، شرایط Denial-of-Service (DoS) ایجاد کرده و در برخی موارد حملات Stored XSS را علیه پیادهسازیهای آسیبپذیر Nginx اجرا نمایند.
مکانیسم حمله و نقص ساختاری
این آسیبپذیری زمانی رخ میدهد که وبکشها (Web Caches) برای ایجاد کلیدهای کش (Cache Keys)، مقادیر متغیر درخواستها را بدون استفاده از جداکننده (Separator) و بهصورت مستقیم به یکدیگر متصل (Concatenate) میکنند. در حالی که مسمومسازیهای سنتی معمولاً روی هدرهای بدون کلید تمرکز دارند، Cache Key Injection مستقیماً مقادیری را هدف قرار میدهد که پیش از این در کلید کش گنجانده شدهاند.
به عنوان مثال، در پیکربندی proxy_cache_key “$scheme$host$request_uri$http_accept”;، به دلیل نبود مرز مشخص بین متغیرها، دو درخواست متفاوت میتوانند یک کلید کش یکسان تولید کنند. اگر مهاجم درخواستی به مسیر /h با هدر Accept: ome*/* ارسال کند، کلید تولید شده با درخواست قانونی به مسیر /home با هدر Accept: */* یکسان خواهد بود. در صورتی که پاسخ مهاجم ابتدا کش شود، کاربران بعدی هنگام درخواست مسیر /home، پاسخ مسموم را دریافت میکنند.
پیامدهای امنیتی و سناریوهای عملیاتی
- دور زدن کنترل دسترسی: در یک سناریوی اثبات مفهوم (PoC)، سروری که دسترسی به مسیر
/adminرا تنها به localhost محدود کرده بود، مورد حمله قرار گرفت. مهاجم با درخواست مسیر/adو دستکاری بخش باقیمانده در یک هدر کلیددار، توانست پاسخی را که مربوط به/adminبود از کش مشترک بازیابی کند. - مسمومسازی منجر به DoS: مهاجم میتواند درخواستی به یک نقطه انتهایی (Endpoint) غیرموجود ارسال کند که کلید کش آن با یک منبع قانونی برخورد (Collision) داشته باشد. اگر سرور پاسخ 404 برگرداند، این خطا در کش ذخیره شده و کاربران قانونی تا زمان انقضای کش، با خطای 404 مواجه میشوند (CPDoS).
- تداخل پروتکل (Scheme Confusion): در محیطهایی که هر دو پروتکل HTTP و HTTPS از یک اپلیکیشن استفاده میکنند، مهاجم میتواند با ایجاد برخورد بین یک درخواست HTTP (با Host شروع شده با حرف s) و یک درخواست HTTPS، باعث بارگذاری جاوااسکریپتهای مخرب و اجرای Stored XSS شود.
توصیههای فنی برای مقابله
برای کاهش این ریسکها، مدیران سیستم و مهندسین امنیت باید اقدامات زیر را به کار گیرند:
- پرهیز از اتصال مستقیم متغیرهای با طول نامشخص در کلیدهای کش.
- استفاده از جداکنندههای صریح یا کدگذاری ساختاریافته (مثلاً:
”$scheme|$host|$request_uri|$http_accept”). - اعتبارسنجی دقیق هدرهای Host.
- جداسازی رفتارهای HTTP و HTTPS.
- اطمینان از اینکه درخواستهای احراز هویت شده (Authenticated Requests) باعث پر شدن کشهای مشترک نمیشوند.