NGINX Rift: آسیبپذیری ۱۸ ساله که اجرای کد از راه دور ممکن میکنه
خلاصهٔ کاملتر
تیم depthfirst با استفاده از سیستم تحلیل خودکار داخلیشون، سورسکد NGINX رو آنالیز کردن و پس از شش ساعت اسکن، پنج مشکل امنیتی پیدا کردن. چهار تا از این آسیبپذیریها توسط تیم NGINX تأیید شد که یکیشون بحرانیه: CVE-2026-42945 با امتیاز CVSS 9.2، که یه heap buffer overflow در ماژول ngx_http_rewrite_module هست و از سال ۲۰۰۸ تو کد بوده.
آسیبپذیری دقیقاً کجاست؟ NGINX برای اجرای دایرکتیوهای rewrite و set از یه موتور اسکریپت داخلی استفاده میکنه که با دو مرحله کار میکنه: اول طول حافظه موردنیاز رو حساب میکنه، بعد داده رو کپی میکنه. مشکل اینجاست که وقتی rewrite یه علامت سؤال (?) تو رشته جایگزین داشته باشه، فلگ is_args رو روی موتور اصلی روشن میکنه. این فلگ هرگز ریست نمیشه.
بعد که دایرکتیو set با یه capture group اجرا میشه، مرحله اول (محاسبه طول) با یه زیر-موتور خالی کار میکنه که is_args توش صفره، پس طول رو بدون escape حساب میکنه. اما مرحله دوم (کپی داده) روی موتور اصلی اجرا میشه که is_args=1 داره، بنابراین هر کاراکتر قابل escape رو از یک بایت به سه بایت تبدیل میکنه و خارج از بافر اختصاصیافته مینویسه — این همون heap buffer overflow هست.
یه نمونه ساده از کانفیگ آسیبپذیر اینه:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}اگه مهاجم یه URI حاوی کاراکترهای escapeپذیر مثل + یا & بفرسته، overflow اتفاق میافته. تعداد این کاراکترها کاملاً در اختیار مهاجمه و سایز overflow رو کنترل میکنه.
برای تبدیل این overflow به اجرای کد، محققان ساختار ngx_pool_t (که NGINX برای مدیریت حافظه ازش استفاده میکنه) رو هدف قرار دادن. هدف اصلی، overwrite کردن فیلد cleanup این ساختاره که به یه لیست از تابعهای callback اشاره میکنه و وقتی pool از بین میره اجرا میشن. با جایگزین کردن این پوینتر با یه ساختار جعلی، میشه تابع system از libc رو با یه دستور دلخواه صدا زد.
چون بایتهای null از طریق URI قابل تزریق نیستن، محققان بدنه درخواستهای POST رو برای اسپری کردن ساختارهای جعلی استفاده کردن (چون POST body بدون فیلتر پارس میشه). معماری multi-process در NGINX هم کمک میکنه: وقتی یه worker crash میکنه، master دقیقاً یه نسخه جدید با همون layout حافظه میسازه و این اکسپلویت رو قابل تکرار میکنه. PoC کامل روی GitHub منتشر شده.
نسخههای آسیبپذیر شامل NGINX Open Source از ۰.۶.۲۷ تا ۱.۳۰.۰، NGINX Plus از R32 تا R36، و چندین محصول F5 از جمله NGINX App Protect WAF، NGINX Ingress Controller و NGINX Gateway Fabric میشه. پچ رسمی در ۱۳ می ۲۰۲۶ توسط F5 منتشر شد.
نکات کلیدی:
- باگ از ۲۰۰۸ وجود داشته و همه نسخههای NGINX تا ۱.۳۰.۰ رو تحت تأثیر میذاره
- دایرکتیوهای rewrite (با ? در رشته جایگزین) و set باهم این آسیبپذیری رو فعال میکنن
- مهاجم میتونه از راه دور کد دلخواه اجرا کنه (RCE)
- سه آسیبپذیری دیگه هم گزارش شد: یه crash با تخصیص ~۱ ترابایت حافظه، یه use-after-free در ماژول SSL، و یه out-of-bounds read در ماژول charset
- بهروزرسانی فوری به نسخههای پچشده توصیه میشه




