Breaking News
القائمة

فريق Google Project Zero يطلق أداة MAccConc لكشف حالات السباق في نواة لينكس

فريق Google Project Zero يطلق أداة MAccConc لكشف حالات السباق في نواة لينكس
100%

يمتلك الآن مطورو نواة لينكس (Linux Kernel) وباحثو الأمن السيبراني الذين يواجهون صعوبة في عزل حالات السباق (Race Conditions) المعقدة أداة قوية جديدة. فقد أصدر فريق Google Project Zero مجموعة أدوات MAccConc المتخصصة في كشف ثغرات التنفيذ المتزامن وتداخلات الوصول إلى الذاكرة باستخدام تتبعات KCOV. وتُعد حالات السباق من أصعب المشكلات التي يمكن إعادة إنتاجها وتصحيحها، حيث تتطلب غالباً إعدادات معقدة لفرض ترتيب تنفيذ محدد.

Advertisement

وتعالج أداة MAccConc هذه المشكلة من خلال توفير واجهات رسومية وطرفية لتصور هذه التداخلات، إلى جانب الاختبار الآلي لترتيبات التنفيذ من نوع A-B-A. وتجدر الإشارة إلى أن هذه الأداة تجريبية ولا تتأهل لبرنامج مكافآت ثغرات البرمجيات مفتوحة المصدر التابع لشركة Google (Google Open Source Software Vulnerability Rewards Program).

متطلبات النواة والمترجم

لاستخدام أداة MAccConc، يجب على الباحثين تجميع نواة مخصصة. ويتطلب ذلك إصداراً من بيئة LLVM برقم 23 أو أحدث، أو بناءً يتضمن التزام dc5c6d008f48. وتتوفر هذه البناءات عبر موقع apt.llvm.org. كما يجب سحب شجرة النواة من فرع kcov-tracing-full عبر مستودع thejh/linux.

وعند تكوين وبناء النواة، يجب تعيين متغيرات محددة كما هو موثق في موقع kernel.org لضمان استخدام سلسلة الأدوات الصحيحة. قم بتعيين متغير البيئة التالي لتوضيح الكتل الأساسية المنفذة وتجنب التباس مكدسات الاستدعاء بسبب تحسين الاستدعاء النهائي:

export KCFLAGS="-fno-optimize-sibling-calls -mllvm -sanitizer-coverage-prune-blocks=false"

تأكد من تعيين علامات تكوين النواة التالية، إما من خلال واجهة التكوين ncurses أو عن طريق لصقها في أسفل ملف.config:

# for core functionality
CONFIG_SMP=y
CONFIG_NR_CPUS=4
CONFIG_KASAN=y
CONFIG_KASAN_OUTLINE=y
CONFIG_KCOV=y
CONFIG_KCOV_EXT_RECORDS=y
CONFIG_KCOV_MEMORY=y
CONFIG_KALLSYMS_ALL=y

# to give the GUI information about source lines and inlining
CONFIG_DEBUG_INFO_DWARF5=y

# for communicating with the GUI
CONFIG_VSOCKETS=y
CONFIG_VIRTIO_VSOCKETS=y
CONFIG_VIRTIO_PCI=y

# for maximizing the potential for race conditions
CONFIG_PREEMPT=y

# for making virtual addresses at runtime the same as in vmlinux
CONFIG_RANDOMIZE_BASE=n

# needed for several samples
CONFIG_TMPFS=y

يمكنك أيضاً تمكين العلامات التالية لاختبار حالات السباق التي تتضمن RCU، على الرغم من أن ذلك سيؤدي إلى تباطؤ كبير ولا يعمل حالياً بشكل صحيح إلا مع واجهة المستخدم الرسومية (GUI):

CONFIG_RCU_EXPERT=y
CONFIG_RCU_STRICT_GRACE_PERIOD=y

إعداد البيئة والإقلاع

صُممت مجموعة الأدوات لتشغيل واجهة المستخدم الرسومية على الجهاز المضيف، بينما تُقلع النواة المخصصة في بيئة ضيف. ويُعد تثبيت أداة kvmtool هو النهج الموصى به بدلاً من استخدام جهاز QEMU الافتراضي القياسي.

git clone https://git.kernel.org/pub/scm/linux/kernel/git/will/kvmtool.git
cd kvmtool
make
make install

بمجرد التثبيت، يمكنك إقلاع النواة المبنية باستخدام الأمر التالي، والذي يوفر واجهة سطر الأوامر (CLI) مع عرض للقراءة فقط لنظام ملفات المضيف المثبت في مسار /host:

lkvm run --kernel [path to kernel tree]/arch/x86/boot/bzImage --vsock 5 --console virtio

بعد كل عملية إقلاع، يجب عليك تثبيت debugfs و tmpfs يدوياً في بيئة الضيف:

sh-5.3# mount -t debugfs none /sys/kernel/debug
sh-5.3# mount -t tmpfs none /tmp
sh-5.3#

كتابة واختبار حالات السباق

تُكتب حالات الاختبار بلغة C ويجب أن تُعرّف أربع دوال محددة لهيكلة مسار التنفيذ. وفي كل عملية تنفيذ، تعمل دالة test_setup() أولاً، تليها دالة test_thread1() ودالة test_thread2() بالتوازي، وتُختتم بدالة test_end().

void test_setup(void) { [...] }
void test_thread1(void) { [...] }
void test_thread2(void) { [...] }
void test_end(void) { [...] }

يجب بناء حالات الاختبار هذه كمكتبات مشتركة على الجهاز المضيف:

$ cc -shared -o [name].so [name].c -fPIC

يمكن أيضاً بناء حالات الاختبار النموذجية المتوفرة في مجلد testcase الخاص بالمستودع عبر أداة make:

$ make testcase/demo-dup-vs-close.so
cc -shared -o testcase/demo-dup-vs-close.so testcase/demo-dup-vs-close.c -Wall

الاختبار الآلي لترتيب A-B-A

تعمل أداة kcov-autorace على أتمتة استكشاف ترتيبات التنفيذ من نوع A-B-A. وفي هذه السيناريوهات، يعمل خيط المعالجة A حتى نقطة محددة، ثم يُنفذ خيط المعالجة B بالكامل، وبعد ذلك ينهي خيط المعالجة A تنفيذه.

sh-5.3# cd /host/{path to checkout on the host}
sh-5.3# ./kcov-autorace testcase/demo-dup-vs-close.so
loading kallsyms
RCU state (excluded): base=ffffffff82770100 len=500
loading testcase
initializing kcov
collecting A-B coverage
dup(5) = 6 (success)
testing candidates
dup(5) = -1 (Bad file descriptor)
dup(5) = -1 (Bad file descriptor)
dup(5) = -1 (Bad file descriptor)
dup(5) = 5 (success)
dup(5) = 6 (success)
dup(5) = 6 (success)
dup(5) = 6 (success)
dup(5) = 6 (success)
dup(5) = 6 (success)
dup(5) = 6 (success)
dup(5) = 6 (success)
stats:  injection-failed:0  wait-timeout:7  reordered:4
sh-5.3#

بالنسبة لقيود الترتيب اليدوية، تتيح أداة kcov-terminal للباحثين تحديد قواعد "يجب أن يحدث A قبل B". ويُعد هذا مفيداً لإثبات العمليات غير الذرية، مثل قراءة UID و GID عبر دالة fstat() مقابل دالة fchown().

sh-5.3# ./kcov-terminal testcase/demo-inode-attr-change.so
uid=0 gid=0
=====  filtered to interference set, no RCU core  =====
LEGEND:
  type: R=read  W=write  M=modify(read+write)  F=free  A=atomic

أتمتة اكتشاف ثغرات التزامن

ينقل إطلاق أداة MAccConc من فريق Google Project Zero عملية تصحيح أخطاء النواة من نهج يدوي يعتمد على الحدس إلى منهجية حتمية تعتمد على الأدوات. ومن خلال فرض ترتيبات تنفيذ محددة من نوع A-B-A وتصور تداخلات الوصول إلى الذاكرة عبر تتبعات KCOV، يمكن للباحثين الآن إثبات حالات السباق بشكل منهجي بعد أن كانت تعتمد سابقاً على الاحتمالات الإحصائية لتنشيطها.

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

هل أعجبك هذا المقال؟
Advertisement

اقرأ المزيد

عمليات البحث الشائعة