Hacking/Pwn.

Meltdown, Spectre 정리

2018. 1. 16. 22:08



비오비 과제로 1월 19일까지 최근 이슈인 Intel Meltdown 과 Spectre 를 정리하는 것을 하게 되어 블로그에 정리하게 되었다. 필자가 쓴 글은 거의 해당 논문을 해석하고 덧붙이는 쪽으로 정리할 예정이다. 해당 논문 외에는 김승주 교수님께서 페이스북에 공유하신 문서들을 정리하였다. 


일단 간단하게 정리해보았다.




CPU들은 연산 속도 향상을 위해 여러 기술들을 도입했고, 도입한 기술 중 하나가 바로 이번에 취약점 터진 기술인 비순차적실행(Speculative Execution)과 분기 예측(Indirect Branch Prediction)이다. 


Intro 

 설명하기 전에, 간단하게 멜트다운, 스펙터를 설명하자면 권한을 갖고 있지 않더라도 충분히 다른 프로세스의 메모리를 Leak할 수 있다는 취약점이다. 멜트다운은 Intel CPU 기반의 PC에서만 일어나는 취약점이지만, Spectre는 Intel, AMD, ARM 가리지 않고 모든 CPU 사에서 일어난다. 

▲ 출처 : https://gist.github.com/ErikAugust/724d4a969fb2c6ae1bbd7b2a9e3d4bb6 (awt135's comment)



 오늘날 운영 체제의 핵심 보안 기능 중 하나는 메모리 격리이다. 스택만 하더라도 지금 쓰이고 있는 보호기법들을 보면 알 수 있다. 운영 체제는 사용자 응용 프로그램이 서로의 메모리에 액세스 할 수 없도록하고 사용자 응용 프로그램이 커널 메모리를 읽거나 쓰지 못하게한다. 


 최신 프로세서에서 kernel과 사용자 프로세스 간의 격리는 일반적으로 커널의 메모리 페이지에 액세스 할 수 있는지 여부를 정의하는 프로세서의 supervisor bit로 구현됩니다. 기본 아이디어는 이 비트가 커널 코드를 입력 할 때만 설정할 수 있으며 사용자 프로세스로 전환 할 때이 비트가 지워진다는 것입니다. 이 하드웨어 기능은 운영 체제가 커널을 모든 프로세스의 주소 공간에 매핑하고 인터럽트 처리와 같이 사용자 프로세스에서 커널로 매우 효율적으로 전환 할 수 있도록 한다. 따라서 실제로는 사용자 프로세스에서 커널로 전환 할 때 메모리 매핑이 변경되지 않는다.



Background

Out-of-order Execution

Out-of-order Execution(OoOE)는 한국어로 '비순차적 명령 처리'라고도 하는데, 말 그대로 CPU의 속도를 위해서 비순차적으로 명령을 처리하는 것이다. 다음 사진은 위키백과의 비순차적 명령 처리 문서 중 일부이다. 



Speculative Execution

Speculative Execution는 한국어로 보통 '예측 실행'으로 해석한다. 이론대로라면, 한 프로세스가 끝나기 전에 다른 프로세스가 실행될 수 없다는 것이 자명한 사실이지만, CPU 설계자들은 CPU의 속도를 높이기 위해서 '예측 실행' 방법을 사용한다. 한 명령을 실행하면서 뒤에 올 명령을 준비하는 기술이다. 해당 기술을 사용할 때 다음 명령을 위한 메모리를 CPU cache에 미리 로드하여 속도를 높인다. 


Branch Prediction

Branch Prediction는 한국어로 보통 '분기 예측'이라고 해석한다. 잘 이해가 가지 않아서 많은 문서를 보았는데, 잘 표현한 것 같은 문장이 있어서 가져왔다. 

"중간 중간에 동작 상태를 저장해 놓고 다음 클럭이 들어왔을 때 그 상태를 다음 단계로 넘겨주면 직렬연결 단계를 줄이게 되면서 동작클럭을 높일 수 있지 않을까?"

디지털 집적회로에서의 파이프라인이라는 개념이 탄생하는 순간이었다.


(고 나무위키가 말하였다.) 이런 방식을 도입하게 되면, 분기가 맞아 떨어질 경우 속도를 많이 높일 수 있는데 이것이 Spectre 취약점으로 연계가 된다.. (더 자세한 문서를 보려면 링크를 클릭해주세요)


The Memory Hierarchy

빠른 프로세서와 느린 메모리 간의 속도 차이를 메우기 위해 프로세서는 연속적으로 작지만 빠른 캐시 계층을 사용한다. 캐시는 메모리를 64 비트 또는 128 바이트의 전형적인 라인 크기로 라인이라는 고정 된 크기의 덩어리로 나눈다. 프로세서가 메모리의 데이터를 필요로 할 때, 먼저 계층의 맨 위에있는 L1 캐시에 사본이 들어 있는지 확인한다.


스펙터에서 해당 기술을 이용하는데, 캐시 접근 시간을 통해서 어떤 데이터가 저장되어 있는지 추측하고 역으로 실행하는 방법으로 다른 프로세스의 메모리를 읽어올 수 있다. 



Exploiting Conditional Branch Misprediction

다음과 같은 코드가 있다고 가정하자. 





asf

PoC 



참고한 문서 

[1] <데일리시큐> 인텔 CPU 취약점 Meltdown과 Spectre 분석 그리고 대응방안 :  http://www.dailysecu.com/?mod=news&act=articleView&idxno=27795

[2] <GPZ> Reading privileged memory with a side-channel : https://googleprojectzero.blogspot.kr/2018/01/reading-privileged-memory-with-side.html

[3] Intel Meltdown, Spectre - Windows 2008R2 패치 적용 결과 : https://m.blog.naver.com/PostView.nhn?blogId=testcode&logNo=221180025944&proxyReferer=http%3A%2F%2Fm.facebook.com

[4] ‘인텔 CPU 게이트’ 해킹 우려...평창은? : http://khnews.kheraldm.com/view.php?ud=20180108000964&md=20180109003007_BL&kr=1

[5] Windows Meltdown and Spectre patches: Now Microsoft blocks security updates for some AMD based PCs : http://www.zdnet.com/google-amp/article/meltdown-and-spectre-now-microsoft-blocks-security-updates-for-some-amd-based-devices/?__twitter_impression=true

[6] 21세기 최악의 스켄들로 기록될 수 있는 CPU 게이트, 멜트다운과 스팩터 버그에 대해서.. : http://poem23.tistory.com/3214

[7] CPU 게이트 : https://namu.wiki/w/CPU%EA%B2%8C%EC%9D%B4%ED%8A%B8

[8] 인텔 CPU 취약점(Meltdown&Spectre) 분석 및 이스트시큐리티 대응상황 : http://blog.alyac.co.kr/1472

[9] Spectre Attacks: Exploiting Speculative Execution : https://spectreattack.com/spectre.pdf

[10] 파이프라인(CPU) : https://namu.wiki/w/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8(CPU)