الخلل في ماسح الأسرار الذي لم تستطع طيور الكناري اكتشافه
الشحن
قبل ضغط أي حزمة نبيعها، يمسحها بوابة للبحث عن القيم الفعلية لأسرارنا الخاصة. يبدأ كل مسح بزراعة طيور كناري، نوع واحد من كل نوع، ويرفض العمل ما لم يمسك بها جميعًا. كانت تمسك بها دائمًا. ومع ذلك كان بها خلل.
كيف تقرأ البوابة الأسرار
لا تبحث البوابة فقط عن الأشياء التي تشبه المفاتيح في شكلها. تقرأ الملفات التي تعيش فيها أسرارنا (ملفات env، ملفات إعدادات JSON، ملفات المفاتيح)، وتأخذ كل قيمة يشير اسمها إلى أنها سرية، ثم تبحث في ما نحن على وشك شحنه عن تلك القيم بالضبط، كما هي مكتوبة ورموز Base64.
الخلل
لسطر مثل هذا:
DB_PASSWORD='Tr0ub4dor-and-3' # تم تدويره في مايو
كان القارئ يزيل علامات الاقتباس المحيطة فقط عندما تبدأ القيمة وتنتهي بحرف اقتباس. ومع وجود تعليق بعد القيمة، ينتهي السطر بحرف أبجدي، لذا بقيت علامات الاقتباس. كان يتم قطع التعليق بعد ذلك، وتواصل البوابة البحث عن 'Tr0ub4dor-and-3'، بما في ذلك علامات الاقتباس. كانت الحزمة التي تحتوي على كلمة المرور بدون تلك العلامات ستمر.
لماذا لم تلاحظ طيور الكناري أبدًا
تختبر طيور الكناري شبكة: تزرع قيمة يعرفها الماسح مسبقًا، وتتأكد من العثور عليها. كانت قيم طيور الكناري لدينا تُسلَّم مباشرة إلى الماسح، لذا لم تمر أبدًا عبر الكود الذي يقرأ سطر الإعدادات. تم اختبار كل شبكة، ولم يتم اختبار المحلل الذي يسبقها.
كيف وجدناه
كنا نحوّل البوابة إلى منتج مستقل، وكتبنا اختبارًا يغذيها بملف إعدادات بالأشكال التي يكتبها الناس فعليًا: export، علامات الاقتباس، التعليقات في النهاية. فشل الاختبار على السطر الذي يحتوي على علامات اقتباس وتعليق. يقوم الإصلاح بقراءة القيمة بين علامات الاقتباس حتى علامة الاقتباس الختامية ويتجاهل ما يأتي بعدها.
هل كان لذلك أهمية؟
تحققنا قبل تغيير أي شيء. على جهاز البناء الخاص بنا، تقرأ البوابة 133 قيمة سرية من 59 ملفًا تُعطى لها، وعلى جهاز ثانٍ 499؛ لم يكن أي منها بهذا الشكل. لا تتغير أي أحكام سابقة: كانت كل حزمة أطلقناها تُفحص بحثًا عن نفس القيم التي ستُفحص بحثًا عنها الآن. أصلحنا البوابة على الأجهزة الثلاثة على أي حال.
الخلاصة
إذا استخرج الماسح ما يبحث عنه، فاختبر عملية الاستخراج بمدخلات واقعية، وليس البحث وحده بقيم مُدسّة. تثبت القيمة المرجعية (canary) أن الشبكة تعمل، لكنها لا تقول شيئًا عمّا إذا كانت الأسماك الصحيحة تصل إليها فعلًا. تغطي اختبارات Secret Gate الآن الأمرين معًا، وقبل إصداره تحققنا من أنه يقرأ بالضبط القيم الـ133 نفسها التي يقرأها حاجز البناء لدينا.