
x86 프로세서의 SSBD(Speculative Store Bypass Disable) 기능을 사용하여 CVE-2018-3639 (일명 Variant 4)에 대한 Linux 커널 완화 조치를 실행하는 도구
ssbd-tools 프로젝트는 x86 프로세서에서 제공하는 Speculative Store Bypass Disable(SSBD) 기능을 사용하는 프로그램 모음입니다. SSBD는 _Variant 4_로 불리며 CVE-2018-3639가 할당된 Speculative Store Bypass 공격에 대한 프로세서 기반 완화 조치입니다. Linux 커널은 SSBD를 사용하기 위한 프로세스별 제어를 도입했으며, 이 도구들은 해당 제어를 활용하고 정확성을 확인하는 데 사용될 수 있습니다.
Linux 커널은 x86 시스템의 SSBD를 위해 부팅 시 spec_store_bypass_disable 커널 매개변수로 선택할 수 있는 여러 가지 작동 모드를 제공합니다. 커널 매개변수 문서에 잘 설명되어 있습니다. 다음은 해당 문서에서 옵션을 설명하는 발췌문입니다:
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 제품군, 그리고 커널이 하이퍼바이저 아래에서 실행 중인지 여부에 따라 다릅니다. 이 도구들은 Intel 및 AMD가 발표한 지침을 따라 현재 실행 환경에서 SSBD 비트의 위치를 결정합니다.
일부 시스템에서는 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 완화에 포함시킵니다. 또한 프로세스를 SSBD에 포함시키지 않는 관대한 필터를 로드하는 옵션(-s spec-allow)도 있습니다.
$ ./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가 0이 아니면 프로그램은 지정된 시간 동안 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
참고: 위 명령어는 NO_NEW_PRIVS가 seccomp 필터를 로드하기 전에 사용되므로 ssbd-exec에 sudo를 사용해야 합니다. 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