CVE-2025-53658 Overview
A stored cross-site scripting (XSS) vulnerability has been identified in the Jenkins Applitools Eyes Plugin version 1.16.5 and earlier. The vulnerability exists due to improper escaping of the Applitools URL on the build page, allowing attackers with Item/Configure permission to inject malicious scripts that persist and execute in the context of other users' browsers when they view the affected build page.
Critical Impact
Attackers with Item/Configure permission can inject persistent malicious scripts that execute in other users' browsers, potentially enabling session hijacking, credential theft, or further compromise of Jenkins environments.
Affected Products
- Jenkins Applitools Eyes Plugin version 1.16.5 and earlier
- Jenkins instances utilizing the Applitools Eyes Plugin for visual testing integration
Discovery Timeline
- 2025-07-09 - CVE-2025-53658 published to NVD
- 2025-07-09 - Jenkins releases security advisory (SECURITY-3509)
- 2025-11-04 - Last updated in NVD database
Technical Details for CVE-2025-53658
Vulnerability Analysis
This stored XSS vulnerability stems from the Jenkins Applitools Eyes Plugin's failure to properly sanitize and escape user-controlled input when rendering the Applitools URL on build pages. When a user with Item/Configure permission configures the plugin, they can specify an Applitools URL that is later displayed on build result pages. Because this URL value is not properly escaped before being rendered in the HTML context, an attacker can craft a malicious URL containing JavaScript code that will be stored in the Jenkins configuration and executed whenever another user views the build page.
The vulnerability requires authentication and specific permissions (Item/Configure), but the impact is amplified because the malicious payload persists and affects all users who subsequently view the compromised build page. This includes administrators and other privileged users whose sessions could be hijacked.
Root Cause
The root cause of CVE-2025-53658 is inadequate output encoding in the Applitools Eyes Plugin's view layer. When the plugin renders the Applitools URL on build pages, it fails to apply proper HTML entity encoding or JavaScript escaping to the URL value before inserting it into the page's HTML. This allows special characters used in JavaScript injection attacks (such as <, >, ", and ') to be interpreted as HTML/JavaScript code rather than being displayed as literal text.
Attack Vector
The attack vector is network-based and requires the attacker to have authenticated access to the Jenkins instance with at least Item/Configure permission. The attack scenario involves:
- An attacker with Item/Configure permission accesses a Jenkins job configuration
- The attacker modifies the Applitools URL field to include malicious JavaScript payload
- The malicious payload is stored in the job configuration
- When any user (including administrators) views the build page, the unescaped URL is rendered
- The victim's browser executes the injected JavaScript in the context of the Jenkins session
The stored nature of this XSS means the attack persists until the malicious configuration is removed, potentially affecting many users over time. Successful exploitation could lead to session token theft, unauthorized actions performed as the victim user, or phishing attacks within the trusted Jenkins interface.
Detection Methods for CVE-2025-53658
Indicators of Compromise
- Unusual or suspicious values in Applitools URL configuration fields containing JavaScript code, <script> tags, or event handlers
- Build pages containing unexpected inline scripts or suspicious HTML elements
- Jenkins audit logs showing configuration changes to Applitools Eyes Plugin settings by unusual users
- User reports of unexpected browser behavior when viewing build pages
Detection Strategies
- Review Jenkins job configurations for Applitools Eyes Plugin settings containing script tags, event handlers (e.g., onerror, onclick), or javascript: URI schemes
- Implement Content Security Policy (CSP) headers to detect and block inline script execution
- Monitor Jenkins audit logs for configuration changes to job settings, particularly the Applitools URL field
- Perform regular security scans of Jenkins configurations using plugins like OWASP Dependency-Check
Monitoring Recommendations
- Enable and regularly review Jenkins security audit logs for suspicious configuration modifications
- Configure browser-based XSS detection mechanisms and CSP violation reporting
- Implement alerting on plugin configuration changes, especially for plugins handling external URLs
- Conduct periodic manual review of job configurations for anomalous URL patterns
How to Mitigate CVE-2025-53658
Immediate Actions Required
- Upgrade the Jenkins Applitools Eyes Plugin to the latest patched version immediately
- Review existing Applitools Eyes Plugin configurations across all jobs for suspicious or malicious URL values
- Restrict Item/Configure permissions to only trusted users who require this access
- Implement Content Security Policy headers on Jenkins to provide defense-in-depth against XSS attacks
Patch Information
Jenkins has released a security advisory addressing this vulnerability. Organizations should update the Applitools Eyes Plugin to the latest available version through the Jenkins Plugin Manager. Refer to the Jenkins Security Advisory SECURITY-3509 for specific patch details and upgrade instructions.
Workarounds
- Temporarily disable the Applitools Eyes Plugin if it is not critical to operations until the patch can be applied
- Restrict Item/Configure permissions to a minimal set of highly trusted users
- Implement strict input validation at the network perimeter if using a reverse proxy in front of Jenkins
- Consider implementing Content Security Policy headers that block inline script execution as an additional layer of defense
# Configuration example
# Review Jenkins job configurations for suspicious Applitools URLs
# Navigate to Jenkins > Manage Jenkins > Script Console and run:
# This Groovy script lists all jobs with Applitools Eyes configurations
# Jenkins.instance.getAllItems(Job.class).each { job ->
# def config = job.getConfigFile().asString()
# if (config.contains('ApplitoolsEyes') || config.contains('applitools')) {
# println "Review Applitools config in: ${job.fullName}"
# }
# }
# Apply Content Security Policy headers via reverse proxy (nginx example)
# add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';" always;
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

