추측성 저장 우회 (Speculative Store Bypass)를 사용하여 커널의 사이드 채널 공격 - CVE-2018-3639

Public Date: May 17, 2018, 04:42
갱신됨 August 6, 2018, 14:44 - Chinese, Simplified 영어 (English) French Japanese
Resolved 상태
Important Impact

Insights vulnerability analysis

View exposed systems

Red Hat은 Linux 커널, 가상화 관련 구성 요소의 업데이트, 마이크로 코드 업데이트가 필요한 최신 마이크로 프로세서에 존재하는 취약점을 인식하고 있습니다. 권한이 없는 공격자는 이러한 결함을 사용하여 일반적인 메모리 보안 제한을 우회하여 액세스 권한을 필요로 하는 메모리에 대한 읽기 권한을 얻을 수 있습니다. 본 문제는 CVE-2018-3639로 지정되어 있으며 "변형 (Variant) 4" 또는 "추측성 저장 우회 (Speculative Store Bypass)"라고도 합니다. 본 문제는 AMD, ARM, IBM POWER8, POWER9, SystemZ 시리즈와 Intel 프로세서와 같은 각종 마이크로 아키텍처의 CPU에 영향을 미치는 것으로 알려져 있습니다. 현재 지원되는 모든 Red Hat Enterprise Linux, Red Hat OpenShift, Red Hat Virtualization, Red Hat OpenStack Platform 버전이 영향을 받습니다.

권한이 없는 악의적인 사용자가 본 결함을 악용하여 권한을 필요로하는 시스템 메모리와 웹브라우저 또는 JIT 실행 런타임과 같은 샌드박스 환경 외부의 메모리에 읽기 액세스할 수 있습니다.

본 취약점을 완화하려면 시스템 관리자가 하드웨어 "마이크로 코드" 업데이트와 새로운 기능을 활성화할 수 있는 소프트웨어 패치를 모두 적용해야 합니다. 현재 마이크로 프로세서의 마이크로 코드는 각 제조업체에서 제공하지만 향후 Red Hat은 테스트및 서명된 업데이트를 출시할 예정입니다.

본 문제는 2018년 5월 21일에 공개되었습니다.

배경 정보

CVE-2018-3639 (일명 “추측성 저장 우회: Speculative Store Bypass”)는 보안 대책을 우회하여 권한을 필요로 하는 메모리에 액세스하기 위해 추측 실행 및 캐시 기반 사이드 채널 공격을 통해 악용될 수 있는 새로운 방법 (분기 예측 실패: Branch Misprediction)을 가능하게 합니다. 이 문제는 CVE-2017-5753 (일명 “Spectre v1”)과 유사하지만 Spectre v1에서 사용하는 분기 예측 실패를 사용하는 대신 추측성 저장 우회 메모리 최적화를 사용한다는 점이 다릅니다.

최신 컴퓨터 프로세서는 매우 복잡한 시스템으로 되어 있습니다. 그 중심에서는 일련의 명령 (프로그램)을 실행하고 결과를 메모리에 저장합니다.

실행 명령 수를 최대화하거나 성능을 향상시키기 위해 프로세서는 다중 실행 코어를 추가하여 캐시 메모리를 가속화하며 비순차적 실행 (Out-of-Order Execution), 분기 예측 (Branch Prediction), 추측 실행 (Speculative Execution), 데이터 프리패칭 (Data Prefetching), 메모리 액세스 순서 변경 (Memory Access Reordering), 메모리 모호성 제거 (Memory Disambiguation) 등과 같은 다양한 기법을 사용합니다.

명령이 실행됨에 따라 프로세서는 메인 메모리에서 데이터를 로드 (읽기) 및 저장 (쓰기)합니다. 로드 및 저장 명령이 데이터에 액세스하기 전에 피연산자가 제공한 주소를 확인해야 합니다. 예:

mov [rbx + rcx], 0x0 : 0을 메모리 위치 [rbx + rcx]에 저장
mov rax, [rdx + rsi] : 메모리 위치 [rdx + rsi] 에서 데이터를 RAX 레지스터로 로드

위의 두 경우 모두 데이터에 액세스하기 전에 [rbx + rcx] 및 [rdx + rsi] 주소가 메모리 위치로 확인되어야 합니다.

일반적인 프로그램에는 여러 로드 (읽기) 및 저장 (쓰기) 명령이 있고 경우에 따라 두 가지 모두 동일한 메모리 주소에서 작동합니다. 일관된 메모리 상태를 유지하려면 프로세서는 로드 저장 큐 버퍼를 사용하여 로드 (읽기) 및 저장 (쓰기) 명령을 처리합니다. 로드 및 저장 명령이 모두 대기열에 있을 때 대기열에 있는 모든 저장 명령의 주소를 알기 전 까지 로드 명령은 실행되지 않습니다.

추측성 저장 우회 실행:

최신 프로세서는 로드 -저장-대기열에 로드 (읽기) 및 저장 (쓰기) 명령 모두가 있는 경우 순서에 상관없이 추측적으로 로드/저장 명령을 실행할 수 있습니다.


메모리 모호성 제거 (MD: Memory Disambiguator)는 이전 저장 명령에 의존하지 않는 로드를 예측한 후 이러한 로드 (읽기) 명령은 이전 저장 명령의 주소를 모르는 경우에도 L1 데이터 캐시에서 데이터를 로드하기 위해 추측 실행되어 저장 명령을 우회하게 됩니다. 이 동작은 로드 지연을 피함으로써 전반적인 성능을 향상시킵니다. 결과적으로 예측이 잘못되어 로드 (읽기)와 저장 (쓰기) 명령 간의 충돌이 감지되면 추측성 로드 이후의 모든 명령이 다시 실행됩니다.

감사의 말

Red Hat은 이러한 문제를 보고해 주신 Microsoft Security Response Center (MSRC)의 Ken Johnson님과 Google Project Zero (GPZ)의 Jann Horn님에게 감사드립니다.

기타 참고 자료

문의 사항이 있으십니까? SSBD 관련 Red Hat 동영상보기

Red Hat 블로그: Speculative Store Bypass explained​

How to patch my RHV environment for Kernel Side-Channel Attack using Speculative Store Bypass CVE-2018-3639?

Is CPU microcode is available via the microcode_ctl package?

Google Project Zero Variant 4 website

Intel Advisory 

Intel Analysis of Speculative Execution Side Channels

Speculative Execution Side Channel Mitigation


영향을 받는 제품

Red Hat 제품 보안팀은 본 취약점(CVE-2018-3639 )이 이번 업데이트에서 중요한 보안 영향를 미치는 것으로 분류하고 있습니다.

다음의 Red Hat 제품 버전이 영향을 받습니다:

  • Red Hat Enterprise Linux 5

  • Red Hat Enterprise Linux 6

  • Red Hat Enterprise Linux 7

  • Red Hat Atomic Host

  • Red Hat Enterprise MRG 2

  • Red Hat Virtualization (RHEV-H/RHV-H)

  • Red Hat Enterprise Linux OpenStack Platform 6.0 (Juno)

  • Red Hat Enterprise Linux OpenStack Platform 7.0 (Kilo) for RHEL7

  • Red Hat Enterprise Linux OpenStack Platform 7.0 (Kilo) director for RHEL7

  • Red Hat OpenStack Platform 8.0 (Liberty)

  • Red Hat OpenStack Platform 8.0 (Liberty) director

  • Red Hat OpenStack Platform 9.0 (Mitaka)

  • Red Hat OpenStack Platform 9.0 (Mitaka) director

  • Red Hat OpenStack Platform 10.0 (Newton)

  • Red Hat OpenStack Platform 11.0 (Ocata)

  • Red Hat OpenStack Platform 12.0 (Pike)

Red Hat의 Linux Container는 커널 문제의 영향을 직접적으로 받지 않지만 보안 문제는 호스트 커널 환경의 무결성에 의존합니다. Red Hat은 최신 버전의 컨테이너 이미지를 사용할 것을 권장합니다. Red Hat Container Catalog의 일부인 Container Health Index는 Red Hat 컨테이터의 보안 상태를 확인하는데 사용할 수 있습니다. 사용 중인 모든 컨테이너의 개인 정보를 보호하려면 컨테이너 호스트 (예: Red Hat Enterprise Linux 또는 Atomic Host) 가 이러한 공격에 대해 업데이트되어 있어야 합니다. Red Hat은 이러한 문제에 대해 업데이트된 Atomic Host를 게재하고 있습니다.

공격 내용 및 영향

이러한 추측성 저장 우회 시나리오는 Spectre 변형-1과 같은 사이드 채널 공격을 가능하게 합니다. 이를 통해 로드 명령은 저장 연산이 아직 커밋되지 않은 메모리 위치에서 이전 값에 액세스할 수 있습니다. 이를 이용하여 공격자가 메모리 위치에서 이전 값을 제어할 수 있는 경우 권한을 필요로 하는 시스템 메모리를 읽을 수 있습니다. 이는 웹브라우저 또는 실행 전 JIT (just in time) 소스 코드를 분석하고 컴파일하는 JVM이나 실행 엔진같은 샌드박스화된 실행 환경에서 실행 중인 프로세스에도 사용할 수 있습니다.

성능에 미치는 영향


추측성 저장 우회 또는 메모리 모호성 제거 (MD)는 추측 실행 엔진의 효율성을 높이기 위해 사용되는 최적화 선택입니다. 이전 저장(쓰기) 명령을 기다리지 않고 로드 (읽기) 명령을 실행할 수 있으므로 로드 대기 시간이 단축되고 성능이 향상됩니다.

추측성 저장 우회 완화를 활성화하면 실질적으로 메모리 모호성 제거 최적화가 비활성화되므로 이는 시스템 성능에 영향을 미칠 수 있습니다. 시스템에 영향을 미치는 정도는 시스템 워크로드에 따라 달라집니다.

기본 구성과 관련하여 Red Hat은 사용자가 자신의 환경을 평가하여 다양한 완화 조치를 선택적으로 활성화 및 비활성화함으로써 적절한 절충안을 사용할 수 있는 유연성을 제공하는 동시에 성능보다 보안을 우선시하는 입장을 선택하고 있습니다. Red Hat은 초기 완화 조치에서 성능에 미치는 영향을 줄이기 위해 추가 변경 작업에 최선을 다하고 있습니다.

추가 성능 데이터는 사용 가능한 대로 게시됩니다.

취약점 진단

시스템의 취약성 여부 확인

시스템에 보안 취약점이 존재하는지 확인하십시오. 다음의 진단 스크립트를 사용하여 시스템이 현재 이러한 결함에 대해 취약한 상태인지 확인하십시오. 정규 스크립트임을 확인하려면 GPG 분리 서명을 다운로드할 수 있습니다. 현재 스크립트 버전은 1.0입니다.

해결 방법

영향을 받는 Red Hat 제품 버전을 실행 중인 모든 Red Hat 고객은 에라타가 제공되는 데로 즉시 업데이트할 것을 권장합니다. Red Hat 고객은 해당 업데이트를 즉시 적용해야 합니다. 이러한 수정 사항에는 CPU 마이크로 코드/펌웨어 업데이트가 필요하며 프로세서에 적합한 마이크로 코드/펌웨어 업데이트 내용은 하드웨어 OEM 공급 업체에 문의하십시오. 프로세서에 적합한 마이크로 코드/ 펌웨어 업데이트 없이 커널 업데이트로 이 취약점을 완화할 수 없습니다.

패치 적용 순서는 중요하지 않지만 펌웨어 및 하이퍼 바이저를 업데이트한 후 새 하드웨어 유형을 인식하려면 모든 시스템/가상 머신의 전원을 끄고 다시 시작해야 합니다.

영향을 받는 제품 업데이트

제품 패키지권고/업데이트
Red Hat Enterprise Linux 7 (z-stream)kernelRHSA-2018:1629
Red Hat Enterprise Linux 7kernel-rtRHSA-2018:1630
Red Hat Enterprise Linux 7microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 7libvirtRHSA-2018:1632
Red Hat Enterprise Linux 7qemu-kvmRHSA-2018:1633
Red Hat Enterprise Linux 7openjdk 1.8.0RHSA-2018:1649
Red Hat Enterprise Linux 7openjdk 1.7.0RHSA-2018:1648
Red Hat Enterprise Linux 7.4 Extended Update Support**kernel보류 중
Red Hat Enterprise Linux 7.4 Extended Update Support**microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 7.4 Extended Update Support**libvirtRHSA-2018:1652
Red Hat Enterprise Linux 7.4 Extended Update Support**qemu-kvmRHSA-2018:1663
Red Hat Enterprise Linux 7.3 Extended Update Support**kernel보류 중
Red Hat Enterprise Linux 7.3 Extended Update Support**microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 7.3 Extended Update Support**libvirtRHSA-2018:1653
Red Hat Enterprise Linux 7.3 Extended Update Support**qemu-kvmRHSA-2018:1662
Red Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****kernel보류 중
Red Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****libvirtRHSA-2018:1668
Red Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****qemu-kvmRHSA-2018:1661
Red Hat Enterprise Linux 6 (z-stream)kernelRHSA-2018:1651
Red Hat Enterprise Linux 6microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 6libvirtRHSA-2018:1669
Red Hat Enterprise Linux 6qemu-kvmRHSA-2018:1660
Red Hat Enterprise Linux 6openjdk 1.8.0RHSA-2018:1650
Red Hat Enterprise Linux 6openjdk 1.7.0RHSA-2018:1647
Red Hat Enterprise Linux 6.7 Extended Update Support**kernel보류 중
Red Hat Enterprise Linux 6.7 Extended Update Support**microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 6.7 Extended Update Support**libvirtRHSA-2018:1667
Red Hat Enterprise Linux 6.7 Extended Update Support**qemu-kvmRHSA-2018:1659
Red Hat Enterprise Linux 6.6 Advanced Update Support***,****kernel보류 중
Red Hat Enterprise Linux 6.6 Advanced Update Support***,****microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 6.6 Advanced Update Support***,****libvirtRHSA-2018:1666
Red Hat Enterprise Linux 6.6 Advanced Update Support***,****qemu-kvmRHSA-2018:1658
Red Hat Enterprise Linux 6.5 Advanced Update Support***kernel보류 중
Red Hat Enterprise Linux 6.5 Advanced Update Support***microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 6.5 Advanced Update Support***libvirtRHSA-2018:1665
Red Hat Enterprise Linux 6.5 Advanced Update Support***qemu-kvmRHSA-2018:1657
Red Hat Enterprise Linux 6.4 Advanced Update Support***kernel보류 중
Red Hat Enterprise Linux 6.4 Advanced Update Support***microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 6.4 Advanced Update Support***libvirtRHSA-2018:1664
Red Hat Enterprise Linux 6.4 Advanced Update Support***qemu-kvmRHSA-2018:1656
Red Hat Enterprise Linux 5 Extended Lifecycle Support*kernel보류 중
Red Hat Enterprise Linux 5 Extended Lifecycle Support*microcode_ctl제조업체에서 업데이트 대기 중
Red Hat Enterprise Linux 5.9 Advanced Update Support***kernel보류 중
Red Hat Enterprise Linux 5.9 Advanced Update Support***microcode_ctl제조업체에서 업데이트 대기 중
RHEL Atomic Hostkernel보류 중
Red Hat Enterprise MRG 2kernel-rt보류 중
Red Hat Virtualization 4 (RHEV-H/RHV-H)redhat-virtualization-host보류 중
Red Hat Virtualization 4 (RHEV-H/RHV-H)rhvm-appliance보류 중
Red Hat Virtualization 4 (RHEV-H/RHV-H)qemu-kvm-rhevRHSA-2018:1655
Red Hat Virtualization 4 (RHEV-H/RHV-H)vdsm보류 중
Red Hat Virtualization 4 (RHEV-H/RHV-H)ovirt-guest-agent-docker보류 중
Red Hat Virtualization 4 (RHEV-H/RHV-H)rhevm-setup-plugins보류 중
Red Hat Virtualization 3 (RHEV-H/RHV-H)redhat-virtualization-host보류 중
Red Hat Virtualization 3 ELS (RHEV-H/RHV-H)rhev-hypervisor7보류 중
Red Hat Virtualization 3 ELS (RHEV-H/RHV-H)qemu-kvm-rhevRHSA-2018:1654
Red Hat Virtualization 3 ELS (RHEV-H/RHV-H)vdsm보류 중
Red Hat Virtualization 3 ELS (RHEV-H/RHV-H)rhevm-setup-plugins보류 중
Red Hat Enterprise Linux OpenStack Platform 7.0 (Kilo) for RHEL7qemu-kvm-rhev보류 중
Red Hat Enterprise Linux OpenStack Platform 7.0 (Kilo) director for RHEL7director images보류 중
Red Hat OpenStack Platform 8.0 (Liberty)qemu-kvm-rhev 보류 중
Red Hat OpenStack Platform 8.0 (Liberty)director images보류 중
Red Hat OpenStack Platform 9.0 (Mitaka)qemu-kvm-rhev보류 중
Red Hat OpenStack Platform 9.0 (Mitaka)director images보류 중
Red Hat OpenStack Platform 10.0 (Newton)qemu-kvm-rhev보류 중
Red Hat OpenStack Platform 10.0 (Newton)director images보류 중
Red Hat OpenStack Platform 11.0 (Ocata)qemu-kvm-rhev보류 중
Red Hat OpenStack Platform 11.0 (Ocata)director images보류 중
Red Hat OpenStack Platform 12.0 (Pike)qemu-kvm-rhev보류 중
Red Hat OpenStack Platform 12.0 (Pike)director images보류 중
Red Hat OpenStack Platform 12.0 (Pike)containers보류 중


*이러한 패치에 액세스하려면 활성 ELS 서브스크립션이 필요 합니다. 사용 계정에 활성 ELS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 영업 담당자에게 문의하시기 바랍니다.

**이러한 패치에 액세스하려면 활성 EUS 서브스크립션이 필요 합니다. 사용 계정에 활성 EUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 영업 담당자에게 문의하시기 바랍니다.

Red Hat Enterprise Linux Extended Update Support 서브스크립션은 무엇입니까?

***RHEL AUS에서 이러한 패치에 액세스하려면 활성 AUS 서브스크립션이 필요합니다.

AUS (Advanced mission critical Update Support)는 무엇입니까?

****RHEL TUS에서 이러한 패치에 액세스하려면 활성 TUS 서브스크립션이 필요합니다.

*****서브스크립션 사용자는 하드웨어 OEM에 문의하여 CPU 마이크로코드/펌웨어 최신 버전을 구해야 합니다.

완화 방법

Red Hat은 고객이 하드웨어 또는 CPU 공급 업체가 제공하는 마이크로 코드/펌웨어 업데이트를 적용하고 가능하면 빨리 업데이트된 커널을 설치할 것을 권장합니다. 소프트웨어 업데이트는 하드웨어 마이크로코드와는 별도로 적용할 수 있지만 CPU 펌웨어가 업데이트된 후에 적용됩니다.

고객은 이 문제를 완화하기 위해 위험 기반 접근 방식을 사용하는 것이 좋습니다. 높은 수준의 보안 및 신뢰가 필요한 시스템 먼저 처리되어야 하며 악용 위험을 줄이기 위해 대처법이 해당 시스템에 적용될 때 까지 신뢰할 수 없는 시스템과 격리되어야 합니다.

Intel 및 AMD x86 프로세서에서는 추측성 저장 우회 기능을 활성화/비활성화하는데 사용할 수 있는 MSR (Model Specific Registers)를 제공합니다. 이러한 MSR을 사용하여 새로운 커널 업데이트는 다음과 같은 커널 명령줄 매개 변수를 제공합니다:

  • spec_store_bypass_disable=[auto/on/off/prctl]
    default: auto
    • auto: 이 옵션을 실행하면 커널은 프로세서가 SSB (Speculative Store Bypass) 기능을 지원하는지 여부를 감지하고 적절한 완화 방법을 선택합니다.
    • on: 추측성 저장 우회 완화를 "ON"으로 합니다. 프로세서는 모든 저장 (쓰기) 주소를 확인하기 전 까지 로드 (읽기) 명령을 추측 실행하지 않습니다.
    • off: 추측성 저장 우회 완화를 "OFF"로 합니다. 프로세서는 메모리 모호성 제거 기능을 사용하여 이전 저장 (쓰기) 명령 이전에 있는 로드 (읽기) 명령을 추측 실행합니다.
    • prctl: prctl(2) 인터페이스를 사용하여 추측성 저장 우회 완화를 스레드별로 활성화합니다.
  • nospec_store_bypass_disable:
    추측성 저장 우회 취약점에 대한 모든 완화를 비활성화합니다.

커널 업데이트에는 시스템 프로세서가 추측성 저장 우회 문제에 취약한지 여부와 해당 완화 조치가 실행되고 있는지를 보고하기 위한 sysfs 인터페이스 지원이 추가되어 있습니다.

  • # cat /sys/devices/system/cpu/vulnerabilities/spec_store_bypass

JVM 또는 JIT 샌드 박스 환경의 경우 커널 업데이트는 prctl(2) 인터페이스를 통해 프로세스 별 제어 옵션을 사용합니다. 응용 프로그램에서 이를 사용하여 프로세스 별로 추측성 저장 우회를 활성화 또는 비활성화할 수 있습니다. 다음과 같이 응용 프로그램은 prctl(2)를 호출할 수 있습니다:

  • prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_ENABLE, 0, 0);
    추측성 저장 우회 기능을 활성화하여 완화 조치를 사용하지 않습니다.
  • prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0);
    추측성 저장 우회 기능을 비활성화하여 완화 조치를 사용합니다.


Comments