Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain Postgres database read access
-
ExploitQuery User.googleTokens column
-
ExecutionExtract plaintext OAuth refresh tokens
-
ImpactAccess all users' Search Console data
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V14 - Data Protection Encrypted storage of sensitive data
|
| Exploitation Conditions | Exploitation requires read access to the application's backend Postgres database (for example a compromised host or an exposed/misconfigured Postgres instance); the attacker then reads unencrypted Google access and refresh tokens from the User.googleTokens column in any crawlseo deployment before 0.2.5. Limiting factors: this is not exploitable over the network against the app itself - it presupposes database-level access (reflected as AV:L/PR:H), it affects only versions before 0.2.5, and tokens that users have proactively revoked via the Account page's 'Disconnect Google' action are cleared. After upgrading, existing plaintext tokens are encrypted at their next refresh or via the bundled scripts/encrypt-google-tokens.ts migration; the vendor's encryption-at-rest change is the only complete fix. |
| Impact | This is a post-compromise confidentiality exposure (CWE-312, cleartext storage), not a remotely triggerable flaw against the running application. The CVSS 4.0 vector (AV:L/AC:L/AT:N/PR:H/UI:N, VC:H) correctly models that exploitation requires read access to the backend Postgres database - PR:H and AV:L reflect that the attacker must already hold database-level access, whether through a prior compromise or a misconfigured/exposed Postgres instance as the description states. Severity is medium (6.7) and the vuln.today Decision label is 'this_month', not act_now or emergency, so this should be scheduled, not treated as an incident. EPSS is not provided in the input and there is no CISA KEV listing, consistent with no evidence of mass exploitation. The input does include a public gist and the fix commit as references, so a public PoC reference exists; it is not verified as working exploit code. The main risk amplifier is impact rather than access: the leaked data is long-lived Google OAuth refresh tokens granting indefinite, unauthenticated access to every registered user's Search Console data, so a single database read compromises all users at once. Net assessment: a real but conditional, defense-in-depth issue - meaningful for anyone who may have exposed their Postgres instance, low urgency for well-isolated deployments. |
| Exploit ScenarioDerived | An attacker who obtains read access to crawlseo's Postgres database - via an exposed/misconfigured instance or a prior host compromise - queries the User.googleTokens column and recovers plaintext Google OAuth access and refresh tokens. Because the refresh tokens are long-lived, the attacker gains indefinite, unauthenticated access to all registered users' Google Search Console data. A public PoC reference (a gist) is linked in the input but is not verified as working exploit code. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Anyone able to read crawlseo's backing Postgres database before version 0.2.5 can pull every registered user's Google access and refresh tokens in plaintext from the User.googleTokens column, then use the long-lived refresh tokens to retain indefinite access to those users' Google Search Console data. Version 0.2.5 closes the exposure by encrypting Google tokens at rest with the same key used for API keys (NEXTAUTH_SECRET or AUTH_SECRET). The weakness is a post-compromise confidentiality issue (CWE-312) that presupposes database-level access rather than a remotely triggerable flaw in the running app; no public exploit has been identified at time of analysis.
RemediationAI
Upgrade to crawlseo 0.2.5: pull ghcr.io/crawlseo/crawlseo:0.2.5 (or :latest) for Docker deployments, or from a git checkout run git pull followed by npm ci and a rebuild; the release notes state no database migration is required. Existing plaintext rows are encrypted automatically at each token's next refresh, and operators who want it done immediately can run npx tsx scripts/encrypt-google-tokens.ts for a dry-run count and then npx tsx scripts/encrypt-google-tokens.ts --apply, which requires the same NEXTAUTH_SECRET/AUTH_SECRET used to encrypt API keys. Encryption at rest is the vendor's only complete fix, and it does not help tokens already lifted from a leaked database - for those, the affected user must use the Account page's 'Disconnect Google' action, which revokes the token at Google, clears the stored Google tokens and signs the account out on every device while leaving sites and data intact. Because the prerequisite is database read access, keep the Postgres instance off untrusted networks and on a dedicated credential, per the vendor's guidance on setting your own POSTGRES_PASSWORD and publishing only the app port on loopback.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
crawlseo is a self-hosted Next.js/Node application that syncs Google Search Console data and crawls, backed by PostgreSQL (configured via POSTGRES_PASSWORD) and authenticating users through Google OAuth. It persisted the resulting OAuth access and refresh tokens verbatim in the User.googleTokens column, which is the classic CWE-312 cleartext storage of sensitive information pattern: the database is the system of record for secrets that should only ever exist in a protected, keyed form. OAuth 2.0 refresh tokens are long-lived bearer credentials, so a single read of that column yields durable, unauthenticated-of-the-app access to Google APIs on behalf of every user - integrity and availability of the crawlseo instance itself are unaffected, which is why the assessed CVSS:3.1 vector is AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N (local, high-privilege prerequisite, confidentiality-only) and the reported CVSS:4.0 score is 6.7. The CPE cpe:2.3:a:crawlseo:crawlseo:*:*:*:*:*:*:*:* reflects that every release prior to 0.2.5 is in scope. The fix in 0.2.5 encrypts the stored tokens with the same symmetric key used for API keys, meaning NEXTAUTH_SECRET/AUTH_SECRET becomes the crown-jewel secret for the deployment and must be kept stable and out of the database's blast radius.
Know when Crawlseo 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
CVSS:4.0/AV:L/AC:L/AT:N/PR:H/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Requires read access to the backend Postgres database, so AV:L and PR:H; disclosure of long-lived OAuth tokens gives C:H with no integrity or availability impact.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
crawlseo before version 0.2.5 contains a cleartext storage vulnerability that allows attackers with database read access to obtain Google OAuth access and refresh tokens stored unencrypted in the User.googleTokens column. Attackers can read the plaintext long-lived refresh tokens from a compromised or exposed Postgres database to gain indefinite, unauthenticated access to all registered users' Google Search Console data.
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
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
EUVD-2026-108165
GHSA-qcj9-c87v-pg2g
NVD
CVE.org
EPSS
Exploit-DB