
أدوات لاختبار إجراء التخفيف المطبق في نواة لينكس لثغرة CVE-2018-3639 (المعروفة أيضًا باسم Variant 4) باستخدام ميزة تعطيل تجاوز التخزين التخميني (SSBD) لمعالجات x86
مشروع ssbd-tools هو مجموعة من البرامج التي تستخدم وظيفة تعطيل تجاوز المتجر التخميني (SSBD) المتوفرة في معالجات x86. يعد SSBD تخفيفًا يعتمد على المعالج لهجوم تجاوز المتجر التخميني، والذي يُشار إليه باسم البديل 4 وتم تخصيص CVE-2018-3639 له. قدمت نواة لينكس ضوابط لكل عملية لاستخدام SSBD، ويمكن استخدام هذه الأدوات للاستفادة من تلك الضوابط والمساعدة في التحقق من صحتها.
توفر نواة لينكس عدة أوضاع تشغيل مختلفة، يمكن تحديدها وقت الإقلاع عبر معامل النواة spec_store_bypass_disable، لتفعيل SSBD على أنظمة x86. تصفها توثيق معاملات النواة جيدًا. إليك مقتطف من هذا المستند يصف الخيارات:
on - Unconditionally disable Speculative Store Bypass
off - Unconditionally enable Speculative Store Bypass
auto - Kernel detects whether the CPU model contains an
implementation of Speculative Store Bypass and
picks the most appropriate mitigation. If the
CPU is not vulnerable, "off" is selected. If the
CPU is vulnerable the default mitigation is
architecture and Kconfig dependent. See below.
prctl - Control Speculative Store Bypass per thread
via prctl. Speculative Store Bypass is enabled
for a process by default. The state of the control
is inherited on fork.
seccomp - Same as "prctl" above, but all seccomp threads
will disable SSB unless they explicitly opt out.
Not specifying this option is equivalent to
spec_store_bypass_disable=auto.
Default mitigations:
X86: If CONFIG_SECCOMP=y "seccomp", otherwise "prctl"
يتم تمكين/تعطيل وظيفة SSBD عن طريق ضبط بت واحد في سجل خاص بالطراز (MSR) في المعالج. يختلف رقم MSR الدقيق وموقع البت داخل MSR باختلاف بائعي وحدات المعالجة المركزية، وباختلاف عائلات المعالجات من البائع نفسه، وأيضًا اعتمادًا على ما إذا كانت النواة تعمل تحت مشرف افتراضي (hypervisor) أم لا. تتبع هذه الأدوات الإرشادات المنشورة من قبل Intel و AMD لتحديد مكان بت SSBD في بيئة التنفيذ الحالية.
قد لا تتوفر بعض الأنظمة على دعم SSBD. قد يعود ذلك إلى عدة أسباب:
intel-microcode و amd64-microcode لتوزيعتي Debian/Ubuntu). لا تتطلب معالجات AMD من العائلات 15h و16h و17h برمجيات دقيقة محدثة.يستخدم برنامج ssbd-exec ضوابط SSBD لكل عملية قبل تنفيذ برنامج آخر. يمكنه استخدام استدعاء PR_SET_SPECULATION_CTRL من نوع prctl للسماح بالتخمين (-p enable لاستخدام PR_SPEC_ENABLE)، أو منع التخمين عبر SSBD (-p disable لاستخدام PR_SPEC_DISABLE)، أو منع التخمين بشكل دائم في جميع العمليات الفرعية المستقبلية عبر SSBD (-p force-disable لاستخدام PR_SPEC_FORCE_DISABLE).
يمكنه أيضًا تحميل مرشح seccomp متساهل (-s empty) والذي، افتراضيًا على x86، يُدخل العملية في تخفيف SSBD. هناك أيضًا خيار (-s spec-allow) لتحميل مرشح متساهل لا يُدخل العملية في SSBD.
$ ./ssbd-exec -- grep Spec /proc/self/status
Speculation_Store_Bypass: thread vulnerable
$ ./ssbd-exec -p disable -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 0
Speculation_Store_Bypass: thread mitigated
$ ./ssbd-exec -s empty -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 2
Speculation_Store_Bypass: thread force mitigated
يتحقق برنامج ssbd-verify من أن بت SSBD الفعلي، في MSR وإزاحة البت الخاصة بمعالجك، له القيمة المتوقعة. 0 تعني أن SSBD غير مستخدم بينما 1 تعني أنه قيد الاستخدام.
يمكن أيضًا استخدام البرنامج للتحقق من أن قيمة PR_GET_SPECULATION_CTRL لنوع prctl في المهمة مضبوطة على السماح بالتخمين (-p enable للتحقق من PR_SPEC_ENABLE)، أو منع التخمين عبر SSBD (-p disable للتحقق من PR_SPEC_DISABLE)، أو منع التخمين بشكل دائم في جميع العمليات الفرعية المستقبلية عبر SSBD (-p force-disable للتحقق من PR_SPEC_FORCE_DISABLE).
يمكن تكوين البرنامج للتحقق بشكل متكرر من قيمة بت SSBD باستخدام خيار -t SECONDS. إذا كانت قيمة SECONDS هي 0، يستمر البرنامج في التكرار بلا نهاية أثناء التحقق من بت SSBD. أما إذا كانت قيمة SECONDS غير صفرية، فسيقوم البرنامج بالتحقق من بت SSBD للمدة الزمنية المحددة.
يتطلب هذا البرنامج تحميل وحدة النواة msr وأن يكون المستخدم يمتلك صلاحيات الجذر لقراءة بت SSBD من MSR المناسب.
$ sudo ./ssbd-verify 0
$ sudo ./ssbd-verify 1
FAIL: SSBD bit verification failed (expected 1, got 0)
$ ./ssbd-exec -p disable -- sudo ./ssbd-verify 1
$ sudo ./ssbd-exec -s empty -- ./ssbd-verify 1
ملاحظة: يتطلب الأمر أعلاه استخدام sudo مع ssbd-exec لأن NO_NEW_PRIVS يُستخدم قبل تحميل مرشح seccomp. لن يتمكن sudo من رفع الصلاحيات إذا تم استخدامه بعد ضبط NO_NEW_PRIVS.
يقوم برنامج ssbd-toggle ببساطة بتبديل بت SSBD بين التشغيل والإيقاف في حلقة لا نهائية حتى يتم إنهاء البرنامج. يمكن استخدامه مع ssbd-verify لضمان أن عملية ssbd-verify تحصل دائمًا على قيمة بت SSBD المتوقعة عندما تنتقل النواة إلى مهمتها.
يتطلب هذا البرنامج تحميل وحدة النواة msr وأن يكون المستخدم يمتلك صلاحيات الجذر للقراءة من والكتابة إلى MSR المناسب.
$ sudo ./ssbd-toggle
^C
لبناء الأدوات، شغّل make:
$ make
لتشغيل بعض الاختبارات الآلية الأساسية للتأكد من أن SSBD يعمل كما هو متوقع على نظامك، شغّل هدف check بصلاحيات الجذر:
$ sudo make check
PASS