Every CVE Search/ Get API key

CVE-2026-107810

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

8.1 HighFix available

Nginx UI is a web user interface for the Nginx web server. From 2.0.0 until 2.5.0, internal/backup/restore.go extracts inner archives before applying the restore_nginx and restore_nginx_ui flags and permits symlinks targeting the live Nginx configuration path. An authenticated user who can create and restore backups can craft a valid backup that places a symlink in the staging tree and then writes a regular file through that link, even when both restore flags are false. This can persistently inject configuration or cause denial of service when the modified files are later consumed. This issue is fixed in version 2.5.0.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
Low
User interaction
None

What an attacker can affect

Confidentiality
None
Integrity
High
Availability
High

Exploit likelihood

0.45%Up 0.1 points since Oct 10, 2026
90%50%10%1%

What each source reports

CVE List Score used 8.1

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

Nginx UI is a web user interface for the Nginx web server. From 2.0.0 until 2.5.0, internal/backup/restore.go extracts inner archives before applying the restore_nginx and restore_nginx_ui flags and permits symlinks targeting the live Nginx configuration path. An authenticated user who can create and restore backups can craft a valid backup that places a symlink in the staging tree and then writes a regular file through that link, even when both restore flags are false. This can persistently inject configuration or cause denial of service when the modified files are later consumed. This issue is fixed in version 2.5.0.

Record
CVE-2026-107810
CVSS 3.1
8.1 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Weakness
CWE-59, CWE-61
Updated
2026-11-02
EUVDEUVD-2026-95894 8.1

Nginx UI is a web user interface for the Nginx web server. From 2.0.0 until 2.5.0, internal/backup/restore.go extracts inner archives before applying the restore_nginx and restore_nginx_ui flags and permits symlinks targeting the live Nginx configuration path. An authenticated user who can create and restore backups can craft a valid backup that places a symlink in the staging tree and then writes a regular file through that link, even when both restore flags are false. This can persistently inject configuration or cause denial of service when the modified files are later consumed. This issue is fixed in version 2.5.0.

Record
EUVD-2026-95894
CVSS 3.1
8.1 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-p8v3-89rh-jxc7 8.1

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

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.

Record
GHSA-p8v3-89rh-jxc7
CVSS 3.1
8.1 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Weakness
CWE-59, CWE-61
Updated
2026-11-02
NVD 8.1

Nginx UI is a web user interface for the Nginx web server. From 2.0.0 until 2.5.0, internal/backup/restore.go extracts inner archives before applying the restore_nginx and restore_nginx_ui flags and permits symlinks targeting the live Nginx configuration path. An authenticated user who can create and restore backups can craft a valid backup that places a symlink in the staging tree and then writes a regular file through that link, even when both restore flags are false. This can persistently inject configuration or cause denial of service when the modified files are later consumed. This issue is fixed in version 2.5.0.

Record
CVE-2026-107810
CVSS 3.1
8.1 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Weakness
CWE-59, CWE-61
Updated
2026-11-02
OSV 8.1

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

Nginx UI is a web user interface for the Nginx web server. From 2.0.0 until 2.5.0, internal/backup/restore.go extracts inner archives before applying the restore_nginx and restore_nginx_ui flags and permits symlinks targeting the live Nginx configuration path. An authenticated user who can create and restore backups can craft a valid backup that places a symlink in the staging tree and then writes a regular file through that link, even when both restore flags are false. This can persistently inject configuration or cause denial of service when the modified files are later consumed. This issue is fixed in version 2.5.0.

Record
CVE-2026-107810
CVSS 3.1
8.1 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Weakness
CWE-59, CWE-61
Updated
2026-11-02
OSVGHSA-p8v3-89rh-jxc7 8.1

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

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.

Record
GHSA-p8v3-89rh-jxc7
CVSS 3.1
8.1 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Weakness
CWE-59, CWE-61
Updated
2026-11-02
OSVGO-2026-6707 No score

Nginx UI: Backup restore follows crafted symlinks into the live Nginx configuration path before restore flags are applied in github.com/0xJacky/Nginx-UI

Nginx UI: Backup restore follows crafted symlinks into the live Nginx configuration path before restore flags are applied in github.com/0xJacky/Nginx-UI

Record
GO-2026-6707
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
github.com/0xJacky/Nginx-UI
Go
1.9.10-0.20250517140552-daee3ac7ade1 up to 1.9.10-0.20260728074146-a467ed652591
1.9.10-0.20260728074146-a467ed652591

History

History
RecordedChangedSources
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-107810 is a high vulnerability (CVSS 8.1) in Nginxui Nginx Ui, published October 9, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.45%, the 38th percentile. Fixed in github.com/0xJacky/Nginx-UI 1.9.10-0.20260728074146-a467ed652591.

References

MoveEnter Open