Tech

스펙터와 멜트다운 공격 3: 멜트다운

본 포스트에서는 멜트다운 공격의 핵심원리를 설명한다.

 

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 기법은 앞의 스펙터 편에서 설명하고 있다.

스펙터와 멜트다운 2: 스펙터 공격 바로가기

 

본 포스트에서는 멜트다운 공격의 핵심원리를 설명하였다. 멜트다운 공격도 스펙터 공격과 마찬가지로 CPU의 성능향상 기법이 보안위협이 된다는 점에서 골치아픈 문제라고 할 수 있다.

 

 

– 본 포스트는 https://www.meltdownattack.com 에 있는 논문과 자료들을 토대로 작성되었습니다.

본 포스트에 대한 질문, 커멘트 등은 acsstudent28@gmail.com 으로 보내주세요.

 

 

 

 

 

One thought on “스펙터와 멜트다운 공격 3: 멜트다운

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다