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

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

في سلسلة منشورات المدونة هذه، سنركز على Linux لأنه نظام التشغيل السائد في السحابة. سنغطي ثلاث تقنيات مختلفة لجذور Linux الجذرية: اختطاف الرابط الديناميكي (LD_PRELOAD)، والجذور الخفية لوحدة Linux Kernel (LKM)، والجذور الخفية لـ eBPF. أولاً، سوف نستكشف تقنية rootkit الخاصة بـ userland، LD_PRELOAD. سنقوم بوصفها، وتقديم أمثلة على استخدامها في البرية، وشرح كيفية اكتشافها.

قبل أن نتعمق في التقنية نفسها، دعونا أولاً نفهم ما هي رابط ديناميكي لينكس يكون.

في أنظمة التشغيل الحديثة مثل Windows وLinux، يمكن ربط البرامج بشكل ثابت أو ديناميكي. يتم تجميع الثنائيات المرتبطة بشكل ثابت مع كافة التبعيات (المكتبات) اللازمة للتنفيذ. تستخدم الثنائيات المرتبطة ديناميكيًا المكتبات المشتركة الموجودة على نظام التشغيل. سيتم حل هذه المكتبات وتحميلها وربطها في وقت التشغيل. مكون Linux المسؤول عن هذه العملية هو رابط ديناميكي، المعروف أيضًا باسم ld.so أو ld-linux.so.*.

التحقق من ذلك بنفسك:

دعونا ننظر إلى ls ثنائي.

1. ال ldd يسمح لنا الأمر بفحص تبعيات ELF والمكتبات المشتركة. افتح المحطة الخاصة بك وقم بتشغيلها ldd ls. في الإخراج، يمكننا أن نرى أن ls ثنائي الاستخدامات libselinux, libc، و libpcre المكتبات. أول تبعية مدرجة هي الكائن الديناميكي المشترك الظاهري، وهي مكتبة مشتركة مدمجة يتم تعيينها تلقائيًا في مساحة العنوان لجميع تطبيقات مساحة المستخدم بواسطة النواة. آخر تبعية مدرجة هي موقع الرابط الديناميكي.

إخراج “ldd ls”.

2. بعد ذلك، اركض strace ls. في strace الإخراج أدناه، يتم تحميل المكتبات في الذاكرة عند التنفيذ.

إخراج “strace ls”.

إذا ألقينا نظرة أخرى على الإخراج، فإن النظام يتحقق من وجود /etc/ld.so.preload (خمسة أسطر فوق المربع الأحمر الأول) قبل libselinux يجري تحميلها. وهذا يقودنا إلى القسم التالي حول LD_PRELOAD.

يوفر رابط Linux الديناميكي قدرة كبيرة تسمى LD_PRELOAD. LD_PRELOAD يحمل قائمة بالكائنات المشتركة ELF المحددة بواسطة المستخدم. فهو يمكّن المستخدمين من تحميل هذه الكائنات المشتركة في مساحة عنوان العملية قبل أي مكتبة مشتركة أخرى وقبل تنفيذ البرنامج نفسه. تخدم هذه الميزة أغراضًا متعددة، بما في ذلك تصحيح الأخطاء والاختبار وأدوات وقت التشغيل، ويمكن استخدامها عن طريق الكتابة إلى /etc/ld.so.preload الملف أو الاستفادة من LD_PRELOAD متغير البيئة.

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

التحقق من ذلك بنفسك:

عند فحص ls كود المصدر، يمكننا أن نرى استخدام libc‘s readdir وظيفة. ls يقرأ إدخالات الدليل واحدًا تلو الآخر باستخدام الملف readdir وظيفة داخل حلقة.

`ls` مقتطف التعليمات البرمجية المصدر

ال readdir تقوم الدالة بإرجاع مؤشر إلى بنية مباشرة تحتوي على معلومات حول إدخال الدليل، مثل الاسم. بمجرد إرجاع NULL، فإنه يشير إلى نهاية الدليل.

لنقم بإنشاء مكتبة تقوم بتعديل ملف readdir وظيفة لإخفاء ملف يسمى “malicious_file”، وتجميعه، وإضافته إليه LD_PRELOAD:

1. قم بإنشاء الدليل /tmp/working-dir-test وانسخ الكود أدناه إلى hijackls.c الملف تحت هذا الدليل:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <dirent.h>
#include <string.h>
// Function pointer typedef for the original readdir ls function
typedef struct dirent* (*ls_t)(DIR*);
// Interposed ls function
struct dirent* readdir(DIR* dirp) {
  // Get the original readdir address
  ls_t original_readdir = (ls_t)dlsym(RTLD_NEXT, "readdir");
  struct dirent* entry;
  do {
    // Call the original ls function to get the next directory entry
    entry = original_readdir(dirp);
    // Check if the entry is the file we want to hide
    if (entry != NULL && strcmp(entry->d_name, "malicious_file") == 0) {
      // Skip the file by calling the original ls function again
      entry = original_readdir(dirp);
    }
  } while (entry != NULL && strcmp(entry->d_name, "malicious_file") == 0);
  return entry;
}

في كود مكتبة التحميل المسبق أعلاه، نحدد ملف readdir وظيفة تعمل كوظيفة متداخلة ويتم استدعاؤها بدلاً من الوظيفة الأصلية readdir عندما ls يتم تنفيذ الأمر. ضمن مداخلتنا readdir وظيفة، نحصل على عنوان الأصلي readdir وظيفة باستخدام dlsym، ثم اتصل به للحصول على إدخال الدليل التالي. نقوم بمقارنة اسم كل إدخال بـ “malicious_file” وتخطيه إذا كان مطابقًا، مما يؤدي إلى إخفاء هذا الملف بشكل فعال من ls الإخراج.

dlsym يسمح لنا بالحصول على عنوان دالة داخل كائن/مكتبة مشتركة في وقت التشغيل. استخدام مقبض RTLD_NEXT للداخل com.dlsym، يمكننا العثور على الأصل واستدعاءه readdir وظيفة.

2. قم بتجميع التعليمات البرمجية إلى كائن مشترك: gcc -shared -fPIC -o /tmp/working-dir-test/libhijackls.so /tmp/working-dir-test/hijackls.c -ldl.

3. قم بإنشاء دليل تحت tmp واملأها بالعناصر: mkdir /tmp/ld-preload-test && cd /tmp/ld-preload-test && for i in file_1 file_2 malicious_file; do touch $i; done;.

4. اركض ls وفحص كافة إدخالات الدليل.

5. التصدير LD_PRELOAD إلى موقع الكائن المشترك: export LD_PRELOAD=/tmp/working-dir-test/libhijackls.so.

6. اركض ls مرة أخرى. سترى أننا نجحنا في اختطاف readdir الدالة ولا يحتوي الإخراج على “ملف_خبيث”.

7. وأخيرًا، قم بإلغاء تعيين متغير البيئة عن طريق التشغيل unset LD_PRELOAD.

الفرق بين LD_PRELOAD و /etc/ld.so.preload

/etc/ld.so.preload هو ملف تكوين على مستوى النظام ينطبق على جميع العمليات ويؤثر على النظام بأكمله. يتطلب الوصول إلى هذا الملف أذونات الجذر. LD_PRELOADومن ناحية أخرى، فهو متغير بيئة يسمح للمستخدمين الفرديين بتحديد المكتبات التي سيتم تحميلها مسبقًا لأمر أو أمر قابل للتنفيذ محدد على أساس كل عملية. لذلك، لا تحتاج إلى أن تكون الجذر لاستخدامه. المكتبات التي تم تعريفها بواسطة LD_PRELOAD يتم تحميلها قبل تلك الموجودة /etc/ld.so.preload.

الاستخدام في البرية

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

  • وينتي لنظام التشغيل Linux – يتكون هذا التهديد المنسوب للصين من وضع المستخدم LD_PRELOAD rootkit والباب الخلفي الرئيسي. يعتمد برنامج rootkit في وضع المستخدم بشكل كبير على المصدر المفتوح عزازيل rootkit. يُستخدم Azazel لإخفاء العمليات واتصالات الشبكة والملفات والأدلة، ويحتوي أيضًا على إمكانات الباب الخلفي. استفاد Winnti لنظام التشغيل Linux من Azazel لإخفاء النشاط الضار للباب الخلفي الرئيسي.

  • تيم تي ان تي – تستخدم هذه المجموعة libprocesshider في حملات مختلفة. Libprocesshider هي أداة مفتوحة المصدر مصممة لإخفاء عمليات معينة من أدوات قائمة العمليات شائعة الاستخدام مثل ps وtop وlsof عن طريق الكتابة فوق readdir وظيفة. مكنت هذه التقنية فريق TeamTNT من إخفاء تعدين XMRig والعمليات الضارة الأخرى.

  • سيمبيوت – على عكس الأمثلة السابقة حيث كان برنامج rootkit عبارة عن قطعة أثرية جانبية مفتوحة المصدر مسؤولة عن إخفاء أنشطة الحملة الضارة الأخرى، فإن Symbiote عبارة عن باب خلفي وجذور خفية مكتوبة من الصفر. يخفي Symbiote نشاطه الضار عن طريق ربط الوظائف به libc و libpcap. ويستخدم أيضًا هذه الإمكانات لجمع بيانات الاعتماد عن طريق التثبيت libc‘s read الوظيفة والتحقق مما إذا كانت العملية التي تستدعيها كذلك ssh أو scp. يعمل Symbiote على تعزيز قدرات rootkit الخاصة به للوصول عن بعد إلى الجهاز عن طريق ربط وظائف وحدة المصادقة القابلة للتوصيل بنظام Linux (PAM) وتجاوز آلية المصادقة من خلال مطابقة كلمة المرور المشفرة.

  • مدار – OrBit عبارة عن برنامج rootkit لاختراق الروابط الديناميكية، ويتكون من قطارة وكائن مشترك ضار. تم تكليف القطارة بالتأكد من تحميل الكائن المشترك قبل أي كائن آخر. للتأكد من ذلك، يستخدم OrBit طريقتين: إضافة مسار الكائن إلى /etc/ld.so.preload وتصحيح الملف الثنائي للمحمل عن طريق استبدال سلسلة /etc/ld.so.preload إلى مسار مخصص توفره البرامج الضارة. على غرار Symbiote، تعمل خطافات OrBit في libc, libpcapmو PAM لجمع بيانات الاعتماد، وتجنب الكشف، واكتساب الثبات، وتوفير الوصول عن بعد.

كشف LD_PRELOAD إساءة

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

  • ل /etc/ld.so.preload: سيتم كتابة التغييرات في الملف على القرص. يوصى بفحص هذا الملف بلقطة صورة. إذا لاحظت وجود مسار مكتبة غير عادي، قم بفحصه.

  • ل LD_PRELOAD: البحث عن العمليات المنفذة بطريقة غير متوقعة LD_PRELOAD متغير البيئة (توجد كافة متغيرات البيئة لكل عملية ضمن ملف /proc/{pid}/environ file). إذا لاحظت وجود مسار مكتبة غير شائع، قم بفحصه.

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

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

  • استخدم أدوات مثل إظهار. يستخدم Unhide تقنيات القوة الغاشمة المختلفة للكشف عن العمليات المخفية.

علاوة على ذلك، يكتشف مستشعر وقت التشغيل Wiz LD_PRELOAD الهجمات. راجع المثال التالي للتنبيه الذي يوضح بالتفصيل التعديل الذي تم إجراؤه /etc/ld.so.preload:

مستشعر وقت التشغيل Wiz

يتعلم أكثر حول مستشعر وقت تشغيل Wiz.

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

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

ترقبوا الجزء الثاني من هذه السلسلة، حيث سنتعمق في الجذور الخفية لوحدة Linux Kernel (LKM).

تمت كتابة منشور المدونة هذا بواسطة Wiz Research، كجزء من مهمتنا المستمرة لتحليل التهديدات التي تواجه السحابة، وبناء آليات تمنعها وتكتشفها، وتقوية استراتيجيات أمان السحابة.

شاركها.
اترك تعليقاً