Skip to main content

crawlseo EUVDEUVD-2026-108165

| CVE-2026-115400 MEDIUM
Cleartext Storage of Sensitive Information (CWE-312)
2026-10-22 VulnCheck GHSA-qcj9-c87v-pg2g
6.7
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain Postgres database read access
  2. Exploit
    Query User.googleTokens column
  3. Execution
    Extract plaintext OAuth refresh tokens
  4. Impact
    Access 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

crawlseo 0.1.0 <0.2.5

Affected Packages

euvd crawlseo fix: 0.2.5

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

Vendor (VulnCheck) PRIMARY 6.7 MEDIUM
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
vuln.today AI 4.4 MEDIUM

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.

3.1 AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N
4.0 AV:L/AC:L/AT:N/PR:H/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Local
Attack Complexity
Low
Attack Requirements
None
Privileges Required
High
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

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

EPSS Score
0.1%
Top 100% exploitable
Prevalence
Rare
niche self-hosted open-source SEO tool, tiny deployment footprint
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy