共計 2921 個字符,預計需要花費 8 分鐘才能閱讀完成。
NGINX 作為目前最廣泛使用的 Web Server 與 Reverse Proxy 之一,在高流量網站與雲端架構中扮演核心角色。然而,也因為其廣泛部署,一旦出現漏洞,影響範圍往往非常巨大。
2026 年披露的多個 NGINX 相關漏洞,主要集中在模組實作問題、記憶體安全(Buffer overflow)、認證處理,以及 TLS / Proxy 機制。這些問題如果未及時修補,可能導致服務崩潰、資訊洩漏,甚至被利用進行攻擊。
漏洞概覽
1. Buffer Overflow 類型
這類漏洞通常與記憶體處理不當有關,攻擊者可透過特製資料觸發。
CVE-2026-27654
發生於ngx_http_dav_module,在處理 WebDAV 請求時可能導致記憶體溢位。CVE-2026-27784 / CVE-2026-32647
發生於ngx_http_mp4_module,與 MP4 檔案解析相關。
類似過去 MP4 模組漏洞,攻擊者可透過惡意影片檔觸發 worker crash 或潛在記憶體破壞。
👉 這類漏洞常見影響:
- NGINX worker crash(DoS)
- 記憶體資料外洩
- 在極端情況下可能導致 RCE
2. NULL Pointer Dereference
- CVE-2026-27651
在使用 CRAM-MD5 或 APOP 認證時,可能觸發 NULL pointer dereference。
👉 影響:
- 服務異常終止(DoS)
- 郵件或認證服務中斷
3. Injection 類漏洞
- CVE-2026-28753
影響auth_http與XCLIENT機制
屬於輸入處理不當導致的 injection 問題
👉 可能影響:
- 偽造請求資訊
- 繞過驗證
- 影響後端服務信任鏈
4. TLS / 安全機制問題
- CVE-2026-28755
OCSP 驗證結果可能被繞過
影響 TLS 憑證驗證流程
👉 風險:
- 使用已被撤銷的憑證仍被信任
- 降低 HTTPS 安全性
5. SSL Upstream Injection(較重要)
- CVE-2026-1642
此漏洞發生在 NGINX 作為 TLS upstream proxy 時,若攻擊者位於中間人位置,可能將 未加密資料注入到回應中。
👉 特點:
- 需要 MITM 條件
- 屬於資料完整性問題
- 影響 proxy 架構
👉 受影響版本:
- 1.1.19 ~ 1.29.6
👉 已修復版本:
- 1.28.3、1.29.7+
修補方式(各發行版)
1. Debian / Ubuntu
apt update
apt install --only-upgrade nginx
2. RHEL / Rocky Linux / AlmaLinux
更新方式:
dnf update nginx
OpenResty 狀態
OpenResty 是基於 NGINX 的延伸版本,整合 Lua 與額外模組。
👉 已修復版本:
- OpenResty 1.29.2.3(Docker 版本是 1.29.2.2)
建議:
openresty -v
若低於該版本,應立即升級。
openresty for docker 更新方式
直接運行整段命令
container_name="openresty"
image=$(docker inspect -f '{{.Config.Image}}' "$container_name")
old_image_id=$(docker inspect -f '{{.Image}}' "$container_name")
pull_output=$(docker pull "$image" 2>&1)
if echo "$pull_output" | grep -qi "up to date"; then
echo -e "$image 已是最新版本,無需更新容器。"
exit 0
fi
declare -A seen_ports
port_args=""
while IFS= read -r line; do
container_port=$(echo "$line" | awk '{print $1}' | cut -d'/' -f1)
if [[ -n "${seen_ports[$container_port]}" ]]; then continue; fi
seen_ports[$container_port]=1
host_port=$(echo "$line" | awk '{print $NF}' | cut -d':' -f2)
if [[ -n "$host_port" && -n "$container_port" ]]; then
port_args="$port_args -p ${host_port}:${container_port}"
fi
done < <(docker port "$container_name")
volumes=$(docker inspect -f '{{range .Mounts}}-v {{.Source}}:{{.Destination}} {{end}}' "$container_name")
envs=$(docker inspect -f '{{range $index, $value := .Config.Env}}-e {{$value}} {{end}}' "$container_name")
restart=$(docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' "$container_name")
restart_arg=""if [["$restart"!="no"&& -n"$restart" ]]; then
restart_arg="--restart=$restart"
fi
network=$(docker inspect -f '{{range $k, $v := .NetworkSettings.Networks}}{{println $k}}{{end}}' "$container_name" | head -n1)
network_arg=""if [[ -n"$network" ]]; then
network_arg="--network=$network"
fi
extra_hosts=$(docker inspect -f '{{range .HostConfig.ExtraHosts}}--add-host={{.}} {{end}}' "$container_name")
user=$(docker inspect -f '{{.Config.User}}' "$container_name")
user_arg=""if [[ -n"$user" ]]; then
user_arg="--user=$user"
fi
docker stop "$container_name"
docker rm "$container_name"
docker run -d --name "$container_name" \
$restart_arg $network_arg $port_args $volumes $envs $extra_hosts $user_arg \
"$image"
echo "$container_name 已更新並重新啟動。"
new_image_id=$(docker inspect -f '{{.Image}}' "$container_name")
if [[ "$old_image_id" != "$new_image_id" ]]; then
docker rmi "$old_image_id" 2>/dev/null || true
fi
探索更多來自 GEBU8F — 阿蒲的網站 的內容
訂閱即可透過電子郵件收到最新文章。
禁止人身攻擊,請理性發言。