كيف اننشرت نسخة LiteLLM المسمومة؟ مفتاح انكشف بأيار وما انلغى
LiteLLM نشرت تحقيقها باختراق النسخة 1.107.0: مفتاح رئيسي انكشف بأيار وما انلغى، ومنه وصل المهاجم لتوكنات GitHub ونشر النسخة المسمومة يوم 21 تشرين الأول.

إذا قريت المقال عن نسخة LiteLLM المسمومة، بتعرف إنو 1.107.0 كانت بتسرق المفاتيح. يلي ما كان معروف وقتها هو كيف وصل المهاجم لينشر نسخة رسمية باسم المشروع. يوم 23 تشرين الأول الساعة 21:00 بتوقيت UTC نشرت LiteLLM التحقيق الكامل، والقصة بتبلّش من شهر أيار.
من وين بلّشت القصة؟ مفتاح بأيار ما انلغى
27 أيار 2026: حدا عمل commit لملف opencode.json على مستودع عام اسمه LiteLLM-Labs/lite-harness، والملف فيه المفتاح الرئيسي (master key) لنسخة من LiteLLM Agent Platform، أداة بيستعملها الفريق لإدارة الـ agents. الـ commit انشال بعدين بـ force-push، والمفتاح انعلّم للإلغاء بس ما انلغى أبداً.
هون أول وأكبر غلطة بالقصة كلها: مسح الـ commit من تاريخ git ما بيمسح المفتاح من إيد يلي شافه أو نسخه. والمفتاح ضل شغال لحد ما استعمله المهاجم بعد أكتر من 4 شهور.
كيف سحب المهاجم توكنات GitHub؟
10 تشرين الأول: المهاجم استعمل المفتاح الرئيسي (من IP 69.48.229.143) ونادى الـ API تبع المنصة. طلب GET /api/v1/managed_agents/agents?limit=100 رجّعله إعدادات كل الـ agents، وفيها توكن GitHub CLI تبع واحد من المالكَين الاتنين لمنظمة المشروع على GitHub.
بنفس اليوم بين 22:11 و22:12 UTC، فرعين مؤقتين بأسماء ci-tmp-a351cc وci-tmp-be33e9 شغّلوا workflows بالـ CI بعتت أسرار مستودعين على موقع webhook.site. من هالأسرار GH_TOKEN وRELEASE_PLEASE_TOKEN، وهني توكنات GitHub CLI لتنين من المشرفين. وبعدين انمسحت سجلات التشغيل لحتى ما حدا ينتبه.
توكنات GitHub CLI بتنعطى بعد الـ 2FA، وGitHub ما بيطلب منها إعادة مصادقة قبل الإجراءات الحساسة، فالـ 2FA ما بيوقّف يلي بيسرقها. وبتوكن المالك، قدر المهاجم بعد 11 يوم يشيل حماية الفروع.
كيف اننشرت النسخة المسمومة بيوم واحد؟
يوم 21 تشرين الأول، المهاجم استعمل التوكنات المسروقة لحتى يمرّق نسخته من بوابات النشر الرسمية:
غيّر إعدادات
BerriAI/project-releaserلحتى يبني من fork شبيه بالاسمBerri-AI/litellmعلى commit رقم20535d8f.لما حماية الفرع (branch protection) رفضت التغيير، كسرها بتوكن المالك المسروق.
توكن المشرف يلي انسرق من
GH_TOKENوافق على بوابة الإنتاج.سبع حزم
litellm==1.107.0اننشرت على PyPI بين 11:39 و11:40 UTC، وصور Docker Hub وGHCR الساعة 11:46.
PyPI حجرت النسخة المسمومة الساعة 13:23 UTC، ووسوم Docker Hub تصلّحت الساعة 14:20. يعني النسخة ضلت متاحة حوالي ساعتين، وهالوقت بيكفي لحتى تنسحب وتتثبّت.
النسخ المصابة بالضبط: على PyPI litellm==1.107.0، وعلى Docker Hub وGHCR الوسوم v1.107.0 وlatest وmain-latest وmain-stable. النسخة الآمنة يلي قبلها: 1.106.2.
إذا ثبّت النسخة المصابة، شو تعمل؟
تعامل مع البيئة إنها مخترقة بالكامل، ونضّفها قبل ما تدوّر أي مفتاح:
وقّف عملية Python الخبيثة يلي بتضل شغالة بالخلفية (هي يلي ماسكة الملف
/tmp/remote_code_loader.lock)، وابنِ البيئة من جديد على النسخة الآمنة 1.106.2. وما تشغّلpipجوّا البيئة المصابة: أي تشغيلة Python فيها بتشغّل الملفات الخبيثة من جديد.من جهاز نضيف، دوّر كل بيانات الدخول يلي كانت البيئة بتشوفها: مفاتيح السحابة ومفاتيح SSH وتوكنات PyPI وnpm وتوكنات مزودي الـ AI.
ثبّت صور Docker بالـ digest مش بالـ tag، لحتى ما يفاجئك وسم متحرك مرة تانية.
ومتل ما بقصة دودة npm، ترتيب التدوير بيفرق متل التدوير نفسه: نضّف أول، وبعدين لغي ودوّر من جهاز نضيف.
شو الدرس لكل مطور؟
كل خطوة بالهجوم مشيت على سر ضل شغال بعد ما انكشف، أو على توكن صلاحياته أكبر من الشغل يلي بيلزمه.
الغلطة | الدرس |
|---|---|
مفتاح انكشف بأيار وما انلغى | أي سر بينكشف بمكان عام بينلغى فوراً، حتى لو «مسحت» الـ commit |
أسرار CI انسرقت عبر workflows مزيّفة | راقب تشغيلات الـ CI الغريبة، وأي سجل تشغيل منمسح إشارة خطر |
توكنات قوية بإيد المهاجم | دوّر أسرارك بترتيب صح، وقلل صلاحيات التوكنات للحد الأدنى |
المفتاح انعلّم للإلغاء، والإلغاء ما صار | لغي أي مفتاح بينكشف ودوّره فوراً، وجرّب القديم لحتى تتأكد إنو ما عاد شغال |
LiteLLM قالت إنها عم تلغي كل توكن مربوط بأنظمتها الداخلية والمنصات يلي بتشتغل معها، وإنها رح تشارك الأسبوع الجاي شو تعلّمت وشو رح تغيّر. بس الاختراق ما بلّش يوم 21 تشرين الأول. بلّش يوم 27 أيار، لما المفتاح انعلّم للإلغاء وما انلغى.
إمتى آخر مرة دوّرت مفتاح انكشف، حتى لو انمسح أثره من التاريخ؟
أسئلة شائعة
بيكفي إني ثبّت 1.106.2 فوق النسخة المصابة بـ pip؟
لأ. أي تشغيلة Python بالبيئة المصابة، حتى pip نفسه، بتشغّل الملفات الخبيثة من جديد. ابنِ البيئة من الصفر على 1.106.2، ومن جهاز نضيف دوّر كل بيانات الدخول يلي كانت بتشوفها (مفاتيح السحابة وSSH وتوكنات AI)، وثبّت صور Docker بالـ digest مش بالـ tag.
أي نسخ بالضبط كانت مصابة؟
على PyPI: litellm==1.107.0. وعلى Docker Hub وGHCR: الوسوم v1.107.0 وlatest وmain-latest وmain-stable. النسخة الآمنة يلي قبلها هي 1.106.2.
ليش مسح الـ commit ما كان كافي؟
لأنو المفتاح نفسه ضل شغال. مسح الـ commit من تاريخ git ما بيلغي المفتاح من إيد يلي شافه أو نسخه، وبـ LiteLLM المفتاح انعلّم للإلغاء بس ما انلغى. أي سر بينكشف بمكان عام لازم ينلغى فوراً.
شو يعني توكنات GitHub CLI بتتجاوز الـ 2FA؟
يعني GitHub بيعطيها بعد الـ 2FA وما بيطلب منها إعادة مصادقة قبل الإجراءات الحساسة، فالـ 2FA تبع صاحبها ما بيوقّف يلي بيسرقها. هيك قدر المهاجم يشيل حماية الفروع بتوكن مالك المنظمة.


