CVE-2026-33981 Overview
changedetection.io is a free open source web page change detection tool that allows users to monitor websites for changes. A vulnerability exists in versions prior to 0.54.7 where the jq: and jqraw: include filter expressions allow use of the jq env builtin. This builtin reads all process environment variables and stores them as the watch snapshot, enabling unauthorized access to sensitive configuration data.
An authenticated user (or unauthenticated user when no password is set, which is the default configuration) can exploit this vulnerability to leak sensitive environment variables including SALTED_PASS, PLAYWRIGHT_DRIVER_URL, HTTP_PROXY, and any other secrets passed as environment variables to the container.
Critical Impact
This Information Disclosure vulnerability allows attackers to extract sensitive credentials and configuration data from the server environment, potentially leading to further compromise of the application and connected services.
Affected Products
- Webtechnologies changedetection versions prior to 0.54.7
- Container deployments with sensitive environment variables
- Instances running with default (no password) configuration
Discovery Timeline
- 2026-03-27 - CVE CVE-2026-33981 published to NVD
- 2026-04-02 - Last updated in NVD database
Technical Details for CVE-2026-33981
Vulnerability Analysis
The vulnerability stems from insufficient input validation in the jq filter expression handler within changedetection.io. The application provides jq: and jqraw: filter expressions to allow users to process JSON data from monitored web pages. However, these filter expressions fail to restrict access to the jq env builtin function.
The jq env builtin is designed to provide access to all environment variables available to the process. When an attacker crafts a malicious filter expression using this builtin, the application executes it without proper sandboxing, causing all environment variables to be captured and stored as part of the watch snapshot data.
This is particularly dangerous because changedetection.io is commonly deployed in Docker containers where sensitive configuration data is typically passed via environment variables, including database credentials, API keys, proxy configurations, and authentication secrets.
Root Cause
The root cause is classified as CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor). The jq filter expression parser does not implement a deny-list or allow-list for dangerous jq builtins. The env function, which provides direct access to process environment variables, should have been blocked or restricted but was available for use in user-supplied filter expressions.
The default configuration of changedetection.io compounds this issue by running without password protection, meaning any user with network access to the application can exploit this vulnerability without authentication.
Attack Vector
The attack is network-accessible and requires low privileges (or no authentication in default configurations). An attacker can exploit this vulnerability by:
- Accessing the changedetection.io web interface
- Creating or modifying a watch configuration
- Injecting a malicious jq filter expression using the env builtin
- Viewing the watch snapshot to retrieve all environment variables
The vulnerability allows attackers to extract sensitive data including the SALTED_PASS (the application's password hash), PLAYWRIGHT_DRIVER_URL (potentially exposing internal service URLs), HTTP_PROXY configurations (revealing network topology), and any custom secrets passed to the container.
Detection Methods for CVE-2026-33981
Indicators of Compromise
- Watch configurations containing jq: or jqraw: expressions with the env builtin
- Unusual watch snapshot data containing environment variable key-value pairs
- Log entries showing filter expressions being applied with env function calls
- Access patterns from unauthorized users creating or modifying watch configurations
Detection Strategies
- Monitor application logs for filter expression creation containing suspicious jq functions
- Review existing watch configurations for malicious env builtin usage in jq expressions
- Implement alerting on watch snapshots that contain common environment variable patterns
- Audit user activity logs for unauthorized configuration changes
Monitoring Recommendations
- Enable verbose logging for filter expression parsing and execution
- Set up alerts for watch configurations modified by low-privilege or anonymous users
- Monitor for data exfiltration patterns from the watch snapshot endpoints
- Implement network monitoring for unusual outbound traffic from the changedetection.io container
How to Mitigate CVE-2026-33981
Immediate Actions Required
- Upgrade changedetection.io to version 0.54.7 or later immediately
- Enable password authentication if currently running with default (no password) configuration
- Audit existing watch configurations for malicious jq filter expressions
- Review container environment variables and consider rotating any potentially exposed secrets
- Restrict network access to the changedetection.io interface to authorized users only
Patch Information
Version 0.54.7 of changedetection.io patches this vulnerability by restricting access to dangerous jq builtins including the env function. The fix is available in the GitHub Release Version 0.54.7. The specific security fix can be reviewed in the GitHub Commit Details.
For detailed information about the vulnerability and patch, refer to the GitHub Security Advisory GHSA-58r7-4wr5-hfx8.
Workarounds
- Enable strong password authentication to prevent unauthorized access to watch configurations
- Restrict network access to the changedetection.io interface using firewall rules or reverse proxy authentication
- Audit and remove any unnecessary sensitive environment variables from the container configuration
- Consider using Docker secrets or external secret management solutions instead of environment variables for sensitive data
- Monitor and log all watch configuration changes until the patch can be applied
# Example: Restrict environment variables passed to container
# Use Docker secrets instead of environment variables for sensitive data
docker run -d \
--name changedetection \
-e PUID=1000 \
-e PGID=1000 \
-v /path/to/datastore:/datastore \
-p 5000:5000 \
dgtlmoon/changedetection.io:0.54.7
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

