
عميل Python لبروتوكول التحكم عبر WiFi المحلي لكاميرا لوحة القيادة Thinkware U3000، تم هندسته عكسيًا من تطبيق Android الرسمي. أدوات إثبات المفهوم وراء CVE-2026-101053 وCVE-2026-101054 وCVE-2026-101055.
عميل Python لبروتوكول التحكم عبر WiFi المحلي لكاميرا القيادة Thinkware U3000، تمت هندسته عكسيًا من تطبيق Android الرسمي، ومؤكد مقابل أجهزة حقيقية، وليس من أي مواصفات عامة (لا توجد مواصفات أصلاً).
هذا المشروع له غرضان: مكتبة قابلة للاستخدام لسحب التسجيلات من كاميرا القيادة الخاصة بك، ومواد داعمة لإفصاح CVE مكتمل (انظر الأمان أدناه).
docs/protocol-reference.md للحصول على التفصيل الكامل لما هو مؤكد وما هو تخميني.confirm=True لأنها مدمّرة (تهيئة بطاقة SD) أو لأنها قد تفصل الكاميرا عن الشبكة التي تستخدمها للوصول إليها (set_wifi_mode، connect_to_ap، إلخ). اقرأ docstring قبل تمرير confirm=True على أي منها.لا يوجد إصدار على PyPI. ثبّت مباشرة من GitHub:
pip install "u3000py[cli] @ git+https://github.com/turretsec/u3000py.git"
أو بدون CLI، المكتبة فقط:
pip install git+https://github.com/turretsec/u3000py.git
أو ثبّت على إصدار موسوم:
pip install git+https://github.com/turretsec/[email protected]
from u3000py import ThinkLinkClient, VideoCategory
with ThinkLinkClient("192.168.1.100") as cam: # your camera's actual IP
print(cam.get_device_info())
print(cam.get_system_status())
files = cam.list_files(VideoCategory.CONTINUOUS)
latest = files[-1]
def show_progress(received, total):
print(f"\r{received / total:.0%}", end="")
cam.download(latest.path, dest="latest_clip.mp4", progress=show_progress)
أو من سطر الأوامر، بعد التثبيت مع إضافة [cli]:
u3000py --host 192.168.1.100 info device
u3000py --host 192.168.1.100 files download --latest --category cont_rec
--host مطلوب في كل استدعاء، إما كالعلم الموضح أعلاه أو عبر متغير البيئة U3000PY_HOST إذا كنت تفضل عدم تكراره.
التفاصيل الكاملة لكل طريقة، بما في ذلك النتائج التي جاءت من اختبارات أجهزة حقيقية مقابل التخمينات المدروسة التي تنتظر التحقق، موجودة في وثيقة مرجع البروتوكول.
PUT_FILE: مؤكد أنه يسمح بكتابة ملفات عشوائية غير مصادق عليها إلى أي مسار مطلق على نظام ملفات الكاميرا. هذه واحدة من ثلاث نتائج CVE؛ إصدار طريقة عامة للكتابة في أي مكان في مكتبة عامة سيكون بمثابة توزيع أداة هجوم جاهزة للاستخدام. التفاصيل الكاملة في disclosure-thinkware-u3000.pip install -e ".[dev]"
pytest -v # unit tests, no camera needed
pytest -m hardware --host 192.168.1.100 # real-camera tests, opt-in only
يوجد سكربت اختبار دخان مستقل لـ CLI نفسه في scripts/smoke_test_cli.py. ليس جزءًا من مجموعة pytest (فهو يستدعي أمر u3000py المثبت الحقيقي مقابل كاميرا حقيقية) لإجراء فحوصات السلامة بعد التغييرات.
docs/protocol-reference.md: البروتوكول الكامل المهندس عكسيًا؛ تنسيق الإرسال، كل أمر مؤكد، ما لا يزال غير مُتحقق منه، والألغاز المفتوحة المعروفة (هناك أمران لا يتصرفان حقًا بالطريقة التي تتوقعها اصطلاحات البروتوكول نفسه).هذا البروتوكول لا يحتوي على مصادقة. نتجت ثلاث نتائج عن هذا البحث، موثقة بالكامل ومفصح عنها في مستودع منفصل: disclosure-thinkware-u3000.
PUT_FILE (CVE-2026-101053 (VulDB #410915))، مؤكد بالكتابة في دليل /tmp الحقيقي للكاميرا. غير مكشوف عن قصد بواسطة هذه المكتبة (انظر ما هو غير موجود هنا عن قصد أعلاه).LS/GET_FILE (CVE-2026-101054 (VulDB #410916))، بدون أي قيود على المسار على الإطلاق. طريقة download() في هذه المكتبة توضح العنصر الأساسي مباشرة، على سبيل المثال cam.download("/tmp/wpa_supplicant.conf") يقرأ ملف إعدادات WiFi الحي للجهاز.GET_STATUS "wifi_info" (CVE-2026-101055 (VulDB #410917)). طريقة get_wifi_info() في هذه المكتبة توضح العنصر الأساسي مباشرة (مع حجب كلمة المرور افتراضيًا في أي مخرجات مطبوعة، انظر repr() الخاص بـ WifiInfo).تم إخطار Thinkware في 2026-06-21. أُغلقت نافذة الإفصاح البالغة 30 يومًا في 2026-07-21 مع إقرار غير تقني بالاستلام فقط وبدون تأكيد إصلاح. لا تزال النتائج الثلاث قابلة لإعادة الإنتاج على البرنامج الثابت الإنتاجي الحالي. يُشار إلى بحث سابق ذي صلة على طراز Thinkware مختلف (F800 Pro) بواسطة geo-chen في مستودع الإفصاح للسياق.
MIT، انظر LICENSE.