الخلاصة

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

الترويسة في HTTP تصف طلباً. ومتغير البيئة يصف سياق عملية. وتعريف الدالة شفرة. جمع Shellshock هذه المعاني الثلاثة في سلسلة قصيرة، فتحولت المعلومة إلى قدرة على الفعل.

كانت الخطوة الأولى موثقة في RFC 3875. يستطيع CGI عرض حقول ترويسة HTTP كمتغيرات وصفية تبدأ بـHTTP_، وفي Unix تمر هذه المتغيرات إلى النص التنفيذي كمتغيرات بيئة تحمل الأسماء نفسها. كان ذلك نقل بيانات مقصوداً، لا تنفيذ أوامر بحد ذاته.

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

المسار الفعلي هو: ترويسة بعيدة، متغير CGI، بيئة موروثة، بدء Bash، استيراد دالة، ثم تنفيذ. سقوط أي حلقة يغلق المسار نفسه. لذلك لم يكن تعداد الأجهزة التي تحتوي Bash مقياساً صالحاً للانكشاف. وثق CERT/CC وRed Hat أمثلة شملت CGI وبعض إعدادات SSH ذات الأوامر المقيدة ومسارات معينة لعملاء DHCP.

ظهر CVE-2014-6271 علناً في 24 سبتمبر 2014. نشر CERT/CC مذكرته في اليوم التالي وسجل استغلالاً نشطاً. ثم أوضح Red Hat في 26 سبتمبر أن الإصلاح الأول غير كامل، وحمل السلوك المتبقي المعرّف CVE-2014-7169، قبل أن تُسند معرفات أخرى إلى مشكلات قريبة. في تلك الفترة لم تكن عبارة «تم التصحيح» مفيدة من دون رقم الحزمة ونتيجة اختبار للمسار الحقيقي.

ضيّق التصحيح الأقوى عقد الاستيراد نفسه. وضعت الحزم المحدثة الدوال المصدرة في نطاق اسمي يمكن تمييزه، مثل BASH_FUNC_name(). كلف ذلك بعض التوافق، لكنه فصل بصورة أوضح بين بيانات البيئة العادية والتعريف القابل للتنفيذ.

ولم يكن تحديث القرص كافياً لإثبات تحديث الحالة الحية. أوصى Red Hat بإعادة تشغيل الخدمات التي تستخدم الدوال المصدرة، وقد احتاج المستخدمون إلى تسجيل دخول جديد، كما أمكن لجلسات screen أو tmux الاحتفاظ بتعريفات قديمة. جرد الحزم يصف ما ثُبت؛ لكنه لا يثبت ما تستدعيه شجرة عملية باقية.

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

لا يقول Shellshock إن متغيرات البيئة سيئة في ذاتها. يقول إن الطبقة التي تسمي القيمة «بيانات وصفية» لا تتحكم وحدها في معناها عند المستقبِل. يجب أن يكون موضع اكتساب البيانات لسلطة الفعل مرئياً ومقصوداً.

المصادر