
Static config scanner जो nginx कॉन्फ़िगरेशन को फ़्लैग करता है जो complex_value two-pass capture-clobbering bug (regex map + regex capture → heap overflow / info leak) के लिए असुरक्षित हैं।
एक read-only स्टैटिक स्कैनर जो उन nginx कॉन्फ़िगरेशन को चिह्नित करता है जो
complex_value two-pass capture-clobbering बग वर्ग के प्रति संवेदनशील हैं (F5/nginx SIRT सलाहकार,
जुलाई 2026)। यह आपके कॉन्फ़िगरेशन को पार्स करता है और संवेदनशील पैटर्न को
कारण और स्थान के साथ रिपोर्ट करता है। यह किसी भी चीज़ का शोषण नहीं करता और चल रहे
सर्वर को स्पर्श नहीं करता।
एकल फ़ाइल, केवल मानक लाइब्रेरी, Python 3.6+।
भेद्यता का पूरा विवरण: https://cyberstan.co.uk/nginx-rce/
nginx कई निर्देश मानों को दो पास में बनाता है। एक LEN पास लंबाई मापता है
और एक बफ़र आवंटित करता है, फिर एक VALUE पास उसमें लिखता है। Regex कैप्चर ($1
से $9, या नामित (?P<name>...)) प्रति-अनुरोध साझा स्थिति से पढ़े जाते हैं। एक
map जिसकी मिलान कुंजी एक रेगुलर एक्सप्रेशन है, उसके वेरिएबल का मूल्यांकन होते ही एक नया PCRE मिलान चलाता है, और वह मिलान साझा कैप्चर स्थिति को अधिलेखित कर देता है।
यदि किसी कैप्चर को LEN पास में मापा जाता है और फिर VALUE पास उस कैप्चर को फिर से लिखने से पहले एक regex map चलता है, तो दोनों पास असहमत हो जाते हैं:
दोनों दिशाएँ दूरस्थ रूप से ट्रिगर करने योग्य हैं जब map इनपुट
हमलावर-प्रभावित हो ($request_body, $http_*, $arg_*, $uri,
$ssl_preread_server_name, इत्यादि)।
स्कैनर एक location या server को चिह्नित करता है जब ये सभी एक ही two-pass बफ़र में, शोषणकारी क्रम में आते हैं:
location ~, server_name ~, rewrite,
if (... ~ ...), या कैप्चर समूह वाला एक regex map।~ या ~* regex मिलान कुंजी वाला एक map (http या stream),
जिसे उसके आउटपुट वेरिएबल द्वारा संदर्भित किया गया हो।return, set, add_header, proxy_method,
proxy_pass, rewrite, index, और अन्य): दोनों refs एक ही मान में।proxy_set_header, proxy_set_body,
fastcgi_param, scgi_param, uwsgi_param, grpc_set_header): ये
पूरे परिवार के लिए प्रति-अनुरोध एक बफ़र बनाते हैं, इसलिए दोनों refs
एक ही location में अलग-अलग निर्देशों में हो सकते हैं।# scan a single config (follows include directives by default)
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf
# scan a directory (uses nginx.conf if present, else all *.conf)
python3 nginx_capture_clobber_scan.py /etc/nginx/
# scan several roots
python3 nginx_capture_clobber_scan.py site-a.conf site-b.conf
# machine-readable output
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf --json
# do not expand include directives
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf --no-includes
| विकल्प | प्रभाव |
|---|---|
--json | टेक्स्ट के बजाय JSON रिपोर्ट उत्सर्जित करें। |
--no-includes | include निर्देशों का पालन न करें। |
| कोड | अर्थ |
|---|---|
0 | कोई भेद्य कॉन्फ़िगरेशन नहीं मिला। |
1 | कम से कम एक भेद्य कॉन्फ़िगरेशन मिला। |
2 | उपयोग त्रुटि (कोई पथ नहीं दिया गया, या कोई नहीं मिला)। |
CI में उपयोग करने योग्य, क्योंकि भेद्य कॉन्फ़िगरेशन गैर-शून्य के साथ बाहर निकलता है:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf || echo "review needed"
टेक्स्ट मोड प्रत्येक फाइंडिंग के लिए प्रिंट करता है: फ़ाइल और पंक्ति, संलग्न स्कोप, सिंक
डायरेक्टिव, शामिल कैप्चर और मैप वेरिएबल, ट्रिगर करने वाला मैप, और
एक-पंक्ति का कारण। एक साफ़ किया गया अनुभाग सुरक्षित-क्रम सहअस्तित्वों को सूचीबद्ध करता है। --json
उत्पन्न करता है:
{
"vulnerable": true,
"findings": [
{
"file": "/etc/nginx/conf.d/api.conf",
"line": 12,
"scope": "location ~ ^/api/(.+)$",
"directive": "proxy (family buffer)",
"captures": ["$1"],
"map_vars": ["$is_bot"],
"triggers": ["$is_bot <- regex-map on $http_user_agent [nginx.conf:30]"],
"reason": "..."
}
],
"cleared_safe_order": [],
"regex_maps": [],
"missing_includes": []
}
ngx_http_script_check_length()) जोड़ता है जो VALUE पास को आवंटित बफ़र से आगे लिखने से रोकता है, और लौटाई गई स्ट्रिंग की लंबाई LEN-पास माप के बजाय वास्तव में लिखे गए बाइट्स से गणना करता है, जिससे ओवरफ़्लो और सूचना-लीक दोनों दिशाएँ बंद हो जाती हैं।map वेरिएबल को उसी location या बफ़र में संदर्भित न करें जहाँ
$1 से $9 या नामित-कैप्चर संदर्भ हो।(?P<name>...) समूह को कई regex maps में दोबारा उपयोग न करें।proxy_set_header या
fastcgi_param परिवार से बाहर रखें।set किए गए
वेरिएबल्स द्वारा उत्पन्न मानों को हल नहीं कर सकता।include लक्ष्य (उदाहरण के लिए ऐसे निरपेक्ष पथ जो स्थानीय रूप से मौजूद नहीं हैं)
missing_includes के अंतर्गत रिपोर्ट किए जाते हैं, चुपचाप छोड़े नहीं जाते। पूर्ण कवरेज के लिए
इसे उस होस्ट पर चलाएँ जहाँ कॉन्फ़िग हल होता है।भेद्यता लेख और शोषण श्रृंखला: https://cyberstan.co.uk/nginx-rce/