Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs
## Summary Nginx-UI v2.4.3 stores the API JWT in a browser cookie named `token` and the `AuthRequired` middleware accepts that cookie as an authentication source. Because management endpoints are protected by `AuthRequired` and do not enforce a universal CSRF token or Origin/Referer check, a remote attacker can induce a logged-in administrator to submit cross-site state-changing requests. The attacker does not need to read the cross-origin response; the browser-sent cookie is enough to authenticate the request. ## Details The root cause is a trust-boundary failure between browser-managed cookies and API bearer-token authentication. In `app/src/pinia/moudule/user.ts:25-35`, the front end writes the JWT to a `token` cookie when the token changes. In `internal/middleware/middleware.go:16-36`, `getToken` first checks the `Authorization` header and `token` query parameter, then falls back to `c.Cookie("token")`. That fallback causes browser-initiated cross-site requests to carry a valid API credential automatically. The route group in `router/routers.go:87-110` applies `middleware.AuthRequired()` to many management modules, including `config.InitRouter`, `nginx.InitRouter`, `settings.InitRouter`, and backup-related handlers. For accounts without OTP/Passkey, `RequireSecureSession` does not provide a universal second factor for all state-changing operations. A representative sink is `api/config/add.go:68-78`, where an authenticated request writes Nginx configuration with `os.WriteF
- Products
- github.com/0xJacky/Nginx-UI
- Affected versions
- Not specified
- Fixed versions
- 1.9.10-0.20260728074433-a3999bd78a3b
- CVEs
- CVE-2026-107809
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 31 Oct 2026, 08:44 UTC · Revision 1
Source evidence
Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs
core-osv · Original sourcePublished 9 Oct 2026, 17:08 UTC
## Summary Nginx-UI v2.4.3 stores the API JWT in a browser cookie named `token` and the `AuthRequired` middleware accepts that cookie as an authentication source. Because management endpoints are protected by `AuthRequired` and do not enforce a universal CSRF token or Origin/Referer check, a remote attacker can induce a logged-in administrator to submit cross-site state-changing requests. The attacker does not need to read the cross-origin response; the browser-sent cookie is enough to authenticate the request. ## Details The root cause is a trust-boundary failure between browser-managed cookies and API bearer-token authentication. In `app/src/pinia/moudule/user.ts:25-35`, the front end writes the JWT to a `token` cookie when the token changes. In `internal/middleware/middleware.go:16-36`, `getToken` first checks the `Authorization` header and `token` query parameter, then falls back to `c.Cookie("token")`. That fallback causes browser-initiated cross-site requests to carry a valid API credential automatically. The route group in `router/routers.go:87-110` applies `middleware.AuthRequired()` to many management modules, including `config.InitRouter`, `nginx.InitRouter`, `settings.InitRouter`, and backup-related handlers. For accounts without OTP/Passkey, `RequireSecureSession` does not provide a universal second factor for all state-changing operations. A representative sink is `api/config/add.go:68-78`, where an authenticated request writes Nginx configuration with `os.WriteF
osv:GHSA-33rr-wq23-g6gg
github.com/0xJacky/Nginx-UI
Fixed versions: 1.9.10-0.20260728074433-a3999bd78a3b
Complete source record
{
"id": "d730ee4476aa68a50acc500edb45de333b1de2cdf26d763d252fdc116ed00896",
"url": "https://osv.dev/vulnerability/GHSA-33rr-wq23-g6gg",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs",
"summary": "## Summary Nginx-UI v2.4.3 stores the API JWT in a browser cookie named `token` and the `AuthRequired` middleware accepts that cookie as an authentication source. Because management endpoints are protected by `AuthRequired` and do not enforce a universal CSRF token or Origin/Referer check, a remote attacker can induce a logged-in administrator to submit cross-site state-changing requests. The attacker does not need to read the cross-origin response; the browser-sent cookie is enough to authenticate the request. ## Details The root cause is a trust-boundary failure between browser-managed cookies and API bearer-token authentication. In `app/src/pinia/moudule/user.ts:25-35`, the front end writes the JWT to a `token` cookie when the token changes. In `internal/middleware/middleware.go:16-36`, `getToken` first checks the `Authorization` header and `token` query parameter, then falls back to `c.Cookie(\"token\")`. That fallback causes browser-initiated cross-site requests to carry a valid API credential automatically. The route group in `router/routers.go:87-110` applies `middleware.AuthRequired()` to many management modules, including `config.InitRouter`, `nginx.InitRouter`, `settings.InitRouter`, and backup-related handlers. For accounts without OTP/Passkey, `RequireSecureSession` does not provide a universal second factor for all state-changing operations. A representative sink is `api/config/add.go:68-78`, where an authenticated request writes Nginx configuration with `os.WriteF",
"evidence": "osv:GHSA-33rr-wq23-g6gg",
"products": [
{
"name": {
"value": "github.com/0xJacky/Nginx-UI",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.9.10-0.20260728074433-a3999bd78a3b",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "high",
"structured": {
"id": "GHSA-33rr-wq23-g6gg",
"aliases": [
"CVE-2026-107809",
"GHSA-33rr-wq23-g6gg",
"GO-2026-6703"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H"
}
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.9.10-0.20250517140552-daee3ac7ade1"
},
{
"fixed": "1.9.10-0.20260728074433-a3999bd78a3b"
}
]
}
],
"package": {
"name": "github.com/0xJacky/Nginx-UI",
"purl": "pkg:golang/github.com/0xJacky/Nginx-UI",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-33rr-wq23-g6gg/GHSA-33rr-wq23-g6gg.json"
}
}
],
"modified": "2026-10-19T21:41:07.284327902Z",
"provider": "osv",
"references": [
"https://github.com/0xJacky/nginx-ui/security/advisories/GHSA-33rr-wq23-g6gg",
"https://github.com/0xJacky/nginx-ui/commit/a3999bd78a3b97ab22e6b5e9fd478ac57598a954",
"https://github.com/0xJacky/nginx-ui",
"https://github.com/0xJacky/nginx-ui/releases/tag/v2.5.0"
],
"provider_metadata": {
"cwe_ids": [
"CWE-352"
],
"severity": "HIGH",
"github_reviewed": true,
"nvd_published_at": null,
"github_reviewed_at": "2026-10-09T17:08:10Z"
}
},
"related_cves": [
{
"value": "CVE-2026-107809",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/database_specific/severity"
},
"source_id": "core-osv",
"document_id": 376776,
"published_at": "2026-10-09T17:08:10+00:00"
}Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs in github.com/0xJacky/Nginx-UI
core-osv · Original sourcePublished 19 Oct 2026, 21:08 UTC
Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs in github.com/0xJacky/Nginx-UI
osv:GO-2026-6703
github.com/0xJacky/Nginx-UI
Fixed versions: 1.9.10-0.20260728074433-a3999bd78a3b
Complete source record
{
"id": "a5dd59f0089f707ff65fe825d77e13be5b81c4b9c6530377f94fbeb232a800e9",
"url": "https://osv.dev/vulnerability/GO-2026-6703",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs in github.com/0xJacky/Nginx-UI",
"summary": "Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs in github.com/0xJacky/Nginx-UI",
"evidence": "osv:GO-2026-6703",
"products": [
{
"name": {
"value": "github.com/0xJacky/Nginx-UI",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.9.10-0.20260728074433-a3999bd78a3b",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "unknown",
"structured": {
"id": "GO-2026-6703",
"aliases": [
"CVE-2026-107809",
"GHSA-33rr-wq23-g6gg",
"GO-2026-6703"
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.9.10-0.20250517140552-daee3ac7ade1"
},
{
"fixed": "1.9.10-0.20260728074433-a3999bd78a3b"
}
]
}
],
"package": {
"name": "github.com/0xJacky/Nginx-UI",
"purl": "pkg:golang/github.com/0xJacky/Nginx-UI",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://vuln.go.dev/ID/GO-2026-6703.json"
},
"ecosystem_specific": {}
}
],
"modified": "2026-10-19T21:31:52.274284585Z",
"provider": "osv",
"references": [
"https://github.com/0xJacky/nginx-ui/security/advisories/GHSA-33rr-wq23-g6gg",
"https://github.com/0xJacky/nginx-ui/commit/a3999bd78a3b97ab22e6b5e9fd478ac57598a954",
"https://github.com/0xJacky/nginx-ui/releases/tag/v2.5.0"
],
"provider_metadata": {
"url": "https://pkg.go.dev/vuln/GO-2026-6703",
"review_status": "UNREVIEWED"
}
},
"related_cves": [
{
"value": "CVE-2026-107809",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": null
},
"source_id": "core-osv",
"document_id": 376706,
"published_at": "2026-10-19T21:08:26+00:00"
}