Vulnerability GHSA-p8v3-89rh-jxc7

High Risk
HIGH RISK
CVSS Score: 8.1
Score Range: 7.0–8.9
High severity vulnerabilities (CVSS 7.0–8.9). Serious vulnerabilities that should be prioritized soon after critical fixes.
3 hours ago
October 09, 2026 at 05:07 PM UTC
Nginx UI: Backup restore follows crafted symlinks into the live Nginx configuration path before restore flags are applied
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074146-a467ed652591
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074146-a467ed652591

Summary

Nginx UI: Backup restore follows crafted symlinks into the live Nginx configuration path before restore flags are applied

Details

Summary

An authenticated user who can create and restore a backup can craft a valid backup archive that causes the restore staging process to write attacker-controlled files into the live Nginx configuration path even when both restore_nginx and restore_nginx_ui are set to false.

Details

The restore flow always extracts the outer archive, verifies the manifest, decrypts nginx-ui.zip and nginx.zip, and extracts both inner archives before it decides whether RestoreNginx or RestoreNginxUI should be applied. The zip extractor explicitly allows absolute symlinks when the link target is under nginx.GetConfPath() or nginx.GetModulesPath(). Later regular-file entries are then created with os.OpenFile() on the symlinked path, which follows the symlink and writes into the live path.

Relevant code paths:

This means the restore trust boundary is broken during extraction. A restore request that explicitly opted out of restoring either Nginx or Nginx UI can still modify the live Nginx configuration tree during staging.

PoC

I verified this locally in an isolated environment with a temporary package-level harness that exercised the real Backup() and Restore() implementations.

What the executed test did:

  1. Created a temporary app.ini, database file, and a temporary live Nginx config directory.
  2. Called the real Backup() implementation to obtain a valid backup archive plus AES key/IV.
  3. Extracted the outer backup, decrypted nginx.zip, replaced it with a crafted zip containing:
    • a symlink entry link -> <live nginx conf dir>
    • a later regular file entry link/poc.conf
  4. Recomputed manifest.json size/hash values for the modified encrypted nginx.zip and re-signed manifest.sig with the expected signing key derived from the AES key.
  5. Repacked the outer archive and called the real Restore() implementation with:
    • RestoreNginx: false
    • RestoreNginxUI: false
  6. Verified that <live nginx conf dir>/poc.conf was created anyway.

Observed result from the actual local verification:

  • The crafted restore completed successfully with both restore flags set to false.
  • The asserted sink was the existence and content of the live-path file written during restore staging.

Impact

Any deployment that allows an authenticated user to create and restore backups is affected. A crafted restore archive can modify the live Nginx configuration path before either restore toggle is honored. This can lead to persistent configuration injection, denial of service on a later reload, or other follow-on impact depending on what files the deployment later consumes from the modified path.

Related Vulnerabilities

Other vulnerabilities affecting the same packages

High Risk
3 hours ago
Nginx UI: Self-upgrade runs an unsigned binary verified only by a same-origin digest → RCE via a compromised mirror or MITM
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728114330-580585516dd8 GHSA-662p-52hx-cmh2
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728114330-580585516dd8 GHSA-662p-52hx-cmh2
High Risk
3 hours ago
Nginx UI: Authentication bypass: password login does not enforce a passkey-only second factor (2FA bypass)
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074558-95cd21b70814 GHSA-45gv-9wjv-xh7p
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074558-95cd21b70814 GHSA-45gv-9wjv-xh7p
High Risk
3 hours ago
Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074433-a3999bd78a3b GHSA-33rr-wq23-g6gg
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074433-a3999bd78a3b GHSA-33rr-wq23-g6gg
High Risk
3 hours ago
Nginx UI: Incomplete fix of CVE-2026-84315 - the api/cluster router was not - wrapped in RequireSecureSession, so those sensitive mutations run without OTP step-up
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074433-a3999bd78a3b GHSA-h246-wpgf-vmq5
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728074433-a3999bd78a3b GHSA-h246-wpgf-vmq5
High Risk
3 hours ago
0xJacky/nginx-ui /api/nodes Leaks Cluster Node Tokens and Allows Cross-Node Impersonation as initUser
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728091109-0ecbd106c37b GHSA-32gc-wf3m-78w9
>=1.9.10-0.20250517140552-daee3ac7ade1 <1.9.10-0.20260728091109-0ecbd106c37b GHSA-32gc-wf3m-78w9
View all vulnerabilities for these packages

Timeline

Published
3 hours ago
October 09, 2026 at 05:07 PM UTC
Last Modified
3 hours ago
October 09, 2026 at 05:15 PM UTC