Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessHost page with XSS payload in element id
-
DeliveryAuthenticated user adds/monitors the URL
-
ExploitScraper stores malicious id in selector data
-
ExecutionUser opens Visual Selector, innerHTML renders payload
-
ImpactScript executes in user's browser context
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires: (1) an authenticated changedetection.io user (PR:L) who adds or monitors an attacker-controlled/compromised web page; (2) that page containing an HTML element whose |
| Impact | This is a genuinely low-priority issue despite a public exploit, and the signals largely agree. The vendor CVSS 4.0 score is only 2.0 with vector AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N - network reachable but requiring an authenticated user (PR:L) and passive user interaction (UI:P), with only limited integrity impact and no confidentiality or availability impact. The XSS is DOM-based and fires in the Visual Selector when it renders a scraped element id via innerHTML, so the malicious payload originates from the attacker-controlled watched web page, not from a direct request to changedetection.io - this indirection is why complexity/impact stay low. POC availability (VulDB, GitHub) and the CVSS 4.0 exploit-maturity flag E:P (proof-of-concept) are confirmed, but there is no EPSS score, no CISA KEV listing, and no evidence of active exploitation; POC existence must not be conflated with in-the-wild use. The patch is confirmed (commit aac6fcfa, PR #4282, release 0.60.1), replacing innerHTML with textContent and stripping quote/angle-bracket characters from xpath ids. Net: real but minor, self-inflicted-leaning XSS bounded by authentication and required interaction - routine patching priority, not urgent. |
| Exploit ScenarioDerived | An attacker sets up (or compromises) a web page containing an element whose id embeds an XSS payload such as |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 22, 2026
Stored cross-site scripting in changedetection.io up to and including 0.55.8 lets a malicious or compromised monitored web page inject markup that is rendered in the Visual Selector UI, because the selector string is written into the DOM with innerHTML rather than as text. Exploitation requires an authenticated user who has added a page they do not control, plus that user opening the Visual Selector for the affected watch, so impact is confined to the victim's own browser session and is limited to integrity of the displayed page. Publicly available exploit code exists, but the issue is not confirmed actively exploited (CISA KEV) and independent assessment rates it low priority given the authentication and user-interaction prerequisites; upgrading to 0.60.1 resolves it.
RemediationAI
Upgrade changedetection.io to 0.60.1 or later, which is the vendor-released patch for this issue (release notes at https://github.com/dgtlmoon/changedetection.io/releases/tag/0.60.1). The specific fix is commit aac6fcfa594f17511b8ff73e5eaa4f6c33899de0, merged via pull request https://github.com/dgtlmoon/changedetection.io/pull/4282; operators running from source can apply that commit directly if they cannot move to the tagged release. The patch replaces the innerHTML assignment in changedetectionio/static/js/visual-selector.js with textContent and adds a guard rejecting element ids containing double quotes or angle brackets in the id-shortcut branch of xpath_element_scraper.js, so no configuration change is needed after upgrading. If upgrading immediately is not possible, the practical compensating control is to stop using the Visual Selector against pages you do not fully control - untrusted or third-party watches are the injection vector, and removing or disabling those watches removes the exposure; the trade-off is loss of the point-and-click selector feature for those sites, while plain text/diff monitoring of untrusted pages remains safe because it does not render scraped element ids as markup. Blocking or restricting the Playwright/browser fetch backend would also prevent generation of the tainted selector data, at the cost of falling back to less capable HTTP fetch modes. Because exploitation requires an authenticated user to open the Visual Selector, restricting account creation and reviewing who holds changedetection.io credentials limits the pool of users who can be targeted, but it does not fix the underlying rendering flaw.
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
The flaw is a DOM-based cross-site scripting condition (CWE-79) in the Visual Selector component of changedetection.io. When the browser-based fetch backend scrapes a watched page, JavaScript in changedetectionio/content_fetchers/res/xpath_element_scraper.js derives an XPath for each candidate element; the shortcut branch builds '//*[@id="<id>"]' directly from the element's id attribute, and a fallback positional path builder is used when no selector is produced. The generated selector strings are persisted alongside the watch and later sent to the front end, where changedetectionio/static/js/visual-selector.js assigned them through $selectorCurrentXpathElem[0].innerHTML = s inside setCurrentSelectedText. Any quote or angle-bracket characters carried through from an attacker-influenced element id therefore became live markup rather than displayed text. The upstream patch changes that assignment to textContent and additionally rejects ids containing double quotes or angle brackets in the id-shortcut branch so such elements fall through to the positional XPath path, which cannot carry page markup into the selector. Affected artifacts are covered by CPE cpe:2.3:a:dgtlmoon:changedetection.io:*:*:*:*:*:*:*:* per the vendor project; the tested fall-through requires the injected id to be non-unique on the page, since findUpTag() only returns an id-based selector when the id is unique.
Know when Changedetection Io 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:P/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:P
Authenticated user must add a watch (PR:L) and open the Visual Selector (UI:R); DOM XSS in the user's own browser yields limited confidentiality/integrity (C:L/I:L), no scope change or availability impact.
Primary rating from Vendor (VulDB).
CVSS VectorVendor: VulDB
Lifecycle Timeline
3DescriptionCVE.org
A vulnerability was determined in dgtlmoon Changedetection.io up to 0.55.8. This issue affects the function setCurrentSelectedText of the file changedetectionio/static/js/visual-selector.js of the component Visual Selector. Executing a manipulation of the argument s can lead to cross site scripting. The attack can be launched remotely. The exploit has been publicly disclosed and may be utilized. Upgrading to version 0.60.1 is capable of addressing this issue. This patch is called aac6fcfa594f17511b8ff73e5eaa4f6c33899de0. It is suggested to upgrade the affected component.
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
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
More in Changedetection Io
View allUnauthenticated attackers can coerce changedetection.io through 0.60.6 into fetching arbitrary internal network addresse
Server-side request forgery in changedetection.io's Add Watch preview endpoint (/add_watch_ui/snapshot) allows remote at
changedetection.io through 0.60.7 contains a timing side-channel in the check_authentication function of its Flask authe
Arbitrary local file disclosure in ChangeDetection.io versions before 0.54.7 allows authenticated attackers to read sens
Path traversal in changedetection.io 0.60.7 and earlier allows remote attackers to read limited files outside the intend
A timing side-channel in the password comparison routine (check_password in changedetectionio/flask_app.py) of dgtlmoon
Unrestricted brute-force against changedetection.io's /login endpoint allows a remote unauthenticated attacker to system
HTML markup injection in changedetection.io through 0.60.6 allows an attacker who controls the <title> of a page being m
Authentication bypass in changedetection.io's /settings endpoint silently disables REST API key enforcement when a privi
Path traversal in changedetection.io 0.60.7 and earlier lets an authenticated low-privilege user read files outside the
Unauthenticated retrieval of the full OpenAPI schema is possible in changedetection.io because the /api/v1/full-spec end
EUVD-2026-84604
GHSA-c5gc-qprm-vmpr
NVD
CVE.org
EPSS
VulDB
Exploit-DB