ملخص

  • أكدت GitHub أن مفتاح المضيف الخاص RSA SSH لموقع GitHub.com تعرض لفترة وجيزة في مستودع عام، وأنها استبدلت مفتاح المضيف RSA في حوالي الساعة 05:00 UTC يوم 24 مارس 2023؛ كما قالت GitHub إن المفتاح لم يمنح الوصول إلى بنية GitHub التحتية أو بيانات العملاء، وأنه ليس لديها سبب للاعتقاد بأنه تم إساءة استخدام المفتاح. الإشعار الرئيسي هو بيان الأمان من GitHub علىhttps://github.blog/news-insights/company-news/we-updated-our-rsa-ssh-host-key/.
  • لم يكن الحادث مجرد كشف مفتاح خاص. بل كان مشكلة إصلاح ثقة فرضت على المطورين وأنظمة CI ومديري الإصدارات والشركات الصغيرة التي كان عليها أن تقرر ما إذا كانت هوية مضيف SSH المتغيرة هي تدوير شرعي من المزود أم محاولة اعتراض.
  • عدم التطابق بين العقد والتحكم هو أن شروط المنصة يمكن أن تحد من الضمانات والمسؤولية، بينما تمارس عمليات المزود سلطة حقيقية على استمرارية بناء العملاء وإصداراتهم والتحكم بالمصدر. توزع شروط GitHub علىhttps://docs.github.com/en/site-policy/github-terms/github-terms-of-serviceالمخاطر القانونية بشكل مختلف عن طريقة عمل التحكم التشغيلي أثناء التدوير.
  • تتبع المساءلة الضوابط التي امتلكها كل طرف فعليًا: تحكمت GitHub في حفظ مفتاح المضيف واكتشافه وتدويره وتوجيهات الطرف الأول وتحديثات الإجراءات المدعومة؛ بينما تحكم العملاء في مخزون مخازن الثقة والتحقق المستقل وتحديثات سير العمل المثبتة والنقل الاحتياطي وانضباط مقاطعة الإصدار.

لم يستطع العقد تدوير المفتاح؛ GitHub استطاعت

من السهل التقليل من حدث مارس 2023 لأنه لم يصبح سرقة معلنة لمستودعات العملاء أو حسابات العملاء أو بيئة إنتاج GitHub. ومن السهل أيضًا المبالغة فيه لأن امتلاك مفتاح مضيف الخادم ليس مثل امتلاك بيانات اعتماد المستخدم أو مفتاح رئيسي للكود الخاص. يقع تحليل المساءلة المفيد بين هذين الخطأين. فقد كائن ثقة واحد يتحكم فيه المزود سريته، وأصبح إجراء الإصلاح للمزود مرئيًا لأنظمة العملاء بنفس التحذير الذي صُممت تلك الأنظمة لإظهاره أثناء التغيير العدائي.

قال إشعار GitHub إن مفتاح المضيف الخاص RSA SSH القديم تعرض لفترة وجيزة في مستودع عام على GitHub، وأن الشركة تصرفت لحماية المستخدمين من احتمال انتحال الهوية أو التنصت عبر SSH. وحدد التأثير في عمليات Git عبر SSH باستخدام RSA، وقال إن عمليات Git عبر HTTPS وحركة المرور على الويب ومستخدمي ECDSA وEd25519 لم يتأثروا بنفس الطريقة. هذا النطاق مهم. لا يدعم الحدث ادعاءً بأن المستودعات الخاصة قُرئت من GitHub، أو أن مفاتيح SSH الخاصة بالعملاء تم الكشف عنها، أو أن خدمة GitHub الداخلية تم اختراقها بشكل عام. لكنه يدعم ادعاءً بأن GitHub كان عليها استبدال هوية خدمة قام العديد من العملاء بتثبيتها كشرط مسبق لقبول الكود عبر SSH.

يبدأ سؤال العقد مقابل التحكم بعلاقة الخدمة. تحدد شروط GitHub الحالية خدمة واسعة وتتضمن إخلاء مسؤولية بأن الخدمة مقدمة كما هي متاحة، مع حدود على التأكيدات حول التوقيت والأمان والوصول غير المنقطع أو التشغيل الخالي من الأخطاء. هذه الشروط مفيدة للتخصيص القانوني، لكنها لم تعط العميل القدرة على تدوير مفتاح مضيف GitHub.com. لم تسمح لشركة برمجيات صغيرة بالاحتفاظ بمفتاح قديم بأمان بعد أن أصبح المفتاح الخاص علنيًا. لم تعط مجرى CI طريقة مستقلة لمعرفة ما إذا كان المفتاح الجديد حقيقيًا. كانت اللغة القانونية والسلطة التشغيلية تشيران في اتجاهات مختلفة.

عدم التطابق شائع في الاعتماد على السحابة. قد يحتفظ المزود بسلطة تقديرية واسعة ويحد من التعرض، بينما يصبح أيضًا الفاعل الوحيد القادر على تشغيل تحكم مشترك. يمكن للعملاء مغادرة المنصة نظريًا، لكن في لحظة التدوير الطارئ يحتاجون إلى قرار في دقائق، ليس تمرين شراء. غالبًا ما تفترض أنظمة البناء وأدوات النشر والوحدات الفرعية وتكاملات البائعين والمرايا الداخلية أن نقطة نهاية SSH لـ GitHub هي مصدر ثبات للحقيقة. عندما يتغير مصدر الحقيقة نفسه، يجب على العميل إما التوقف أو التحقق عبر قناة أخرى.

هذه ليست شكوى من أن GitHub قامت بالتدوير. كان التدوير خطوة الاحتواء الصحيحة بمجرد أن أصبح المفتاح الخاص معرضًا بشكل معقول. اختبار المساءلة هو ما إذا كانت المنظمة التي تحتفظ بكائن الثقة لديها ضوابط وقائية كافية لإبقائه خارج المستودع العام، واكتشاف كافٍ لمعرفة كيفية حدوث التعرض، وتحكم استجابة كافٍ للإلغاء دون خلق ارتباك يمكن تجنبه، وإفشاء كافٍ للسماح للعملاء بالتعافي دون إضعاف ذات التحكم الذي يحميهم.

ما تم تأكيده وما بقي مجهولاً

يؤكد الحساب العام لـ GitHub خمسة حقائق. أولاً، السر المعني هو مفتاح المضيف الخاص RSA SSH لعمليات Git على GitHub.com عبر SSH. ثانيًا، اكتشفت الشركة أنه ظهر لفترة وجيزة في مستودع عام. ثالثًا، استبدلت GitHub المفتاح في حوالي الساعة 05:00 UTC يوم 24 مارس 2023، وأفادت أن المفتاح الجديد كان مرئيًا لفترة وجيزة أثناء التحضيرات التي بدأت حوالي الساعة 02:30 UTC. رابعًا، قالت الشركة إن الحادث لم يكن ناتجًا عن اختراق أنظمة GitHub أو معلومات العملاء. خامسًا، قالت GitHub إنه ليس لديها سبب للاعتقاد بأن المفتاح قد أسيء استخدامه.

تحدد هذه البيانات حدود الأدلة. لا تحدد المستودع أو الشخص أو سير العمل أو الماسح الضوئي أو مدة التعرض أو عدد المشاهدات أو عدد النسخ أو سلوك التخزين المؤقت أو السبب الجذري. لا تكشف عن القياسات عن بعد المستخدمة لاستنتاج عدم وجود إساءة استخدام معروفة. لا تقول ما إذا كان المفتاح الخاص قد تم إنشاؤه أو تخزينه بطريقة كان ينبغي أن تجعل نشر المستودع مستحيلاً. لا تذكر ما إذا كان التعرض قد تم اكتشافه بواسطة فحص الأسرار الخاص بـ GitHub أو تقرير موظف أو تقرير مستخدم أو باحث أو تحكم آخر.

هذا الغياب مهم لأن GitHub تبيع وتوثق ضوابط تهدف إلى منع التعرض العلني للأسرار. في فبراير 2023، أعلنت GitHub عن تنبيهات فحص الأسرار المجانية للمستودعات العامة على source: github.blog. في مايو 2023، بعد حدث مفتاح المضيف، أعلنت عن حماية دفع مجانية أوسع للمستودعات العامة على source: github.blog. توثق وثائق GitHub الحالية أنماط المفاتيح الخاصة العامة على source: docs.github.com. تظهر هذه المصادر عائلة التحكم. لكنها لا تثبت أي تحكم رأى أو فات أو حظر مفتاح المضيف المحدد في مارس 2023.

لذا يجب ذكر السبب الجذري بشكل ضيق. كان المحفز هو تعرض مفتاح المضيف الخاص في مستودع عام. كانت قضية المساءلة الجذرية ليست مجرد ذلك التعرض، بل نظام الحفظ الذي سمح لهوية خدمة إنتاجية بأن تصبح قابلة للنشر ومسار تعافي العميل الذي اعتمد بعد ذلك على التحقق المباشر. تشمل الظروف المساهمة اتساع استخدام SSH من GitHub، ومخازن الثقة القديمة للعملاء المثبتة على RSA، والأتمتة التي تفشل مغلقة بدون إنسان قريب، وسير العمل المثبت على كود إجراءات قديم، وكتيبات تشغيل العملاء التي غالبًا ما تعاملت تحذيرات مفتاح المضيف كإزعاج محلي بدلاً من إشارة سلسلة توريد.

يفصل السجل العام أيضًا الضرر المحتمل عن الضرر الملاحظ. يمكن لطرف يمتلك مفتاح المضيف الخاص RSA القديم محاولة انتحال هوية GitHub لعميل يمكنه تحويل حركة المرور الخاصة به ويقبل عميله هوية RSA القديمة. يمكن أن يكشف ذلك عن أوامر Git والكائنات المدفوعة ومحتوى المستودع المطلوب عبر هذا الاتصال، أو تمكين خداع أكثر تفصيلاً اعتمادًا على موقع المهاجم. لكن المفتاح في حد ذاته لم يوفر موقع الشبكة أو بيانات اعتماد المستخدم أو الوصول إلى حساب GitHub أو الوصول إلى مستودعات GitHub المخزنة. لا تثبت المصادر التي تم مراجعتها حدوث حادثة انتحال ناجحة.

التحذير كان التحكم يعمل

تحذيرات مفتاح مضيف SSH ليست احتكاكًا زخرفيًا. RFC 4253، على source: datatracker.ietf.org، يفصل مصادقة الخادم في طبقة النقل عن مصادقة المستخدم. من المفترض أن يتوقف العميل الذي يتذكر هوية الخادم المتوقعة عندما يقدم الخادم مفتاحًا مختلفًا. يصف دليل عميل OpenSSH على source: man.openbsd.org فحص المضيف الصارم كإعداد يرفض مفاتيح المضيف المتغيرة. هذا الرفض هو بالضبط ما يحتاجه العملاء إذا حاول مهاجم الوقوف بينهم وبين GitHub.

خلق تدوير مارس مفارقة تشغيلية. تسبب إصلاح GitHub الشرعي في نفس الأعراض التي يمكن أن يسببها هجوم رجل في المنتصف. رأى مطور تحذير مفتاح متغير. رأى مجرى CI فشل سحب. رأت وظيفة نشر خروج غير صفري. لم يستطع الجهاز معرفة ما إذا كان التغيير قانونيًا. كان يعرف فقط أن هوية المضيف لم تعد تطابق السجل المحلي. لهذا السبب ينتمي الحدث إلى سلسلة المخاطر والمساءلة حتى بدون سرقة مؤكدة لبيانات العملاء.

يقول دليل استكشاف الأخطاء وإصلاحها من GitHub على source: docs.github.com للمستخدمين البحث عن تفسير رسمي وتجنب الاتصال عند غيابه. تنشر صفحة بصماتها على source: docs.github.com بصمات SSH الحالية لـ GitHub. يقول توثيق REST Meta على source: docs.github.com إن نقطة نهاية meta تُرجع بصمات مفاتيح SSH ومفاتيح المضيف ويمكن استخدامها بدون مصادقة للموارد العامة. قدمت هذه القنوات معًا مسار تعافي، لكن ليس مسارًا سحريًا. كان لا يزال على العميل أن يقرر أن توثيق HTTPS وAPI موثوقان بما يكفي للطوارئ، وأن يوزع إدخال الثقة المصحح دون تعليم الموظفين قبول أي مفتاح يظهر على مسار SSH.

الاختصار غير الآمن كان إزالة فحص المضيف عالميًا أو ملء المفاتيح الموثوقة من مسح شبكة مباشر دون تحقق مستقل. يحذر دليل ssh-keyscan من OpenBSD على source: man.openbsd.org من أن استخدام مخرجات المسح دون تحقق يمكن أن يترك المستخدمين عرضة للاعتراض. هذا التحذير ينطبق مباشرة. تشغيل مسح ضد الاسم ذاته الذي هويته محل نزاع يمكن أن يسجل إجابة المهاجم كحقيقة إذا كان المسار معاديًا.

التسلسل المنضبط أبطأ لكنه أكثر أمانًا: حفظ التحذير، مقارنة البصمة المقدمة مع بيان موثق من المزود ومصدر موافقة داخلي، تحديث إدخال مضيف RSA المصاب فقط لاسم المضيف ذي الصلة، إجراء سحب اختباري، ثم نشر التحديث عبر العملاء والمجريات المدارة. هذا التسلسل يقبل تأخيرًا قصيرًا في الإصدار كثمن لعدم تحويل فشل الثقة إلى تجاوز للثقة.

حولت CI إصلاح الثقة إلى استمرارية خدمة

يمكن للمطورين البشر قراءة إشعار. لا تستطيع أنظمة CI ذلك. حذرت GitHub على وجه التحديد من أن سير العمل الذي يستخدم actions/checkout مع خيار ssh-key قد يفشل وأن GitHub كانت تحدث العلامات المدعومة مثل v2 وv3 وmain. المستودع العام للإجراء على source: github.com يوثق دعم مفتاح SSH وسلوك فحص المضيف الصارم. نفس الإصلاح الذي يمكن أن تستقبله علامة متحركة مركزيًا لن يصل تلقائيًا إلى الوظائف المثبتة على SHA التزام محدد.

هذا التوتر ليس عيبًا في التثبيت. يوصي دليل تقوية الإجراءات الخاص بـ GitHub على source: docs.github.com بتثبيت الإجراءات على التزامات غير قابلة للتغيير لسلامة سلسلة التوريد. في مارس 2023، خلق المراجعة غير القابلة للتغيير مقايضة استمرارية. العميل الذي ثبت كود إجراء قديم كان محميًا من التغييرات الصامتة للإجراء، لكن كان عليه أيضًا مراجعة واعتماد التزام جديد لتلقي تحديث الثقة المضمن. العميل الذي يستخدم علامة متحركة يمكنه تلقي إصلاح المزود بشكل أسرع، لكن بتكلفة تنفيذ كود قد يتحرك دون مراجعة العميل نفسه.

هذا هو اقتصاديات أدوات المطور للحدث. تركز GitHub استضافة المستودعات والتعاون وتتبع المشكلات وسير عمل الحزم وتكامل CI لأن المركزية تقلل التكلفة والاحتكاك. نفس المركزية تعني أن تدوير مفتاح المزود يمكن أن يقطع العديد من العملاء في وقت واحد. قد يواجه كل عميل فشل بناء محلي، لكن السبب هو تحكم منصة مشتركة. قد يمتلك كل عميل ملفات known-hosts الخاصة به، لكن القيمة داخلها هي تأكيد يملكه المزود.

تواجه الفرق الصغيرة والمتوسطة أصعب نسخة. قد تمتلك مؤسسة كبيرة إدارة نقطة نهاية وأصحاب منصة CI وهندسة أمان واتصالات بائعين. قد يكون لدى شركة برمجيات مكونة من خمسة أشخاص شخص واحد يرى فشل نشر، ويتحقق من خلاصة اجتماعية، ويبحث في صفحة دعم، وعليه أن يقرر ما إذا كان سيشحن. تعترف إرشادات CISA لسلسلة توريد تكنولوجيا المعلومات والاتصالات للشركات الصغيرة على source: cisa.gov بأن الشركات الأصغر تعتمد بشكل كبير على مزودي التكنولوجيا الخارجيين بينما تفتقر إلى موظفي مخاطر مخصصين. حدث مارس هو مثال مضغوط على هذا الاعتماد.

لا تحتاج الشركة الصغيرة والمتوسطة إلى منصة بديلة مثالية لتكون مسؤولة. تحتاج إلى خطة خفيفة: نقل Git ثانٍ تم اختباره بالفعل، مرآة مستودع أو حزمة للكود الأساسي، شخصان مشتركان في إشعارات المزود، صفحة داخلية تسرد بصمات المضيف المعتمدة وعناوين URL المصدر، وقاعدة بأن تحذيرات مفتاح المضيف هي أحداث أمنية حتى يتم التحقق. توثيق GitHub لعنوان URL البعيد على source: docs.github.com يظهر أن التبديل بين SSH وHTTPS بسيط تقنيًا. تشغيليًا، يتطلب بيانات اعتماد وأذونات وتسجيلًا لا يخلق مشكلة سر جديدة.

النسخ الاحتياطي محدود بالمثل. يمكن لدليل نسخ احتياطي للمستودع من GitHub على source: docs.github.com وتوثيق حزمة Git على source: git-scm.com الحفاظ على تاريخ Git، لكنها لا تحافظ تلقائيًا على المشكلات أو طلبات السحب أو أسرار سير العمل أو سجلات الحزم أو مراجعات الوصول أو موافقات الإصدار. خطة نسخ احتياطي تحمي كود المصدر ولكنها تفقد حالة الإصدار قد تظل تترك الشركة غير قادرة على التعافي بشكل نظيف.

شروط العقد تفسر التعرض، وليس التحكم

شروط خدمة GitHub الحالية ذات صلة لأنها تظهر السطح القانوني حول خدمة تعتبرها العديد من المؤسسات بنية تحتية حاسمة. تحدد الشروط الخدمة بشكل واسع، وتتعامل مع محتوى المستودع الخاص على أنه سري يخضع لأغراض الوصول المذكورة، وتوفر للاتصالات الإلكترونية، وتذكر عدم وجود دعم هاتفي للتواصل العادي حول الشروط، وتتنصل من ضمانات واسعة. يمكن أن تكون هذه البنود عقلانية تجاريًا. كما تظهر لماذا لغة العقد ليست بديلاً عن المساءلة التشغيلية.

شروط المستودع الخاص لـ GitHub على source: docs.github.com تقول إن GitHub تعامل محتوى المستودع الخاص على أنه سري وقد تصل إليه لأغراض محددة مثل الأمان والدعم والنزاهة والالتزامات القانونية أو الموافقة. هذه اللغة تعترف بسلطة المزود على نزاهة الخدمة. تدوير مفتاح المضيف يمارس سلطة مماثلة في طبقة الاتصال. قد يمتلك العملاء محتواهم ويكونون الوصول، لكنهم لا يمتلكون هوية المنصة التي توثق GitHub.com عبر SSH.

ليست القضية ما إذا كان لـ GitHub حق تعاقدي في التدوير. بالتأكيد كانت بحاجة إليه. القضية هي ما إذا كان توزيع المخاطر التعاقدية يتطابق مع التحكم العملي. تحمل العملاء التكلفة النهائية لتحديث مخازن الثقة وإعادة تشغيل البناء وشرح الإخفاقات ومنع الحلول البديلة غير الآمنة. تحكمت GitHub في الحقائق اللازمة للقيام بذلك بأمان: البصمة الجديدة، نوع المفتاح المتأثر، سبب التدوير، حدود التعرض، حالة تحديث الإجراء المدعوم، والثقة بشأن إساءة الاستخدام. عندما يتحكم طرف في الأدلة ويتحمل الطرف الآخر عبء التعافي، تصبح جودة الإفصاح تحكمًا، وليس علاقات عامة.

يمكن لـ GitHub Status على source: githubstatus.com التواصل حول الحوادث التشغيلية وصحة المكونات، لكن حدث مفتاح المضيف يحتاج أيضًا إلى إرشادات أمان موثقة. لا يمكن لصفحة حالة خضراء عامة أن تخبر وظيفة CI ما إذا كانت بصمة SSH الجديدة قانونية. يجب أن يكون إشعار المزود وصفحة البصمة ونقطة نهاية API واستجابة الدعم ومكون الحالة متسقين داخليًا. إذا قال أحدهم إن المفتاح قد استبدل وبقي الآخر صامتًا أو قديمًا، قد يتوقف العملاء لفترة أطول أو يتخذون قرارات غير آمنة.

فعل الإشعار العام عدة أشياء بشكل جيد. سمى الخوارزمية المتأثرة، وأعطى وقت تدوير دقيق، واعترف بالظهور المبكر للمفتاح الجديد، وقدم البصمة الجديدة والمفتاح العام الكامل، وفصل HTTPS وخوارزميات مفتاح المضيف الأخرى عن RSA SSH، وحذر مستخدمي Actions، وشرح أن المفتاح القديم لم يمنح الوصول إلى بنية GitHub التحتية أو بيانات العملاء. هذه حقائق تشغيلية مفيدة. الحقائق المفقودة تقع في مكان آخر: مدة التعرض الدقيقة، مسار الكشف، أدلة الاسترجاع، حدود القياس عن بعد، تغييرات الحفظ، والتأكيد اللاحق بأن نفس فئة النشر أصبحت أقل احتمالية.

لذا لا تطلب عدسة المساءلة من GitHub أن تعد بتوفر مثالي أو خطأ صفري. تطلب من المنصة تقديم أدلة متناسبة مع التحكم الذي تملكه. يمكن للعقد أن يقول إن المخاطرة محدودة. لا يمكنه جعل مفتاح مضيف خاص مكشوف غير مكشوف. لا يمكنه جعل مفتاح مضيف متغير موثقًا ذاتيًا. لا يمكنه ترك العملاء يتحققون من حقائق لم تنشرها GitHub وحدها.

فشل الكشف والاستجابة والتعافي حسب التحكم العملي

كان المحفز هو تعرض مفتاح المضيف الخاص RSA. كانت القضية الجذرية هي حفظ المفتاح وإصلاح الثقة الطارئ. تضمنت الظروف المساهمة هوية منصة مشتركة، واستخدام غير متساوٍ من قبل العملاء لـ RSA بدلاً من مفاتيح المضيف الأحدث، ومخازن ثقة مخفية في الأتمتة، ومقايضات التثبيت في Actions، وكتيبات تشغيل العملاء التي غالبًا ما تفتقر إلى مسار تدوير تم التحقق منه.

لا يمكن تعيين فشل الكشف بالتفصيل من السجل العام لأن GitHub لم تكشف عن المكتشف. ربما تم العثور على الحدث بواسطة تحكم يعمل بشكل صحيح. ربما تم العثور عليه بواسطة شخص. ربما تم العثور عليه بعد تأخير. الاستنتاج العام الصحيح ليس أن الكشف فشل، بل أن أدلة الكشف غير قابلة للتحقق من الخارج. بالنسبة لمزود يتضمن منتجه كشف الأسرار، فإن فجوة الأدلة هذه جوهرية لأن العملاء يمكنهم التعلم من المسار فقط إذا تم وصف المسار.

كانت الاستجابة قوية جزئيًا. تم إبطال المفتاح المكشوف بسرعة بعد الإشعار العام. كان الاستبدال مقتصرًا على RSA، وقللت مفاتيح ECDSA وEd25519 غير المتغيرة من نصف قطر الانفجار. قدم GitHub بصمة موثقة وتوجيهات التحديث. كما قام بتحديث علامات actions/checkout المدعومة. ضعف الاستجابة كان الارتباك الذي لا مفر منه الناتج عن ظهور مفتاح جديد لفترة وجيزة حوالي الساعة 02:30 UTC قبل الاستبدال المعلن في 05:00 UTC. ربما كان ذلك تحضيرًا غير ضار، لكن بالنسبة للعميل بدا وكأنه هوية متغيرة قبل التحويل النهائي. اعترف GitHub بذلك؛ السجل العام لا يشرح الآلية.

تم توزيع التعافي على العملاء. كان على محطات العمل والمجريات والحاويات والصور الأساسية والأجهزة وخدمات البناء وأنظمة النشر جميعها تحديث الثقة المحلية. يمكن لـ GitHub تحديث علامات الإجراءات المدعومة الخاصة به، لكن العملاء الذين لديهم التزامات مثبتة أو CI خارجي كان عليهم التصرف. هذا ليس غير عادل بحد ذاته. إنه حد المسؤولية المشتركة في التشغيل. يصبح غير عادل فقط إذا كان توجيه المزود غير مكتمل، أو إذا لم يكن لدى العميل طريقة عملية لتلقيه، أو إذا كانت عقود العملاء توحي باستقلالية غير موجودة أثناء حدث هوية المنصة.

أكثر مقياس يكشف هو وقت التعافي الموثق، ليس وقت تدوير المزود. كم من الوقت استغرقت فئات العملاء الرئيسية لاستعادة ثقة SSH الصارمة دون تعطيل الفحوصات؟ كم عدد تذاكر الدعم التي تضمنت حلولاً بديلة غير آمنة؟ كم عدد عمليات Actions الفاشلة التي تضمنت كودًا مثبتًا؟ كم عدد العملاء الذين استخدموا مفتاح RSA القديم بعد الإشعار؟ السجل العام الذي تمت مراجعته لهذه المقالة لا يوفر هذه القياسات. غيابها يحد من القدرة على القول ما إذا كان التعافي قد اكتمل فقط أم تحسن بشكل قابل للقياس.

ملاحظة طباعية حول السجلات وسهولة القراءة

علم الطب الشرعي ليس مجرد كومة من الحقائق؛ إنه أيضًا مشكلة عرض. يحتاج العملاء إلى تحذيرات وبصمات وتواريخ وتنبيهات مرتبة بحيث يكون الإجراء الآمن واضحًا تحت الضغط. تنتمي ملاحظة الطباعة التالية إلى ذلك الجسم العام من الأدلة لأن شكل الإشعار يمكن أن يغير ما إذا كان القراء يحافظون على الإشارة أو يمحونها.

مطبقة على تدوير مفتاح المضيف، النقطة العملية بسيطة: يجب أن تكون البصمة والخوارزمية المتأثرة والنافذة الزمنية ومسار الأمر الآمن متميزين بصريًا عن السياق والطمأنة. إشعار يدفن المادة الرئيسية داخل تخطيط تسويقي أو نثر حالة غامض يرفع فرصة أن يلصق العملاء الإدخال الخاطئ أو يتخطون التحقق. ينطبق نفس الانضباط على كتيبات التشغيل الداخلية. يجب أن يرى المطور تحت ضغط الإصدار حالة التوقف والمصدر المعتمد والبصمة الدقيقة وقاعدة المراجع قبل رؤية السرد الخلفي.

المساءلة بالتحكم، وليس بالشعار

كانت لـ GitHub الحصة الأكبر من التحكم الوقائي. تحكمت في توليد وتخزين واستخدام وتقاعد مفتاح المضيف الخاص. تحكمت في خدمة المستودع التي ظهر عليها المفتاح. تحكمت في ميزات أمان المنتج التي يمكنها كشف أو حظر المفاتيح الخاصة، حتى لو لم يظهر السجل العام أيًا منها. تحكمت في خطة التدوير والإعلان الموثوق وصفحة البصمة وبيانات API وتوجيهات الدعم وتحديثات إجراءات الطرف الأول. كما تحكمت في مقدار التفاصيل التي تنشرها بعد الاحتواء.

كان لدى GitHub أيضًا سلطة تقديرية طارئة مبررة. ترك مفتاح مضيف خاص ربما تم نسخه في الخدمة لتجنب احتكاك العملاء كان سيحافظ على مسار انتحال. النقد الصحيح ليس أن المنصة تحركت بقوة زائدة. بل إن السلطة الطارئة يجب أن تقترن بأدلة الاستعداد: تدوير تم التدرب عليه، ضوابط نشر تم التحقق منها، رسائل متسقة، وحساب بعد الحادث للتغيير الدائم.

تحكم العملاء في استهلاك ثقتهم الخاص. قرروا ما إذا كانوا سيستخدمون SSH أو HTTPS، وما إذا كانوا سيثبتون مفاتيح مضيف RSA، وما إذا كانوا سيتعلمون خوارزميات مفتاح مضيف بديلة، وما إذا كانوا سيديرون known-hosts مركزيًا، وما إذا كانوا سيضمون المفاتيح في الصور، وما إذا كانوا سيثبتون التزامات الإجراءات، وما إذا كانوا سيحافظون على مرآة، وما إذا كان مسموحًا للمطورين بتجاوز الفحص الصارم. هذه الخيارات لا تعفي من تعرض مفتاح المزود. إنها تحدد مقدار ما يتحول من حدث جانب المزود إلى توقف العميل أو تعافي غير آمن.

تحكم مسؤولي CI وبائعي التكامل في مواد الثقة المضمنة وقنوات التحديث. أداة تخفي مفاتيح المضيف للراحة يجب أن تكشف عن طريقة آمنة لتحديثها. أداة تعتمد على المسح المباشر يجب أن تحذر المستخدمين بشأن التحقق. أداة تثبت التبعيات للنزاهة يجب أن تجعل المراجعة الطارئة سريعة بما يكفي حتى لا يصبح التثبيت الآمن تثبيتًا قديمًا.

تحكمت فرق المشتريات والقانون في حد أكثر هدوءًا. غالبًا ما قبلوا شروط المنصة دون رسم الخرائط أي الضوابط يمكن للبائع أن يمارسها وحده. سؤال مراجعة العقد الأفضل ليس فقط ما إذا كانت الأضرار محدودة. بل ما هي الحقائق التشغيلية التي سيفصح عنها المزود خلال حدث ثقة، وكيف سيوثق العملاء الإشعارات الطارئة، وما إذا كانت مسارات الدعم متاحة للتدويرات الحساسة للأمان، وما هي الأدلة التي سيتم تسليمها بعد الإصلاح.

المهاجمون، إذا استخدم أي منهم المفتاح، سيكونون مسؤولين عن انتحال الهوية أو الاعتراض. السجل العام لا يثبت مثل هذا الاستخدام. مشغلو الشبكات ومزودو DNS وغيرهم من المشاركين في قناة الثقة قد يكونون مهمين في الاستغلال الافتراضي، لكن الحقائق التي تم مراجعتها لا تظهر فشلهم في هذا الحدث.

كيف سيبدو الإصلاح القابل للتحقق

سجل التحكم الناضج بعد هذا الحدث لن يكون وعدًا بأنه لن يتم كشف أي مفتاح مضيف أبدًا. سيكون دليلاً على أن فئة الفشل أصبحت أصعب في التكرار وأسهل في التعافي منها بأمان.

للحفظ، يجب أن تكون GitHub قادرة على إظهار أن مفاتيح المضيف الخاصة بالإنتاج لا يمكنها دخول المستودعات العادية أو محطات عمل المطورين أو السجلات أو تركيبات الاختبار أو القطع الأثرية للبناء إلا من خلال مسار كسر زجاج موثق. قد يتضمن هذا الدليل ضوابط توليد المفاتيح وسجلات الوصول وقيود التصدير وتغطية المسح ومحفزات الإبطال التلقائي. لا يحتاج الغرباء إلى كل التفاصيل الحساسة. يحتاجون إلى تأكيد كافٍ لمعرفة أن الإصلاح لم يقتصر على استبدال مفتاح واحد.

للكشف، يجب أن تكون GitHub قادرة على إظهار الوقت من النشر إلى التنبيه، ومن التنبيه إلى الاحتواء، ومن الاحتواء إلى قرار التدوير، ومن قرار التدوير إلى إشعار العميل. يجب أن تكون قادرة أيضًا على تحديد أنواع أدلة الاسترجاع التي تمت مراجعتها وما هي حدود الرؤية المتبقية. "لا سبب للاعتقاد بإساءة الاستخدام" هو بيان شركة ذو معنى، لكنه ليس نفس الشيء مثل أساس كشف منشور.

للاستجابة، يجب على GitHub اختبار تدوير مفتاح المضيف كتمرين عادي. يدعم OpenSSH آليات مثل UpdateHostKeys بعد المصادقة بمفتاح موثوق بالفعل، موثق على source: man.openbsd.org، لكن حدود التعرض الطارئ تتداخل مع الوقت. لا يزال بإمكان المزود التدرب على إشعار العميل وتحديثات API ورسائل الحالة وتكاملات الطرف الأول وبرامج الدعم. سيقيس تمرين نظيف ما إذا كان يمكن للعملاء التحديث دون تعطيل الفحص.

بالنسبة للعملاء، الإصلاح القابل للتحقق يعني الاحتفاظ بمخزون لجميع مواد ثقة GitHub وجميع سير العمل التي تستخدم SSH. يعني معرفة أي الوظائف تستخدم actions/checkout مع SSH، وأيها مثبتة، وأي الصور الأساسية تحتوي على ملفات known-hosts، وأي مسارات الإصدار يمكنها التبديل إلى HTTPS. يعني تسجيل إخفاقات مفتاح المضيف كأحداث أمنية، وليس مجرد ضوضاء بناء. يعني حفظ الأدلة قبل تحرير ملفات الثقة.

بالنسبة للشركات الصغيرة والمتوسطة، يجب أن يظل الإصلاح بسيطًا. كتيب تشغيل قصير، وHTTPS عن بعد تم اختباره، ومرآة للمستودعات الحيوية، ومراجع ثانٍ لتغييرات مفتاح المضيف، وإشعارات أمان مشترك قد تكون كافية للعديد من الشركات. النقطة المركزية ليست إزالة الاعتماد على GitHub. بل جعل الاعتماد مرئيًا بما يكفي بحيث لا يجبر إصلاح ثقة المزود على الارتجال.

سلسلة فشل العميل الصغير

نسخة العميل الصغير من هذا الحدث غالبًا ما تكون الأقل ظهورًا لأنها تنتج عددًا قليلاً من التقديمات العامة ولا يوجد عدد موحد للحوادث. يصل مطور إلى خط أنابيب فاشل. يذكر الخطأ مفتاح مضيف متغير. الإصدار متأخر بالفعل. قد يكون إشعار الأمان متاحًا، لكن الشخص الذي يقرأه عليه مقارنة البصمات وتحديث ملف ثقة وإعادة تشغيل وظيفة وشرح التأخير لعميل أو مدير. إذا لم يكن لدى المنظمة كتيب تشغيل، يتنافس المسار الآمن مع حل بديل من سطر واحد منسوخ من إجابة منتدى قديمة.

هنا تصبح اقتصاديات أدوات المطور دليل مساءلة. تقلل GitHub تكلفة التشغيل للفرق الصغيرة عن طريق استضافة المستودعات وسير العمل التعاوني وطلبات السحب والمشكلات والحزم والأتمتة المستضافة في مكان واحد. قد توفر شركة صغيرة سنوات من عمل البنية التحتية بالاعتماد على تلك المنصة. ثمن التوفير هو أن تغييرات ثقة المزود تصل كأحداث تشغيلية محلية. لا تتفاوض الشركة على جدول تدوير مفتاح المضيف. تتفاعل مع واحد.

التحكم الأول لمثل هذه الشركة هو وضوح ما قبل القرار. لا ينبغي تعيين تحذير مفتاح المضيف للشخص صاحب الرغبة الأقوى في جعل الإصدار يمر. يجب تعيينه لمالك أمان أو إصدار محدد مسبقًا، حتى لو كان ذلك المالك هو واحد من مهندسين اثنين فقط. يجب على المنظمة الاحتفاظ بمصدر بصمة المزود الدقيق وقاعدة الموافقة الداخلية وخطة التراجع في سجل قصير. النقطة ليست طقوسًا. إنها إزالة الحاجة إلى اختراع حكم تحت الضغط.

التحكم الثاني هو التعافي المنفصل. شخص واحد يتحقق من إشعار المزود والبصمة عبر قناة HTTPS. شخص آخر يطبق التغيير من خلال إدارة التكوين أو التزام تمت مراجعته. إذا كان الفريق صغيرًا جدًا بحيث لا يوجد شخصان على اتصال، فإن البديل هو تأخير الإصدار حتى يتوفر مراجع ثانٍ، باستثناء التصحيحات الطارئة المحددة. هذا ليس لأن شخصين دائمًا أكثر دقة. بل لأن فعل فصل التحقق عن التطبيق يمسك بالاختصار غير الآمن الأكثر شيوعًا: الثقة بالمفتاح الذي يقدمه مسار SSH المتنازع عليه.

التحكم الثالث هو انضباط النقل. يمكن أن يحافظ احتياطي HTTPS على التسليم عندما يتم إصلاح ثقة مضيف SSH، لكن يجب أن يكون مهيئًا مسبقًا ببيانات اعتماد محدودة. تبديل متسرع يستخدم رمزًا شخصيًا واسعًا أو يكشف عن بيانات اعتماد في سجل بناء يستبدل حادثًا بآخر. يجب اختبار الاحتياطي قبل حدث المزود، بأذونات كافية لجلب أو دفع المستودع المحدد ولا أكثر.

التحكم الرابع هو الاحتفاظ بالأدلة. يجب حفظ سجلات CI الفاشلة وتحذيرات مفتاح المضيف والطوابع الزمنية قبل التحرير. إذا اشتبه عميل لاحقًا في اعتراض أو احتاج إلى إثبات أن نشرًا فاشلًا ناتج عن تدوير المزود، فإن الأدلة المحلية الممحاة ستجعل الإجابة أضعف. قد يكون لدى GitHub سجلات جانب الخادم لنشاط Git الناجح، لكن مصافحة SSH المرفوضة قد لا تصل أبدًا إلى الخدمة كحدث Git. سجلات العميل جزء من السجل.

هذه الضوابط متواضعة. لا تتطلب مركز عمليات أمنية مؤسسي. تتطلب الاعتراف بأن هوية المضيف هي تكوين إنتاج. بمجرد وجود هذا الاعتراف، يمكن إدارة تكلفة تدوير المفتاح كتغيير صغير بدلاً من أزمة يتم فيها تعطيل الضوابط الأمنية لجعل العمل أخضر.

يجب على المشتريات طلب دليل على التدوير

غالبًا ما تطلب المشتريات من بائعي السحابة وأدوات المطورين أرقام وقت التشغيل وشروط معالجة البيانات وشهادات الأمان وبنود إشعار الحوادث. يشير حدث مارس 2023 إلى طلب أدلة أكثر تحديدًا لمنصات سلسلة توريد البرمجيات: أظهر كيف يتم تدوير كائنات ثقة العملاء وكيف يوثق العملاء الاستبدال.

لا يجب أن يطلب الطلب تصاميم داخلية سرية. يجب أن يسأل ما إذا كانت مفاتيح الإنتاج الخاصة مقيدة بالتصدير، وما إذا كان التدوير الطارئ قد تم التدرب عليه، وما هي قنوات العملاء المستخدمة لمواد المفاتيح الموثقة، وأي تكاملات الطرف الأول تضم هويات المضيف، وكيف يتم الحفاظ على تناسق رسائل الحالة وإشعارات الأمان، وما إذا كان العملاء يتلقون حسابًا بعد الحادث للضوابط المتغيرة. هذه ليست أسئلة غريبة. إنها الواجهة التشغيلية بين سلطة البائع واعتماد العميل.

يمكن للغة العقد أيضًا تسمية واجبات العميل دون التظاهر بأن العميل يتحكم في مفتاح المنصة. يمكن لبند متوازن أن يقول إن المزود سينشر مواد استبدال موثقة ونطاق الخدمة المتأثر على الفور، بينما سيحتفظ العميل بعملية لتحديث مخازن الثقة الخاصة به والحفاظ على الفحص الصارم. هذا لا يزيل نزاعات المسؤولية. يعطي كلا الجانبين مسارًا ممارسًا.

نفس الأدلة تنتمي إلى سجلات المخاطر الداخلية. شركة تقول إن GitHub ليست حاسمة لأنه يمكن استنساخ الكود في مكان آخر يجب أن تختبر هذا الادعاء. هل يمكنها استعادة المستودعات وقواعد الفرع المحمية وقطع الإصدار وتعريفات سير العمل ومفاتيح النشر وتاريخ المشكلات ومراجع الحزم وأذونات الفريق في مكان آخر بسرعة كافية لأعمالها؟ إذا لم يكن الأمر كذلك، فإن GitHub حاسمة بما يكفي لتبرير تخطيط تدوير الثقة حتى لو تنصل العقد من ضمانات توفر واسعة.

يجب أن يختبر الاختبار قناة الإشعار نفسها. إذا كان الأشخاص الوحيدون الذين يمكنهم الموافقة على تغيير مفتاح المضيف يمكن الوصول إليهم من خلال نظام دردشة أو تدفق تسجيل دخول واحد أو لوحة نشر تعتمد على نفس حدث المنصة، فإن خطة التعافي دائرية. تحتاج تغييرات الثقة الطارئة إلى مصدر موثق، وكتيب تشغيل قابل للقراءة دون اتصال، ومسار مراجع لا يزال موجودًا عندما تكون أدوات المطور متدهورة.

التقييم النهائي

الحدث المؤكد كان متوسط التأثير وعالي الثقة. خلق تعرض مفتاح المضيف الخاص RSA خطر انتحال معقول لعملاء SSH الذين ما زالوا يثقون في ذلك المفتاح والذين يمكن تحويل مسار شبكتهم. كان تدوير GitHub حكيمًا ومحدودًا وموثقًا علنًا. السجل الذي تمت مراجعته لا يظهر سرقة مستودع عميل أو اختراق بنية GitHub التحتية أو تعرض مفتاح خاص للمستخدم أو إساءة استخدام مؤكدة لمفتاح المضيف القديم.

نتيجة المساءلة أكثر حدة من حجم الحادث. تجاوز تحكم GitHub التشغيلي في هوية مضيف مشتركة الحماية العملية التي يمكن للعملاء شراؤها في الشروط العادية. يمكن للعملاء قراءة العقد، لكنهم لم يتمكنوا من فحص مسار حفظ المفتاح. يمكنهم قبول إخلاء المسؤولية، لكن كان لا يزال عليهم إيقاف البناء عندما تغيرت هوية المضيف. يمكنهم امتلاك مستودعاتهم، لكن حدث مفتاح جانب المزود يمكن أن يحدد ما إذا كان نظام الإصدار لديهم يثق في المصدر.

هذا هو عدم التطابق بين العقد والتحكم: تصف المستندات القانونية علاقة خدمة؛ كشف الحادث عن اعتماد تشغيلي. لذلك تنتمي المساءلة إلى نقطة التحكم العملي. كان على GitHub الحفظ والتدوير السريع والإشعار الدقيق وأدلة الإصلاح. كان على العملاء التحقق الصارم ومخزون الثقة وتخطيط الاستمرارية. الفرق بين هذه الواجبات ليس مجردًا. في الساعة 05:00 UTC يوم 24 مارس 2023، كان الفرق بين توقف آمن ولصق غير آمن.