
लिनक्स कर्नेल में CVE-2018-3639 (उर्फ वेरिएंट 4) के लिए शमन को लागू करने के उपकरण, जो x86 प्रोसेसरों के स्पेक्युलेटिव स्टोर बायपास डिसेबल (SSBD) फीचर का उपयोग करता है।
ssbd-tools प्रोजेक्ट प्रोग्रामों का एक संग्रह है जो x86 प्रोसेसर में प्रदान की गई स्पेक्युलेटिव स्टोर बायपास डिसेबल (SSBD) कार्यक्षमता का उपयोग करता है। SSBD एक प्रोसेसर-आधारित शमन है स्पेक्युलेटिव स्टोर बायपास हमले के लिए जिसे वैरिएंट 4 कहा जाता है और इसे CVE-2018-3639 सौंपा गया है। लिनक्स कर्नेल ने SSBD का उपयोग करने के लिए प्रति-प्रक्रिया नियंत्रण प्रस्तुत किए और इन उपकरणों का उपयोग उन नियंत्रणों का लाभ उठाने और उनकी शुद्धता को सत्यापित करने में मदद करने के लिए किया जा सकता है।
लिनक्स कर्नेल संचालन के कई अलग-अलग तरीके प्रदान करता है, जिन्हें बूट समय पर spec_store_bypass_disable कर्नेल पैरामीटर के साथ चुना जा सकता है, x86 सिस्टम पर SSBD के लिए। कर्नेल पैरामीटर दस्तावेज़ीकरण उनका अच्छी तरह से वर्णन करता है। यहाँ उस दस्तावेज़ का एक अंश है जो विकल्पों का वर्णन करता है:
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 के अंदर बिट स्थान CPU विक्रेताओं, एकल विक्रेता के CPU परिवारों, और कर्नेल हाइपरवाइजर के तहत चल रहा है या नहीं, के बीच भिन्न होता है। ये उपकरण वर्तमान निष्पादन वातावरण के लिए SSBD बिट कहाँ स्थित है, यह तय करने के लिए Intel और AMD द्वारा प्रकाशित दिशानिर्देशों का पालन करते हैं।
कुछ सिस्टम पर SSBD समर्थन उपलब्ध नहीं हो सकता है। यह कई कारणों से हो सकता है:
intel-microcode और amd64-microcode) अद्यतन माइक्रोकोड तक पहुंच सकते हैं। 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 प्रोग्राम सत्यापित करता है कि आपके प्रोसेसर के लिए विशिष्ट MSR और बिट ऑफसेट में वास्तविक SSBD बिट, अपेक्षित मान है। 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 को सत्यापित करने के लिए)।
प्रोग्राम को -t SECONDS विकल्प का उपयोग करके SSBD बिट के मान को बार-बार सत्यापित करने के लिए कॉन्फ़िगर किया जा सकता है। यदि SECONDS 0 है, तो प्रोग्राम SSBD बिट को सत्यापित करते हुए अंतहीन रूप से लूप करता है। SECONDS के लिए एक गैर-शून्य मान के परिणामस्वरूप प्रोग्राम निर्दिष्ट समय के लिए SSBD बिट को सत्यापित करता है।
इस प्रोग्राम के लिए आवश्यक है कि msr कर्नेल मॉड्यूल लोड हो और उपयोगकर्ता के पास उपयुक्त MSR से SSBD बिट पढ़ने के लिए रूट विशेषाधिकार हों।
$ 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
नोट: उपरोक्त कमांड में ssbd-exec पर sudo का उपयोग करना आवश्यक है क्योंकि seccomp फ़िल्टर लोड करने से पहले NO_NEW_PRIVS का उपयोग किया जाता है। यदि NO_NEW_PRIVS सेट होने के बाद sudo का उपयोग किया जाता है तो यह विशेषाधिकारों को ऊपर नहीं उठा सकेगा।
ssbd-toggle प्रोग्राम प्रोग्राम के समाप्त होने तक एक अंतहीन लूप में SSBD बिट को चालू और बंद करता है। इसका उपयोग ssbd-verify के साथ संयोजन में किया जा सकता है ताकि यह सुनिश्चित किया जा सके कि जब कर्नेल अपने कार्य पर स्विच करता है तो ssbd-verify प्रक्रिया में हमेशा अपेक्षित SSBD बिट मान हो।
इस प्रोग्राम के लिए आवश्यक है कि msr कर्नेल मॉड्यूल लोड हो और उपयोगकर्ता के पास उपयुक्त MSR से पढ़ने और लिखने के लिए रूट विशेषाधिकार हों।
$ sudo ./ssbd-toggle
^C
उपकरणों के निर्माण के लिए, make चलाएँ:
$ make
यह सुनिश्चित करने के लिए कि आपके सिस्टम पर SSBD अपेक्षित रूप से काम कर रहा है, कुछ बुनियादी स्वचालित परीक्षण चलाने के लिए, रूट के रूप में check लक्ष्य चलाएँ:
$ sudo make check
PASS