DRAM-관련 취약점 (rowhammer, SPOILER)

업데이트됨 -

DRAM 결함이란?

DRAM (Dynamic Random Access Memory)은 컴퓨터에 대량의 저지연 랜덤 액세스 데이터 저장 공간을 제공합니다.

DRAM 관련 오류는 크게 다음과 같이 분류할 수 있습니다:

  1. 잘못된 주소에서 데이터를 읽습니다.
  2. 데이터가 잘못된 주소에 기록됩니다.
  3. 데이터를 읽는 동안 데이터가 손상됩니다 (즉, 잘못된 데이터가 반환되지만 메모리 상에 있는 데이터는 변경되지 않음).
  4. 데이터가 기록되는 동안 손상됩니다 (즉, 올바른 주소에 기록되지만 잘못된 비트가 저장됨)
  5. 해당 메모리 주소에 쓰지 않고 데이터가 자동적으로 손상됩니다.

이는 자동적인 데이터 손상을 방지하기 위해 DRAM의 "역동적인" 부분을 주기적으로 리프레시(Refresh)해야 함을 의미합니다 (위 목록에서 항목 5). 시스템은 백그라운드에서 이 리프레시 동작을 자동으로 수행합니다. 리프레시 동작은 전원이 켜져있는 상태에서 리프레시되는 메모리 영역에 대한 액세스를 차단하기 때문에 리프레시 동작을 최소화해야 합니다.

시스템은 DRAM 결함에 대해 다양한 수준의 보호 기능을 제공합니다. 하드웨어 설계 중에는 시뮬레이션을 사용하여 리프레시 작업으로 데이터 손상을 방지하고 메모리 버스가 전송되는 주소 및 데이터 (목록에서 항목 1~4)를 손상시키지 않는지 확인합니다. 현재 소비자 시스템은 일반적으로 여유 공간이 없기 때문에 저장된 데이터를 전혀 보호하지 않으며 잘 설계된 메모리 리프레시 동작에만 의존합니다. 많은 서버 시스템은 오류 수정 코드 (ECC)가 있는 DRAM을 사용하여 자동적인 손상에 대한 복원력이 크게 향상되고 있습니다. 일부 서버 시스템에는 추가 보호 기능이 있습니다.

DRAM 결함은 어떻게 유발될 수 있습니까?

DRAM 오류는 하드웨어 오류와 같이 자연스럽게 발생할 수 있습니다. 때로는 "우주 광선(cosmic rays)"등 여러 원인으로 인해 의도치 않은 상황에서도 발생할 수 있습니다.

DRAM 모듈에 결함이 있거나 사양 외부에서 작동하는 결함있는 전원 공급 장치와 같은 일부 하드웨어 결함이 있는 경우 DRAM 오류가 나타나 시스템 안정성에 영향을 미칠 수 있습니다.

특정 메모리 액세스 패턴이 결함있는 DRAM 모듈을 노출시키는 것으로 알려져 왔습니다. Red Hat Enterprise Linux의 일부로 제공되는 memtest86+ RAM 테스터는 메모리 서브 시스템에서 하드웨어 결함을 노출하는 등의 테스트 패턴을 사용합니다.

RowHammer 공격은 어떻게 작동합니까?

"Rowhammer"는 CPU에서 CLFLUSH/CLFLUSHOPT/CLWB 명령을 사용하는 제품군의 DRAM 결함에 대한 특정 기술을 나타냅니다. 이러한 제품군에서의 명령은 i386 및 x86_64 아키텍처가 제공하는 권한이 없는 명령입니다. 이는 특정 위치에 DRAM 트래픽을 증가시키도록 악용될 수 있습니다. 이로 인해 DRAM 결함을 유발할 수 있습니다. 이러한 프로그램은 CLFLUSH 명령을 실행하는데 특별한 권한을 필요로 하지 않기 때문에 하이퍼 바이저 게스트에서 일반 프로세스로 실행할 수 있습니다.

"rowhammer"에 의한 시스템 손상의 종류는 목록에서 항목 5에 해당합니다. 저장된 데이터는 메모리 쓰기(write) 없이 변경되며 액세스되는 주소에는 변경되지 않습니다. 보고된 내용에 따르면 액세스 패턴은 필요한 DRAM 리프레시 빈도에 대해 설계된 가정을 무효화하기 때문에 발생합니다. 이렇게 하면 DRAM에 액세스할 때 저장된 데이터를 안정적으로 보존하기 위한 메모리 리프레시가 자주 발생하지 않습니다.

CLFLUSH 명령을 사용하면 매우 다양한 시스템에서 실행하기 어려운 특수한 메모리 스트레서를 만들 수 있습니다. CPU는 캐시를 우회할 수 있는 비-임시 메모리 액세스와 같은 다른 수단을 제공합니다. 특히 스마트한 스트레스 테스터는 신중하게 메모리 액세스를 선택하고 원하는 대로 캐시 라인을 제거함으로써 매우 유사한 효과를 얻을 수 있습니다.

SPOILER 취약점은 무엇이며 RowHammer 공격과 어떤 관련이 있습니까?

SPOILER 취약점은 공격자가 권한이 없는 사용자 공간 프로세스에서 가상-물리적 페이지 매핑을 결정할 수 있게 해주는 마이크로 아키텍처 메모리 누수입니다. 메모리 순서 버퍼에 추측성 로드 및 저장 연산의 데이터 종속성을 활용하고 메모리 레이아웃을 나타내는 타이밍 불일치를 측정하기 위해 rdtscpmfence 명령을 사용합니다. 이를 통해 연속적인 물리적 메모리 페이지 범위를 감지할 수 있어 RowHammer를 보다 더 효과적이고 쉽게 만들 수 있습니다.

SPOILER 취약점은 Intel CPU에만 해당되며 Intel Core 프로세서의 1 세대부터 적용됩니다. 이 취약점은 Spectre 취약점과는 다르며 별개로 취급됩니다. 웹 브라우저에서 실행되는 악의적인 JavaScript 코드나 시스템에서 실행되는 신뢰할 수 없는 코드에 의해 잠재적으로 악용될 수 있습니다.

DRAM 결함의 영향은 무엇입니까?

메모리는 기본적인 시스템 구성 요소입니다. 모든 요소가 올바르게 작동하지 않으면 보안 시스템을 완전히 무력화시킬 수 있습니다. 따라서 대부분의 DRAM 결함은 시스템의 올바른 작동을 저해할 가능성이 있습니다. 여기에는 보안 경계 적용 및 주요 개인 자료와 같은 중요한 데이터의 보호가 포함됩니다.

이러한 오류가 발생하면 로컬 및 원격 공격자 모두가 이를 악용할 수 있습니다. 일반적으로 로컬 공격자는 DRAM 결함을 보다 쉽게 유발할 수 있습니다.

샌드 박싱 솔루션에 영향을 미칩니까?

Java 및 Javascript 샌드 박스는 CLFLUSH 명령에 대해 액세스를 제공하지 않으므로 DRAM 오류 유발의 특정 변형이 작동하지 않습니다. 하지만 두 언어의 최신 버전은 유연한 데이터 구조를 제공하므로 다른 방법으로 DRAM 오류를 유도할 수 있습니다.

SELinux와 컨테이너는 실행 전에 전체 명령 스트림을 차단하지 않고 보안 기능을 제공하지 않으므로 CLFLUSH와 같은 명령을 차단할 수 없습니다.

하이퍼바이저는 어떻습니까?

RHEV와 같은 하이퍼바이저는 현재 DRAM 결함 및 게스트의 악용에 대한 보안 기능을 제공하지 않습니다.

Chrome 브라우저는 사용자를 보호할 수 있습니까?

Google은 Chrome 브라우저 (특히 Native Client 기능)에서 DRAM 오류 주입 공격과 관련된 취약점을 해결했다고 공개적으로 발표했습니다.

Chrome의 Native Client 구성 요소는 신뢰할 수 있는 컴파일러 방식을 사용하여 신뢰할 수 없는 소스에서 다운로드한 네이티브 머신 코드를 실행합니다. 명령 스트림은 샌드 박스를 벗어날 수 있는 위험한 명령이 있는지 검사합니다. 이전 Chrome 버전에서는 CLFLUSH 기반의 DRAM 오류를 유발할 수있는 CLFLUSH 명령을 허용했습니다. 현재 Chrome 버전의 Native Client는 CLFLUSH를 허용하지 않으므로 CLFLUSH가 작동하지 않습니다.

위에서 설명한 것처럼 CLFLUSH는 DRAM 오류를 유발하지 않으므로 Chrome에서의 보안이 불완전할 수 있습니다. Native Client 벡터에만 적용되며 웹 브라우저에서 DRAM 오류를 유발하는 다른 방법이 있을 수 있습니다. (예: Javascript 사용)

이런 종류의 문제에 소프트웨어 기반 솔루션이 가능합니까?

이론적으로 "rowhammer"스타일 DRAM 오류 주입 공격이 동일한 보안 도메인 (게스트 또는 프로세스) 내의 데이터에만 영향을 주는 방식으로 하이퍼바이저 게스트 또는 운영 체제 프로세스에 메모리를 매핑할 수 있습니다. 다음과 같은 이유로 실제로 이것이 가능하지는 않습니다:

  • 보안 경계 (예: 커널 동일 페이지 병합 또는 프로세스 간 읽기 전용 공유 매핑)에서 읽기 전용 페이지 공유를 비활성화해야 시스템 로드 밀도가 크게 줄어들 수 있습니다.
  • 이 메커니즘은 메모리 설정에 크게 의존하며 CPU 실리콘 및 마이크로 코드 개정 버전, 시스템 펌웨어 버전, 메인 보드 개정 버전 등에 따라 특정 시스템 설정에만 효과적입니다.

오늘날에도 이러한 기능을 갖춘 시스템에서는 edac-utils 패키지의 edac-util 명령을 사용하여 MCE 이벤트 ( mcelog사용 ), 특히 EDAC (오류 감지 및 수정) 카운터의 발생을 모니터링 할 수 있습니다. 이러한 툴은 DRAM 관련 결함이 발생하기 전에 DRAM 관련 시스템 성능 저하를 감지하는 데 사용될 수 있습니다.

고객이 DRAM 결함을 처리하려면 어떻게 해야 합니까?

Red Hat은 하드웨어 공급 업체가 ECC 메모리와 같은 충분한 설계 준비 및 기술로 처리해야 하는 문제인 DRAM 결함을 인지하고 있습니다.

Red Hat은 DRAM 결함이 의심되는 경우 (예 : 커널이 MCE 이벤트를 기록한 후) 'memtest86+'을 실행할 것을 권장합니다. 관련 로그 메시지에 대한 정보는 다음에서 참조하십시오. (https://access.redhat.com/solutions/18723)

시스템 공급 업체는 DRAM 결함이 하드웨어 플랫폼에 미치는 영향에 대한 추가 정보를 얻을 수 있으며 Red Hat 고객은 필요에 따라 해당 공급 업체에 연락하여 추가 정보를 얻는 것이 좋습니다.