한양과학기술고등학교

에듀테크 프로젝트 대시보드

스펙터 & 멜트다운

현대 CPU는 빠르게 실행하려고 분기(if문) 결과가 나오기도 전에 미리 추측해서 다음 명령어들을 먼저 실행해버립니다 (투기적 실행, Speculative Execution). 추측이 틀리면 레지스터·메모리 값은 원래대로 되돌리지만("안 일어난 일"이 됨), 그 과정에서 CPU 캐시에는 흔적이 남습니다. 2018년 공개된 스펙터(Spectre)와 멜트다운(Meltdown)은 바로 이 "지워지지 않은 캐시 흔적"을 타이밍 측정으로 읽어내 원래는 접근할 수 없어야 할 메모리를 훔쳐보는 하드웨어 취약점입니다.
🧠 투기적 실행이란? 분기 예측
CPU 파이프라인은 명령어를 한 줄씩 순서대로 처리하면 느립니다. 그래서 분기(if)를 만나면 분기 예측기가 "아마 참일 것"이라고 찍고, 결과 확인 전에 그 다음 코드를 먼저 실행(투기)해둡니다. 나중에 예측이 맞았으면 그대로 확정(commit), 틀렸으면 폐기(squash)합니다.
IF
DE
EX(추측)
MEM(캐시적재)
WB
문제: 레지스터·아키텍처 상태는 롤백되지만, EX/MEM 단계에서 캐시에 올라간 데이터는 롤백되지 않고 그대로 남습니다. "실행되지 않은 것"이 캐시에는 흔적을 남기는 셈입니다.
⏱️ 캐시 사이드채널 (Flush+Reload) 타이밍 측정
공격자는 데이터를 직접 읽을 수 없어도, 어떤 주소가 캐시에 있는지는 시간으로 알아낼 수 있습니다.
캐시에 있는 데이터 접근~4ns (매우 빠름)
캐시에 없는 데이터 접근~120ns (느림, 메모리까지)
비밀 바이트 값을 배열 인덱스로 써서 투기적으로 그 배열 한 칸을 캐시에 올려두면, 나중에 256칸을 하나씩 시간 재보는 것만으로 "어느 칸이 빨랐는지" → 비밀 바이트 값을 역산할 수 있습니다.
🎮 인터랙티브 데모 — 스펙터 변종1 (경계 검사 우회) bounds check bypass
// 피해자 프로세스 안의 "안전해 보이는" 함수 uint8_t array1[16]; // 정상 데이터 (0~15만 허용) uint8_t array2[256 * 4096]; // 프로브용 배열 (공격자가 캐시 측정에 사용) uint8_t victim_function(size_t x) { if (x < array1_size) { // ← 경계 검사 return array2[array1[x] * 4096]; // 캐시에 흔적 남김 } return 0; }
① 분기 예측기 훈련 0 / 5
정상 범위(x=3)로 victim_function을 여러 번 호출 → "if는 항상 참이었다"고 CPU가 학습합니다.
1
2
3
4
5
② 범위 밖 공격 x = 비밀주소
훈련이 끝나면, 배열 밖(x=200)을 가리켜 커널 메모리의 비밀 바이트를 투기적으로 읽게 만듭니다. 분기는 결국 거짓으로 판명나 롤백되지만—
③ 캐시 타이밍 측정 Flush+Reload
array2의 256칸을 전부 접근해보며 걸린 시간을 잰다. 유독 빠른 칸의 인덱스가 곧 비밀 바이트 값!
📊 array2 캐시 타이밍 (인덱스 0~255)
064128192255
📋 실행 로그
// 대기 중... 먼저 분기 예측기를 훈련시키세요.
⚔️ 스펙터 vs 멜트다운 차이점
스펙터 (Spectre)멜트다운 (Meltdown)
취약점 유형분기 예측 오용권한 검사 지연 실행
속이는 대상분기 예측기를 "훈련"시킴권한 확인보다 먼저 로드/사용
영향 범위같은 프로세스 내 다른 영역, 샌드박스 탈출(JS 등)커널 메모리 전체를 유저 공간에서 읽기
영향받는 CPUIntel·AMD·ARM 대부분주로 Intel (Out-of-Order 실행 방식)
주요 방어retpoline, 배열 인덱스 마스킹, LFENCEKPTI (커널/유저 페이지 테이블 분리)
🧯 완화 대책 (Mitigations)
① LFENCE / 직렬화 명령
경계 검사 직후 투기적 실행을 강제로 멈춰 다음 명령이 먼저 도는 것을 차단.

② Retpoline
간접 분기(함수 포인터 호출)를 예측 불가능한 무한루프 트릭으로 감싸 예측 자체를 무력화.

③ KPTI (Kernel Page-Table Isolation)
유저 모드에서는 커널 페이지 테이블 매핑 자체를 아예 안 보이게 분리 (멜트다운 대응).

④ 브라우저 측 방어
JS performance.now() 정밀도를 낮추고, 사이트별 프로세스 격리(Site Isolation)로 다른 출처의 메모리에 접근 못 하게 분리.
핵심 정리: 스펙터·멜트다운은 소프트웨어 버그가 아니라 "빠르게 실행하기 위한 CPU 설계 방식 자체"에서 나온 취약점입니다. 아키텍처(프로그램이 보는 결과)는 되돌려도, 마이크로아키텍처(캐시·분기 예측기 내부 상태)는 되돌리지 못한다는 점을 이용합니다. 이후 CPU들은 예측 격리, 캐시 파티셔닝 등으로 계속 보완하고 있습니다.