كود القشرة

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

أنواع كود القشرة

يمكن أن يكون كود القشرة إما محلي أو عن بُعد، ويعتمد ذلك على ما إذا كان يتيح للمهاجم السيطرة على الماكينة التي يعمل عليها (محلي) أو على ماكينة أخرى عبر الشبكة (عن بُعد).

محلي

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

عن بُعد

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

التنزيل والتنفيذ

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

مُقسّم مرحليًا

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

أسلوب البحث عن البيض

هذا نوع آخر من كود القشرة المُقسّم مرحليًا، والذي يتم استخدامه إذا ما تمكن أحد المهاجمين في حقن كود قشرة أكبر داخل العملية لكن يتعذر عليها تحديد أين ستنتهي داخل العملية. ويتم حقن كود قشرة البحث عن البيض داخل العملية عند موقع يمكن التنبؤ به ثم يتم تنفيذه. ويقوم ذلك الكود بعد هذا بالبحث عبر مساحة عنوان العملية عن كود القشرة الأكبر (البيضة) ثم تنفيذه.

الأومليت

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

إستراتيجية تنفيذ كود القشرة

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

ترميز كود القشرة

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

ترميز النسبة المئوية

تعمل الهجمات التي تستهدف المتصفحات في العادة على ترميز كود القشرة في سلسلة JavaScript باستخدام ترميز النسبة المئويةأو ترميز "/uXXX" أو ترميز الكيان. وتقوم بعض الهجمات كذلك بالتشويش على سلسلة كود القشرة الذي تم ترميزه للحيلولة دون اكتشافه من قبل نظام اكتشاف التطفل IDS.
على سبيل المثال، في الهيكل أي إيه-32، إليك الصورة التي ستبدو عليها تعليمات NOP (بدون تشغيل)، حيث لا يتم ترميزها أولاً:
90             NOP
90             NOP
ثم يتم بعد ذلك ترميزها إلى سلسلة تستخدم ترميز النسبة المئوية (باستخدام وظيفة unescape() لفك التشفير).
unescape("%u9090");
ويتم بعد ذلك ترميزها في سلسلة باستخدام ترميز "uXXX":
"\u9090";
وأخيرًا، يتم ترميزها داخل سلسلة باستخدام ميزة ترميز الكيان:
"邐"
أو
"邐"

كود القشرة بدون قيم خالية

تتم كتابة أغلب أكواد القشرة دون استخدام وحدات بايت ذات قيمة خالية لأنها تهدف لأن يتم حقنها داخل عملية مستهدفة من خلال سلاسل تنتهي بقيمة خالية. وعند نسخ سلسلة تنتهي بقيمة خالية، فسيتم نسخها حتى تشمل أول قيمة خالية إلا أنها لن تعالج وحدات البايت التالية من كود القشرة. وعند حقن كود القشرة الذي يشتمل على قيم خالية بهذه الطريقة، فسيتم حقن جزء واحد فقط من كود القشرة، مما يجعله غير قادر على العمل بنجاح.
لإنتاج كود قشرة بدون قيم خالية من كود قشرة يشتمل على وحدات بايت ذات قيمة خالية، يمكن استبدال تعليمات الماكينة التي تشتمل على أصفار بتعليمات لها نفس التأثير لكنها بدون قيم خالية. على سبيل المثال، في هيكل أي إيه-32 يمكن استبدال هذه التعليمات:
B8 01000000    قائمة أوامر إكس 86 EAX,1          // يضبط المسجل EAX عند قيمة 0x000000001
والتي تشتمل على أصفار كجزء من تكوينها الحرفي (يتوسع 1 ليصير 0x00000001) عبر تلك التعليمات:
33C0           XOR EAX,EAX        // يضبط المسجل EAX عند قيمة 0x000000000
40             INC EAX            // يزيد المسجل EAX إلى 0x00000001
والتي تتمتع بنفس التأثير لكنها تحتاج لوحدات بايت أقل للترميز كما أنها بدون قيم خالية.

كود قشرة أبجدي رقمي قابل للطباعة

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

كود قشرة دليل يونيكود

تستخدم البرامج الحديثة سلاسل يونيكودللسماح بتدويل النص. ومع ذلك، ستقوم تلك البرامج بتحويل سلاسل أسكي إلى يونيكود قبل معالجتها. وتستخدم سلاسل يونيكود التي تم ترميزها في UTF-16 وحدتي بايت لترميز كل رمز (أو أربعة بايت لبعض الرموز الخاصة). وعند تحويل سلسلة UTF-16 إلى UTF-16، يتم إدخال وحدة بايت صفرية بعد كل بايت في السلسلة الأصلية. وقد أثبت Obscou في مجلة ]]Phrack 61[[ أنه بالإمكان كتابة كود قشرة بمقدوره أن يعمل بنجاح بعد عملية التحويل هذه. وهناك برامج يمكنها ترميز أي كود قشرة إلى كود قشرة دليل UTF-16، وذلك استنادًا لنفس مبدأ جهاز فك الترميز الصغير ذاتي التعديل الذي يفك ترميز كود القشرة الأصلي.

الأنظمة الأساسية

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