스펙터와 멜트다운 공격 1: 배경지식
본 포스트에서는 멜트다운과 스펙터 공격을 이해하기 위한 배경지식을 설명합니다.
1. 컴퓨터 구조와 작동원리
컴퓨터의 핵심 요소는 “CPU와 메모리” 이다.
컴퓨터는 메모리에서 프로그램 (명령어)과 데이터를 CPU로 가져와 연산을 수행한 후, 결과를 다시 메모리에 저장하는 단순한 장치이다.
조금 더 쉬운 이해를 위해 예를 들어보자. 아래와 같은 매우 간단한 (두 개의 명령어로 이루어진) 프로그램을 실행시킨다고 생각해보자.
a = 1 + 2;
b = a + 13;
우리가 해당 프로그램을 더블 클릭해서 실행하는 순간, 다음과 같은 동작을 통해 프로그램이 실행된다.
A. 메모리에 프로그램을 로드
위 프로그램의 코드와 데이터들은 메모리 상에 다음과 같이 올라가게 된다. (물론 설명을 위해 아주 간단하게 표현한 방식이다. 실제로는 더욱 복잡하다.)
위 그림에서 중요한 포인트는 다음과 같다.
- 메모리는 주소를 갖는다: 0x01, 0x02 등은 메모리의 주소 (번지수) 이다.
- 메모리에 주소값을 입력해주면 해당 주소에 들어있는 값 혹은 명령어가 출력된다: 메모리에 0x02 을 입력하면 a = 1 + 2 명령어가 출력된다.
- 한 명령어는 보통 4바이트의 크기를 갖는다: a = 1 + 2 명령어는 0x02번지부터 0x05번지에 걸쳐 저장되어 있다. a = 1 + 2 명령어를 불러오기 위해서는, 해당 명령어의 시작 주소인 0x02를 입력해주면 된다.
B. 프로그램 실행
프로그램은 명령어들의 집합이며, 각 명령어들은 아주 단순히 Instruction Fetch – Execution – Value Store 단계를 거쳐 실행된다.
- Instruction Fetch: 메모리에서 명령어 하나를 CPU로 가져와 실행할 준비를 한다 (0x02 주소를 메모리에 입력).
- Execution: 해당 명령어를 실제로 실행한다 (1 + 2 계산을 수행).
- Value Store: 실행한 계산의 결과를 다시 메모리에 저장한다 (메모리 상 a의 영역에 1 + 2의 결과인 3을 저장).
위의 과정을 거치면 하나의 명령어가 실행이 완료된다. 프로그램은 모든 명령어가 실행완료될 때까지 반복해서 위 과정을 실행한다.
C. 성능 지표
성능이 더 좋은 CPU란? 이 질문의 답은 간단하지 않다. 성능 지표에는 여러가지가 있지만 프로그램을 더 빠르게 실행시키는 CPU가 더 좋다고 할 수 있다.
‘컴퓨터 프로그램’ 은 ‘명령어의 집합’ 이다. 다시말해 같은 시간 내에 더 많은 명령어를 실행시키는 CPU가 성능이 더 좋다 라고 말할 수 있다. (실제로는 명령어의 종류마다 실행시간이 달라 이도 고려해야 한다.)
성능이 더 좋은 CPU는 같은 시간 내에 더 많은 명령어를 실행할 수 있다.
2. 보안공격의 목적
보안 공격이라 하면 여러가지 공격을 지칭한다. 본 포스트에서는 스펙터와 멜트다운 공격에 사용된 부채널 공격 (side channel attack) 의 목표를 설명한다.
위에서 기술한 바와 같이, 메모리에는 각종 프로그램들이 저장되는데, 우리가 사용하는 OS (윈도우 혹은 리눅스) 또한 메모리에 상주하게 된다. OS에는 시스템 운영에 관련된 각종 정보들이 포함되어있다. 이 중 시스템 구동에 중요한 정보들 (예를 들어 운영자의 신상 정보나 비밀번호 등) 도 포함이 될 수 있는데, 기존 OS들은 허락받지 않은 프로그램이 이를 읽는 것을 방지하기 위해 이른바 모드라는 개념을 가지고 있다.
컴퓨터 실행 시 모드는 크게 커널 모드와 유저 모드로 나뉜다. 말그대로 컴퓨터가 커널 모드에 있을때만 OS 프로그램이 있는 메모리 주소에 접근할 수 있다. 유저 모드에 있을 때는 엑셀, 게임 등과 같은 일반 프로그램을 실행하는 권한만 가지고 있다.
만약 유저 모드 권한만 가지고 있는 일반 프로그램 (예를들면 내가 짠 C++ 프로그램) 이 OS영역의 메모리 주소에 접근해 데이터를 읽으려고 하면 어떻게 될까?
정답은 이때 운영체제가 이를 감지하여 예외 (Exception) 를 발생시켜 접근을 시도한 프로그램을 강제 종료시켜 버린다. 따라서 유저 모드에 있는 프로그램은 OS 영역의 데이터를 읽을 수 없다.
바로 이 금지된 OS 영역의 메모리에 접근하여 데이터를 읽는 것이 바로 스펙터/멜트다운 공격의 목표이다 (스펙터는 타 프로그램의 메모리 영역만). 스펙터/멜트다운 공격은 CPU의 보안허점을 이용하여 유저 모드 프로그램이 OS 메모리 영역 (스펙터는 타 프로그램의 메모리 영역만) 에 접근해 보안정보를 (예: 다른 사용자의 비밀번호, 개인정보 등) 읽을 수 있게 한다.
부채널 공격의 목표: 허가받지 않은 메모리 영역에 접근하여 비밀 데이터를 읽어오는 것