Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to Omnivore instance
-
DeliveryRegister webhook pointing to internal or metadata URL via setWebhook mutation
-
ExploitSubscribe webhook to a high-frequency event type
-
ExecutionTrigger subscribed event (e.g., save article)
-
PersistServer issues blind axios HTTP request to internal target
-
ImpactProbe internal network reachability or harvest cloud IAM metadata from server logs
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Credential Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | A valid authenticated session on the Omnivore instance is required (PR:L per CVSS 4.0 vector); no administrative role is needed-the setWebhook GraphQL mutation is available to all registered users. The webhook feature must not be disabled at the application or infrastructure level. SSRF impact is substantially amplified when the Omnivore API server runs in a cloud environment with AWS IMDSv1 (or equivalent) accessible at link-local addresses, or when the server has network routes to internal services (databases, admin panels, internal APIs). The attack is blind: callWebhook discards the HTTP response and logs only success or the axios error message, so direct response-body exfiltration through the API is not possible. Exploitation is limited by: requirement for account registration, the stored-SSRF trigger model (impact depends on event frequency), blind response behavior preventing real-time read-back, and network egress controls that block private or link-local IP ranges. |
| Impact | The CVSS 4.0 score of 5.3 (Medium) with PR:L correctly reflects the authentication prerequisite and the blind response behavior (VC:N). However, the provided vector scores SC:N (no subsequent-system confidentiality impact), which underweights real-world cloud risk: in AWS environments with IMDSv1 enabled, each webhook-triggered axios request to 169.254.169.254 causes the metadata service to return IAM credential material that callWebhook writes to server logs on error-a meaningful confidentiality exposure on the subsequent system. The stored, event-driven nature of the SSRF means an attacker registers once and harvests on every future event trigger, making it persistent and automatable. No EPSS data was provided; the absence of a KEV listing and no confirmed public exploit suggest no observed mass exploitation. The authentication requirement (PR:L) is the primary limiting factor: exploitation requires a valid registered account. The blind response prevents direct API-path data exfiltration, which significantly constrains opportunistic attackers but does not protect against well-positioned insiders or compromised credentials in multi-tenant self-hosted deployments. |
| Exploit ScenarioDerived | An authenticated Omnivore user registers a webhook URL of http://169.254.169.254/latest/meta-data/iam/security-credentials/ and subscribes it to a high-frequency event type such as article save. Each time the user or any automated import saves an article, callWebhook issues an axios POST to the AWS IMDSv1 metadata endpoint; in IMDSv1-enabled environments the response contains IAM role credentials in plaintext, which callWebhook writes to the server error log on non-2xx status. No public exploit code has been identified at time of analysis, but the attack requires only a registered account and standard webhook API access. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 20, 2026
Blind Server-Side Request Forgery in Omnivore's webhook registration flow allows any authenticated user to coerce the application server into issuing repeated HTTP requests to arbitrary internal endpoints, including cloud instance metadata services. The flaw affects all Omnivore API server deployments (CPE: cpe:2.3:a:omnivore-app:omnivore:*:*:*:*:*:*:*:*) and is rooted in setWebhookResolver accepting and persisting caller-supplied URLs with no address validation before callWebhook later executes them via axios. No public exploit identified at time of analysis, and no CISA KEV listing exists; a patch commit is available upstream.
RemediationAI
The primary fix is upstream commit c4d7d8562e6b9aabb1d8e4dabca268e314baa43a (https://github.com/omnivore-app/omnivore/commit/c4d7d8562e6b9aabb1d8e4dabca268e314baa43a), which adds validateUrl() in setWebhookResolver to reject private and local IP targets at webhook registration time. Operators should rebuild or redeploy from a commit at or after this hash; a specific patched release version tag was not independently confirmed from available data, so verify against the upstream repository before deploying. As a compensating control pending patch application, restrict outbound HTTP egress from the Omnivore API server at the network layer using firewall rules blocking RFC-1918 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), loopback (127.0.0.0/8), and link-local (169.254.0.0/16); this prevents webhook-triggered requests from reaching internal infrastructure but does not prevent storage of malicious URLs. In AWS environments, enabling IMDSv2 (token-required mode) removes the unauthenticated metadata path at 169.254.169.254 and is strongly recommended regardless of patch status. VulnCheck advisory: https://www.vulncheck.com/advisories/omnivore-stored-server-side-request-forgery-via-the-setwebhook-mutation
Affected VersionsENISA
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Omnivore is an open-source, self-hostable read-it-later application with a GraphQL API backend written in TypeScript/Node.js. CWE-918 (Server-Side Request Forgery) describes the root cause: the server makes outbound network requests based on attacker-controlled input. Specifically, setWebhookResolver (packages/api/src/resolvers/webhooks/index.ts:L108) persists the caller-supplied url field directly to the database without importing or invoking any address-validation helper. When a subscribed event fires, callWebhook (packages/api/src/jobs/call_webhook.ts:L36) constructs an axios.request using the stored URL, the stored HTTP method, the stored Content-Type, and a JSON body containing live event data. Because axios resolves hostnames and follows redirects at request time, the server can be directed to RFC-1918 private addresses, loopback (127.0.0.1), and link-local cloud metadata endpoints such as 169.254.169.254 (AWS IMDSv1). The response is discarded by callWebhook-only a success line or axios error is written to the server log-making this a stored, event-triggered, blind SSRF. The patch (commit c4d7d8562e6b9aabb1d8e4dabca268e314baa43a) imports validateUrl from the existing create_page_save_request service and calls it in setWebhookResolver before persisting the URL, blocking private and local IP ranges at registration time and returning BAD_REQUEST on violation.
Know when Omnivore 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:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N
Network GraphQL mutation requires low privileges (AV:N, PR:L); scope changes to internal systems reachable via SSRF (S:C); blind response constrains but does not eliminate confidentiality and integrity impact on subsequent systems.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
The setWebhookResolver in packages/api/src/resolvers/webhooks/index.ts stores the caller-supplied url without any address validation, and the file imports no validation helper. When a subscribed event fires, callWebhook in packages/api/src/jobs/call_webhook.ts issues axios.request with that url, the method and Content-Type recorded on the webhook, and a JSON body carrying the event data, so an authenticated user can make the server send repeated attacker-shaped requests to internal endpoints, including link-local metadata addresses. The request is blind: callWebhook discards the result and writes only a success line or the axios error to the server log, so the response is not returned through the API.
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
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
Authentication bypass in the Omnivore API (packages/api) before commit abf53d6 lets a remote unauthenticated attacker im
Server-side request forgery in Omnivore's scanFeedsResolver GraphQL endpoint allows authenticated users to direct the AP
EUVD-2026-63256
GHSA-w562-g8x6-3cj6
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB