제 개인 블로그에 올린 글을 제가 링크를 걸어놓았는데,
아무래도 클리앙에 직접 글을 올리는게 더 좋을 것 같아 핵심글을 여기서 직접 다시 작성했습니다.
스펙터와 멜트다운 공격 2: 스펙터 공격 을 먼저 보시는 것을 권장합니다
http://www.clien.net/service/board/lecture/12021230CLIEN
본 글에서는 멜트다운 공격의 핵심원리를 설명합니다.
Meltdown
멜트다운 공격의 핵심 코드는 다음과 같습니다.
스펙터 공격과 마찬가지로 멜트다운 공격의 핵심 코드는 단 두줄입니다. 코드에 대한 설명은 다음과 같습니다.

멜트다운 공격의 동작을 요약하자면 다음과 같습니다.
A. 프로그램을 실행하면 1번줄의 raise_exception() 함수가 실행된다.
B. raise_exception() 함수는 예외 (exception)을 발생시키기 때문에 1번 함수 실행 후 프로그램은 강제 종료된다. (참고: 컴퓨터에서 예외란 어떤 수를 0으로 나누거나 권한없이 OS 메모리 영역에 접근하는 것 등의 특별한 상황이다.)
C. 3번줄의 명령어는 실행되지 않는다. 그러나 실제로는 CPU의 Out-of-order Execution 때문에 3번 명령어가 1번 명령어 전에 실행될 수 있다.
D. 3번줄의 명령어가 실행되었다면, data 값에 해당하는 probe_array의 메모리 페이지가 캐쉬 메모리에 올라가게 된다. FLUSH+RELOAD 기법을 사용하면 해당 data를 알아낼 수 있다.
Out-of-order Execution
멜트다운 공격은 현대 CPU의 Out-of-order (O3) Execution 기법의 허점을 이용합니다. O3 Execution은 거의 대부분의 고성능 CPU들이 채택하고 있는 성능향상 기법입니다. 핵심 원리는 다음과 같습니다.

프로그래머의 논리상 위의 코드에서 프로그램은 위에서 아래로 실행됩니다. 즉 x = 10이 실행된 다음에 z = a가 실행이 되고, 다음에 y = x + z가 실행이 됩니다.
O3 Execution은 명령어의 실행순서가 바뀌어도 원래 프로그램의 결과와 같을 수 있다는 성질을 이용합니다.
예를들어, x = 10 명령어를 실행하는 동안 z = a 명령어를 먼저 실행해도 결과에는 전혀 영향을 주지 않습니다. 그러나 y = x + z명령어를 먼저 실행할 수는 없습니다. 왜냐면 y = x + z 의 결과는 z = a 결과에 따라서 달라지기 때문입니다.
O3 Execution은 프로그램에서 명령어 순서에 상관없이 실행될 수 있는 명령어들을 먼저 실행함으로써 (앞의 명령어들이 수행될 동안) CPU의 성능을 향상 시키는 기법입니다.
FLUSH+RELOAD
Out-of-order Execution 의 허점을 이용하여 캐쉬메모리에 올라간 data의 값은 FLUSH+RELOAD를 통해 알아낼 수 있습니다. (FLUSH+RELOAD는 스펙터 공격에서 설명됩니다. http://www.clien.net/service/board/lecture/12021230CLIEN )
멜트다운 공격도 스펙터 공격과 마찬가지로 CPU의 성능향상 기법이 보안위협이 된다는 점에서 상당히 골치아픈 문제로 여겨지고 있습니다.
– 본 포스트는 https://www.meltdownattack.com 에 있는 논문과 자료들을 토대로 작성되었습니다.
(지나가던 35세 무직, 문과)