Spectre Variant 3 : rogue data cache load (Meltdown) (CVE-2017-5754) 설명

소개



2018년 1월, Meltdown/Spectre에서 큰 소란이 되었습니다. 여기 Meltdown에 대해 다룹니다. Meltdown은 CPU의 micro-architecture 취약성을 이용한 사이드 채널 공격으로, 읽을 수 없는 커널 메모리의 내용을 읽어 버린다는 커널을 지키는 벽을 녹여 버리는 이상한 공격입니다.
어떻게 하시겠습니까?

취약성 내용



전제 지식



CPU cache, out-of-order 실행, 예외 (일반 보호 위반)

Meltdown



【논문】Meltdown 에 PoC가 실려 있습니다.
1     ; rcx = kernel address
2     ; rbx = probe array
3 retry:
4     mov al, byte [rcx] ; kernelのメモリを1バイト読み出す
                         ; 権限がないのでここで例外(一般保護違反)が上がるが、
                         ; 上る前に下のコードがout-of-order実行機構に
                         ; よって実行されるというのがキモの部分。
5     shl rax, 0xc       ; 読み出した値に 4096 をかける
6     jz retry           ; 4行目でkernelメモリを読み出すときに例外が投げ
                         ; られ読めなかった時、alは0になる場合があるそう
                         ; です。その時は読めるまでリトライするそうです。
                         ; (論文の5.2より)
                         ; でもkernelメモリの値が0だったときに引っかかりますね。
7     mov rbx, qword [rbx + rax] ; array[rax * 4096] ということ

다섯 번째 줄의 4096 숫자는 page size(=4KB)와 일치합니다. 혹시 OS에 의해 page in했을 때에 페이지내의 데이터가 모두 캐쉬에 타는 경우가 있을 때 대책일지도 모릅니다.

C 언어로 의사 코드를 쓰면 다음이군요.
static int probe[256 * 4096];
// probeのすべての領域をフラッシュしてキャッシュから追い出す.
unsigned char k = &0xXXXXXXXX; // 読みたい kernel memory アドレス.
unsigned char a = *k; // カーネルメモリから1バイト読み出す.
int tmp = probe[a * 4096]; // カーネルから読み出した値をインデックスとして値読み出し。つまりキャッシュに乗る。

물론 커널 메모리를 읽을 수 없기 때문에 처리는 되감아 상태가 되돌아갑니다만, CPU 캐시에 특정의 주소가 실려 있다 실려 있지 않다고 하는 정보는 남기 때문에 거기를 잘 사용했다고 하는 것입니다.

나머지는 probe 배열의 값입니다.
1*4096
2*4096
3*4096
···
와 시간을 측정하면서 읽어 가고, 캐시에 실려 있는 경우는 고속으로 읽을 수 있으므로 거기의 인덱스로부터 커널 메모리의 값을 알 수 있다고 하는 것입니다.
(덧붙여서 여기가 사이드 채널 공격이라고 불리는 부분)


논문의 그림 4에서 발췌. 하나만 액세스 타임이 200 cycle라고 하는 것이 있습니다만, 여기가 커널 메모리의 값이라고 하는 것입니다.

감상



커널 메모리를 읽으러 갔을 때에 오르는 예외의 타이밍이 느리기 때문에 이렇게 되는 것일까요. AMD는 명령을 실행할 때, 순차 권한 체크를 확실히 하고 있을 것입니다(아마).

꽤 재미있는 기법입니다.

덧붙여서 Meltdown의 공격 수법은 Spectre Variant 1과 거의 같습니다만, 저희는 분기 예측과 투기 실행을 이용, 이쪽은 ooo 실행을 이용하는 것이 다릅니다.

CVE



CVE-2017-5754
CVSSv3=5.5, AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N

참고



【논문】Spectre Attacks: Exploiting Speculative Execution

【논문】Meltdown

【wikipedia】Spectre

【wikipedia】Meltdown

【Project Zero】Reading privileged memory with a side-channel

【PDF】Meltdown Spectre - SANS.org

【wikipedia】아웃 오브 오더 실행

【@IT】제212회

【Qiita@msmania】Windows에서 Meltdown 한다

【Qiita@msmania】Windows에서 Spectre 한다

【하테나】Spectre & Meltdown을 막는 마이크로 아키텍처 SafeSpec의 논문을 읽는다

【Hisa Ando】 새로운 위협 - Spectre와 Meltdown

CVE-2017-5754 - Red Hat 고객 포털

히스토리



2018/08/12 초판

좋은 웹페이지 즐겨찾기