توكن GitHub بقي مكشوفًا 3 سنوات داخل سجل بناء صورة Docker لدى Baseten
حذف ملف الأسرار بعد البناء لا يمحو شيئًا إذا كانت قيمة التوكن قد كُتبت في أمر البناء نفسه، لأنها تُحفظ في بيانات الصورة الوصفية لا في طبقاتها.
نشرت شركة Strix في 1 سبتمبر 2026 تحقيقًا عن ثغرة لدى منصة Baseten، وصل إلى صدارة Hacker News في 15 سبتمبر. كان أحد مستودعات صور الحاويات لدى الشركة، من نوع Harbor، يسمح بتنزيل الصور دون مصادقة. وفي بيانات إحدى الصور كان هناك توكن GitHub لحساب آلي اسمه basetenbot، مكتوب منذ خطوة بناء بتاريخ 3 مارس 2023.
كان التوكن يمنح صلاحيات admin وpush على 3 مستودعات، إضافة إلى القراءة والكتابة على مستودعات خاصة فيها عمل لعملاء. أُرسل البلاغ في 13 يوليو 2026 في الحادية عشرة ليلًا، وغُيّر التوكن في 14 يوليو الساعة 4:34 عصرًا. أي أن الاستجابة كانت سريعة، لكن التوكن ظل قابلًا للقراءة من الخارج نحو 3 سنوات.
لماذا لا يكفي حذف الملف
تحتوي كل صورة Docker على ملف إعداد فيه حقل history، يُسجَّل فيه نص كل خطوة من خطوات الـ Dockerfile. فإذا تضمن أمر RUN متغيرًا يحمل توكن، يستبدل الـ shell المتغير بقيمته قبل التنفيذ، وتُحفظ القيمة الفعلية في هذا السجل.
لذلك لا يفيد حذف ملف الأسرار في خطوة لاحقة. المشكلة ليست في الملف بل في السطر نفسه، وهذا السطر محفوظ في البيانات الوصفية للصورة، لا في طبقاتها.
ويستطيع أي فريق يبني صورًا خاصة به أن يرى هذه الأسطر كما هي عبر أمر docker history، المذكور في توثيق Docker. وإذا ظهرت فيها قيمة توكن صريحة، فالوضع مماثل. ويوفر Docker آلية مخصصة لتمرير الأسرار وقت البناء عبر BuildKit، تتيح استخدامها دون أن تُكتب في سجل الصورة.
الحادثة تذكير بأن الصورة المنشورة تحمل تاريخ بنائها معها، وأن ما كُتب في ذلك التاريخ يبقى متاحًا لكل من يستطيع تنزيلها.