CPU게이트

DH 교육용 위키
건국대이성민 (토론 | 기여) 사용자의 2019년 6월 21일 (금) 23:11 판

이동: 둘러보기, 검색

주제

Spectre&Meltdown.jpg

  • 2018년초 발생한 최대의 하드웨어 보안 이슈인 'CPU게이트'.

기획의도

평소에 관심 있던 분야인 하드웨어 보안과 관련해 최근 가장 큰 영향을 미친 사건, CPU게이트의 전모를 세 부분으로 나누어 알아보고자 함.

  • 스펙터와 멜트다운 취약점의 발견과 공개 과정.
  • 하드웨어 관점에서의, 스펙터와 멜트다운 공격의 원리.
  • 스펙터와 멜트다운 공격에 영향받는 제품군, 그리고 사건이 '인텔 CPU게이트'라고도 불리는 이유.

온톨로지


클래스(Class)

클래스 설명 노드
아키텍처 하드웨어 제조사의 마이크로아키텍처 중, 사건에서 논의되는 아키텍처들만 모아 이 클래스에 정리하였음. 아이비브릿지, 하스웰, 브로드웰, 스카이레이크, 카비레이크, 젠, Cortex-A57.
하드웨어 프로세서 내에서 명령어 처리에 참여하는 구성 요소들, 그 중에서도 스펙터와 멜트다운 공격이 목표로 삼는 구성 요소들을 클래스로 정리하였음. 프로세서, 캐시, 분기 예측기, 리오더 버퍼, 명령어 대기열.
기술 현대 프로세서는 성능 향상을 목표로 하는 수많은 기술들의 산물임. 스펙터와 멜트다운 공격은 다음 주요 기술들의 취약점을 노림. 분기 예측, 추측 실행, 비순차적 명령어 처리.
공격 CPU게이트의 중심에 있는 스펙터, 멜트다운 공격과, 공격 과정에서 부가적으로 활용되는 다른 공격 기법들을 함께 정리하였음. 스펙터, 멜트다운, ROP, 부채널 공격.
취약점 마이터 코퍼레이션이 감독하는 취약점 데이터베이스인 CVE에 등록된 스펙터와 멜트다운 취약점들을 이 클래스에 정리하였음. CVE-2017-5753, CVE-2017-5715, CVE-2017-5754.
문서 스펙터와 멜트다운 취약점 공개와 함께 배포된 문서들을 모아두었음. Spectre Attacks: Exploiting Speculative Execution, Meltdown: Reading Kernel Memory from User Space.
인물 스펙터와 멜트다운 취약점에 직간접적으로 관련되는 인물들을 모아두었음. Jann Horn, Robert Tomasulo.
조직 인물이 속한 조직, 그리고 사태에 영향받는 하드웨어 제조사들을 이 클래스에 정리하였음. 구글 프로젝트 제로, 인텔, AMD, ARM.

관계성(Relation)

  • 는 -를 적용한다
    • 설명: 마이크로아키텍처가 적용하는 프로세서 기술을 나타낸다.
    • 해당노드:
      1. 아이비브릿지 → 분기 예측
      2. 하스웰 → 분기 예측
      3. 브로드웰 → 분기 예측
      4. 스카이레이크 → 분기 예측
      5. 카비레이크 → 분기 예측
      6. 젠 → 분기 예측
      7. Cortex-A57 → 분기 예측
      8. 아이비브릿지 → 추측 실행
      9. 하스웰 → 추측 실행
      10. 브로드웰 → 추측 실행
      11. 스카이레이크 → 추측 실행
      12. 카비레이크 → 추측 실행
      13. 젠 → 추측 실행
      14. Cortex-A57 → 추측 실행
      15. 아이비브릿지 → 비순차적 명령어 처리
      16. 하스웰 → 비순차적 명령어 처리
      17. 브로드웰 → 비순차적 명령어 처리
      18. 스카이레이크 → 비순차적 명령어 처리
      19. 카비레이크 → 비순차적 명령어 처리
      20. 젠 → 비순차적 명령어 처리
      21. Cortex-A57 → 비순차적 명령어 처리
  • 는 -가 개발했다
    • 설명: 마이크로아키텍처를 개발한 하드웨어 제조사를 나타낸다.
    • 해당노드:
      1. 아이비브릿지 → 인텔
      2. 하스웰 → 인텔
      3. 브로드웰 → 인텔
      4. 스카이레이크 → 인텔
      5. 카비레이크 → 인텔
      6. 젠 → AMD
      7. Cortex-A57 → ARM
  • 는 -의 구현이다
    • 설명: 하드웨어 구성 요소가 구현하는 프로세서 기술을 나타낸다.
    • 해당노드:
      1. 분기 예측기 → 분기 예측
      2. 리오더 버퍼 → 비순차적 명령어 처리
      3. 명령어 대기열 → 비순차적 명령어 처리
  • 는 -의 일부이다
    • 설명: 하드웨어 구성 요소가 속하는 하드웨어를 나타낸다.
    • 해당노드:
      1. 캐시 → 프로세서
      2. 분기 예측기 → 프로세서
      3. 리오더 버퍼 → 프로세서
      4. 명령어 대기열 → 프로세서
  • 는 -를 공격한다
    • 설명: 공격이 목표로 삼는 취약점, 그리고 하드웨어 구성 요소를 나타낸다.
    • 해당노드:
      1. 스펙터 → CVE-2017-5753
      2. 스펙터 → CVE-2017-5715
      3. 멜트다운 → CVE-2017-5754
      4. 부채널 공격 → 캐시
  • 는 -의 취약점이다
    • 설명: 취약점을 내포하는 하드웨어 기술을 나타낸다.
    • 해당노드:
      1. CVE-2017-5753 → 분기 예측
      2. CVE-2017-5753 → 추측 실행
      3. CVE-2017-5715 → 분기 예측
      4. CVE-2017-5715 → 추측 실행
      5. CVE-2017-5754 → 비순차적 명령어 처리
  • 는 -를 활용한다
    • 설명: 취약점의 노출에 부가적으로 활용되는 공격을 나타낸다.
    • 해당노드:
      1. CVE-2017-5753 → 부채널 공격
      2. CVE-2017-5715 → 부채널 공격
      3. CVE-2017-5715 → ROP
      4. CVE-2017-5754 → 부채널 공격
  • 는 -가 최초 발견했다
    • 설명: 취약점을 최초로 발견한 인물을 나타낸다.
    • 해당노드:
      1. CVE-2017-5753 → Jann Horn
      2. CVE-2017-5715 → Jann Horn
      3. CVE-2017-5754 → Jann Horn
  • 는 -가 작성했다
    • 설명: 문서의 작성자를 나타낸다.
    • 해당노드:
      1. Spectre Attacks: Exploiting Speculative Execution → Jann Horn
      2. Spectre Attacks: Exploiting Speculative Execution → 구글 프로젝트 제로
      3. Meltdown: Reading Kernel Memory from User Space → Jann Horn
      4. Meltdown: Reading Kernel Memory from User Space → 구글 프로젝트 제로
  • 는 -를 기술한다
    • 설명: 문서가 기술하는 대상을 나타낸다.
    • 해당노드:
      1. Spectre Attacks: Exploiting Speculative Execution → 스펙터
      2. Meltdown: Reading Kernel Memory from User Space → 멜트다운
  • 는 -의 소속이다
    • 설명: 조직에 소속된 구성원을 나타낸다.
    • 해당노드:
      1. 구글 프로젝트 제로 → Jann Horn
  • 는 -가 도입했다
    • 설명: 하드웨어 기술을 도입한 인물을 나타낸다.
    • 해당노드:
      1. 비순차적 명령어 처리 → Robert Tomasulo
  • 는 -에게 무력하다
    • 설명: 공격이 무력한 마이크로아키텍처를 나타낸다..
    • 해당노드:
      1. 멜트다운 → 젠

스토리

스펙터와 멜트다운의 발견


구글의 보안 조직, 프로젝트 제로에 소속된 연구원 Jann Horn은 2017년 4월부터 프로세서 칩셋들의 메뉴얼들을 읽기 시작했음. 원래의 목적은 그가 만든 수치 처리 코드를 컴퓨터 하드웨어가 처리할 수 있는지 확인하기 위한 것이었으나, 어느 순간 칩이 추측 실행을 처리하는 방식과 요구된 데이터를 가져오는 것에 주의를 기울이게 된 Horn은, 그들이 작업하던 코드 패턴이 잠재적으로 숨겨진 데이터를 유출할 수도 있다는 것을 알게 되었고 취약점으로 이어지는 추가적인 조사가 필요할 것이라 생각함. 그라츠 공대의 팀을 포함해 취리히의 구글 연구진들과 단계적인 절차를 논의했는데, 이들은 이후 Horn과 취약점을 기술하는 문서를 공동 집필하게 됨. 인텔, ARM, AMD 등 주요 하드웨어 제조사들과의 물밑 접촉은 6월부터 시작되었으나 제대로 된 대책이 마련되기까지 작업을 비밀리에 진행할 수밖에 없었고, 이러한 이유로 실제 취약점의 공개는 엠바고가 풀린 다음 해인 2018년 1월에 이루어졌음. 취약점의 공개는 다음의 과정들을 포함하였음.


공격 원리 파헤치기


스펙터

스펙터의 로고
스펙터의 코드 일러스트

취약점의 근본 원인인 추측 실행(speculative execution)으로부터 이름을 따옴. 고치기 힘든 버그인만큼, 꽤 오랫동안 유령처럼 출몰해올 것.[1] 스펙터 공격은 '경계 검사 우회(CVE-2017-5753)', '분기 타깃 주입(CVE-2017-5715)'의 두 이형으로 나눌 수 있음.

  • 경계 검사 우회(CVE-2017-5753)
   if (x < array1_size)
       y = array2[array1[x] * 4096];
  1. 위의 코드가, 신뢰되지 않은 출처로부터 unsigned integer x 값을 받는 (system call 또는 라이브러리) 함수의 일부라고 가정. 해당 코드를 실행하는 프로세스는 unsigned byte 단위 배열 array1, 그리고 1MB 크기 두 번째 byte 배열 array2에 대한 접근을 가짐. 코드는 x에 대한 경계 검사로부터 시작하는데 이는 보안에 있어 필수적임. 만약 경계 검사를 하지 않는다면, 경계 범위 바깥의 입력 x가 예외를 일으키거나, 배열의 기저 주소로부터의 오프셋 x를 전달하여 프로세서가 접근에 민감한 메모리를 접근하도록 만들 수 있을 것임.
  2. 컴파일된 위의 코드가 실행될 때, 프로세서는 x의 악성값을 array1_size와 비교하는 것으로 시작. array1_size를 읽는 것은 캐시 미스[2]를 발생시키고, 프로세서는 그것의 값이 DRAM으로부터 가용해질 때까지 상당한 지연을 겪게 됨. 특히 분기 조건 또는 분기 이전 위치의 명령어의 경우, 캐시되지 않은 인수를 기다린다면 분기 결과가 결정되기까지 많은 시간이 걸릴 것. 그동안 분기 예측기는 if 조건이 참일 것이라 가정하고, 해당 추측에 따라서 array1의 기저 주소에 x를 더한 뒤 메모리 서브시스템으로부터 결과 주소 위치의 데이터를 요청함으로써 실행 시간 효율을 높이는 데, 이것이 바로 분기 예측과 추측 실행 기술의 핵심임. 이 읽기 작업은 캐시 히트일 것이며 숨겨진 바이트 k의 값을 빠르게 반환할 것. 추측 실행 로직은 k를 이용해 array2[k * 4096] 주소를 계산할 수 있음. 다음으로 메모리로부터 해당 주소를 읽기 위한 요청을 전달함(이는 캐시 미스를 유발.)
  3. array2로부터 읽기가 진행 중인 동안, 분기 결과가 최종적으로 결정될 수 있음. 프로세서는 추측이 잘못되었음을 깨닫게 될 것이며 추측 실행으로 변경된 레지스터 상태들을 모두 되돌릴 것임. 하지만, array2로부터 추측 읽기는 주소 특정적인 방식으로 k에 기반하는 주소에 따라 캐시 상태에 영향을 미치며, 이 결과는 추측 실행 복귀에 의해 되돌려지지 않음. 공격을 완성하기 위해, 공격자는 array2가 캐시의 어느 위치로 옮겨졌는지 측정함. 이때 캐시에 대한 부채널 공격[3] Flush+Reload, 또는 Prime+Probe 등이 사용될 수 있음. 추측 실행 시에 array2[k * 4096]을 캐시했기에, 결국 k 값을 밝혀낼 수 있음.
  • 분기 타깃 주입(CVE-2017-5715)
  1. 스펙터의 두 번째 이형에서 공격자는 ROP[4] 공격의 활용으로서, 목표 프로세스의 주소 공간에서 가젯을 선택하고, 목표가 가젯을 추측 실행하도록 유도함.
  2. 공격자는 자신이 선택한 위치에서 추측 실행이 진행되게 하기 위해 분기 예측기를 악성 목적지로 훈련시킴. 분기 타깃 버퍼[5]를 훈련시키기 위해, 공격자는 목표 프로세스의 주소 공간에서 가젯의 가상 주소를 찾고, 이 주소에 대해 간접 분기[6]를 수행. 이 훈련은 공격자의 주소 공간에서 이루어짐. 공격자의 주소 공간의 가젯 주소 위치에 무엇이 상주하는지는 문제되지 않으며, 요구되는 조건의 전부는 훈련 중 공격자의 가상 주소들이 목표의 그것들과 일치해야 한다는 점뿐임.
  3. 공격자가 선택한 위치에서 추측 실행이 진행된다면 주목할 만한 부수 효과들을 남길 수 있을 것인데, 공격 가능한 조건 분기 예측 실패가 없는 상황에서도 목표 프로세스 메모리를 노출시킬 수 있기 때문에, 이 방법은 공격자에게 매우 강력한 수단이 되어줌.

멜트다운

취약점은 근본적으로 하드웨어에 의해 강제되는 보안 경계들을 '녹여버림.'[7] 멜트다운 공격은 '불량 데이터 캐시 적재(CVE-2017-5754)'를 기반으로 수행됨.

  • 불량 데이터 캐시 적재(CVE-2017-5754)
   ; rcx = kernel address, rbx = probe array
   xor rax, rax
   retry : 
   mov al, byte [rcx]
   shl rax, 0xc
   jz retry
   mov rbx, qword [rbx + rax]
멜트다운의 로고
멜트다운의 코드 일러스트


"인텔" CPU게이트


각주

  1. 출처 : https://spectreattack.com/
  2. 캐시는 주 기억 장치와 CPU 사이에서 자주 접근되는 데이터나 명령어들을 저장해두는 고속 버퍼 메모리로, 요청된 데이터가 캐시에서 발견되는 경우를 캐시 히트라고 하고, 캐시 내에 없을 때는 이를 캐시 미스라고 함.
  3. 암호 체계나 시스템의 물리적인 구현 과정의 정보를 기반으로 하는 공격 방법으로, 캐시에 사용되는 소요 시간 분석의 경우 다양한 계산을 하는 데 소요되는 시간을 측정하는 것을 기반으로 함.
  4. 반환 지향형 프로그래밍. 이 기법에서 공격자는 프로그램의 제어 흐름을 하이재킹하기 위해 호출 스택의 제어를 얻고, '가젯'이라 불리는 신중히 선택된 기계어들을 실행함. 각 가젯은 일반적으로 연결됨으로써 의미를 구현하는 몇몇 명령어들과 함께 마지막에 반환 명령어(ret)로 끝남.
  5. 분기 예측에 사용되는 프로세서 구성 요소로 분기 명령의 위치와 해당 명령의 타깃 주소를 담고 있음.
  6. 다음 실행할 명령어의 주소를 직접 명시하는 대신, 주소가 위치한 곳을 명시하는 인수를 갖는 프로그램 제어 명령어 유형.
  7. 출처 : https://meltdownattack.com/