777. Evict+Time 기법 (Evict+Time Technique)

핵심 인사이트 (3줄 요약)

  1. 본질: Evict+Time은 특정 캐시 세트를 인위적으로 비운(Evict) 뒤 피해자 프로그램의 전체 실행 시간(Time) 변화를 측정하여, 해당 캐시 세트가 비밀 연산에 사용되었는지를 추론하는 부채널 공격이다.
  2. 가치: 개별 메모리 접근을 일일이 관찰하기 어려운 환경에서도 **전체 실행 성능의 '하락폭'**을 통해 어떤 데이터(S-Box 등)가 처리되었는지 파악할 수 있는 통계적 위력을 가진다.
  3. 판단 포인트: 실행 시간의 미세한 변동성에 의존하므로 인터럽트나 스케줄링 등의 노이즈에 취약하며, 이를 극복하기 위해 수만 번의 반복 실행과 고도의 통계 분석이 필수적이다.

Ⅰ. 개요 및 필요성

1. Evict+Time 기법의 정의

Evict+Time은 2006년 오스빅(Osvik) 등에 의해 제안된 캐시 타이밍 공격 기법이다. 공격자는 피해자가 사용하는 특정 메모리 영역(예: 암호화 테이블)에 대응하는 캐시 세트를 자신의 데이터로 강제 점유하여 비운다. 이후 피해자를 실행시키고 전체 연산 시간을 측정한다. 만약 피해자가 그 캐시 세트를 필요로 했다면, 메모리에서 다시 데이터를 가져오느라 실행 시간이 길어질 것이다. 이 시간 차이를 통해 피해자가 어떤 메모리 주소를 참조했는지 알아낸다.

2. 왜 Evict+Time인가?

  • 상대적 간결함: Prime+Probe처럼 정교한 캐시 상태 관찰이나, Flush+Reload처럼 공유 메모리 기반의 개별 라인 측정이 어려울 때 대안으로 사용된다.
  • 블랙박스 공격 가능: 피해자의 내부 동작을 정확히 몰라도, 특정 캐시 세트를 괴롭혔을 때 프로그램이 "느려지는가?"라는 질문 하나만으로 정보를 캐낼 수 있다.
  • 하드웨어 제약 극복: clflush 명령어 같은 특정 명령어가 지원되지 않거나 제한된 환경에서도 '자원 경합(Contention)'만으로 공격이 성립한다.

3. 기술적 배경 (캐시 축출)

공격자는 자신이 점유하고 싶은 캐시 세트에 대해 캐시의 Way 수만큼 데이터를 읽어 기존 데이터를 밀어낸다(Conflict Eviction). 이 과정 자체가 피해자의 성능에 직접적인 '병목'을 유발하는 원인이 된다.

  • 💡 비유: 요리사(피해자)가 요리를 시작하기 전에, 공격자가 특정 조리 도구(캐시 세트)를 숨겨버립니다. 요리사가 그 도구가 필요 없는 요리를 하면 평소처럼 빨리 끝내겠지만, 그 도구가 꼭 필요한 요리(비밀 데이터 처리)를 하면 도구를 다시 찾아오느라 시간이 오래 걸릴 것입니다. 이 요리 시간의 차이를 보고 요리사가 무슨 음식을 만들었는지 맞히는 것과 같습니다.
┌──────────────────────────────────────────────────────────────┐
│           Evict+Time의 공격 프로세스: "느려지면 사용한 것이다"           │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  [ 1단계: Baseline 측정 ]                                      │
│  피해자를 아무 방해 없이 실행시키고 전체 실행 시간 T1을 측정함.      │
│                                                              │
│  [ 2단계: Eviction (방해) ]                                    │
│  공격자가 특정 캐시 세트 Set X를 자신의 데이터로 가득 채워 비움.      │
│                                                              │
│  [ 3단계: Target 측정 ]                                        │
│  피해자를 다시 실행시키고 전체 실행 시간 T2를 측정함.               │
│                                                              │
│  [ 4단계: 비교 ]                                              │
│  - T2 > T1 + 알파: 피해자가 Set X를 사용했음!                   │
│  - T2 ≒ T1: 피해자가 Set X를 사용하지 않았음!                    │
│                                                              │
└──────────────────────────────────────────────────────────────┘
  • 📢 섹션 요약 비유: Evict+Time은 육상 선수의 트랙 중 특정 지점에만 모래(캐시 미스 유도)를 뿌려놓는 것과 같습니다. 선수가 그 지점을 밟아야 하는 코스로 달렸다면 기록이 나빠질 것이고, 다른 코스로 달렸다면 기록에 변화가 없을 것입니다.

Ⅱ. 아키텍처 및 핵심 원리

1. 전역 타이밍 측정 (Global Timing)

Evict+Time의 핵심은 개별 mov 명령어나 캐시 접근 시간이 아니라, encrypt() 함수 전체나 프로세스 실행 전체의 시간을 쟨다는 점이다.

  • 측정 수단: gettimeofday(), clock_gettime(), 또는 고해상도 rdtsc.

2. 공격 메커니즘과 데이터 추출

단계수행 기술하드웨어 내부 현상
Set 공략Eviction Set 구성특정 캐시 인덱스에 대해 충돌 미스(Conflict Miss) 발생 유도
실행 유도시스템 콜 또는 API 호출피해자 프로세스가 파이프라인 상에서 명령어 집합 실행
패널티 발생캐시 미스에 따른 지연캐시에서 데이터를 못 찾아 메인 메모리(DRAM) 접근 발생 (약 100ns 지연)

3. AES 공격 시나리오

AES 암호화는 256바이트 크기의 T-Table 4개를 사용한다. 이 테이블들은 여러 캐시 세트에 걸쳐 저장된다.

  • 공격자가 1번 캐시 세트를 비운다.
  • 암호화 시간이 늘어났다면, plaintext ^ key의 결과로 도출된 인덱스가 1번 세트에 해당함을 의미한다.
  • 이 과정을 모든 캐시 세트에 대해 반복하고 통계 처리하면 key 값을 좁힐 수 있다.
┌──────────────────────────────────────────────────────────────┐
│             전체 실행 시간 분포와 통계적 분리                     │
├──────────────────────────────────────────────────────────────┤
│  빈도(Count)                                                 │
│    ^         [정상 실행]      [지연 실행 (Hit by Eviction)]   │
│    │           _..._                _..._                    │
│    │        .'       '.          .'       '.                 │
│    │       /           \        /           \                │
│    └───────┼───────────┼────────┼───────────┼───────> 시간    │
│            T1                   T2                           │
│                                                              │
│  두 분포의 평균값 차이가 유의미하면 해당 캐시 세트가 쓰인 것으로 판단.  │
└──────────────────────────────────────────────────────────────┘
  • 📢 섹션 요약 비유: 복도 끝에서 소리만 듣고 있는 것과 같습니다. 문 열리는 소리(캐시 미스 발생)가 들리고 난 뒤 발소리가 늦게 들리면, 그 사람이 중간에 있는 특정 방(캐시 세트)에 들어갔다 나왔음을 유추하는 원리입니다.

Ⅲ. 비교 및 연결

1. 주요 캐시 공격 기법 비교

항목Evict+TimePrime+ProbeFlush+Reload
측정 대상전체 실행 시간개별 데이터 접근 시간개별 데이터 적중 여부
공유 메모리불필요불필요필수
공격 효율낮음 (반복 횟수 많음)중간매우 높음
환경 제약거의 없음캐시 구조 지식 필요clflush 및 메모리 공유 필요

2. 노이즈와의 싸움

Evict+Time은 현대 OS의 선점형 스케줄링(Preemptive Scheduling)이나 인터럽트에 가장 취약하다.

  • 해결책: 수천 번의 샘플을 수집한 뒤, 상위 10%의 극단값(Noise)을 버리고 중앙값이나 평균값의 변화를 관찰하는 통계적 필터링이 필수적이다.

3. Spectre와의 연결

Spectre 공격에서 예측 실행 후 데이터를 추출할 때, 시스템이 매우 제한적이어서 직접적인 캐시 상태 확인이 어려울 경우, Evict+Time과 유사하게 전체 루프 실행 시간의 변화를 관찰하는 방식으로 응용될 수 있다.

  • 📢 섹션 요약 비유: Flush+Reload가 고화질 CCTV라면, Evict+Time은 멀리서 보이는 그림자의 크기 변화로 사람의 움직임을 맞히는 저해상도 센서와 같습니다. 하지만 CCTV가 없는 곳에서는 이 센서가 유일한 무기가 됩니다.

Ⅳ. 실무 적용 및 기술사 판단

1. 방어 전략 (Countermeasures)

A. 소프트웨어 레벨 (상수 시간 보장)

  • Table-less 구현: S-Box 테이블 대신 비트 연산(Logical operations)으로 암호 알고리즘을 구현하여 메모리 참조 자체를 없앤다.
  • Pre-loading: 암호 연산 시작 전 테이블 전체를 강제로 캐시에 로드하여, 어떤 값을 참조하든 무조건 Hit이 나게 만든다. (단, 도중에 Evict 되면 무력화될 수 있음)

B. 하드웨어 및 운영체제 레벨

  • 시간 측정 무력화: 유저 모드에서 나노초 단위의 정밀한 시간 측정을 금지하거나, 시스템 콜 호출 시간에 의도적으로 지터(Jitter)를 섞는다.
  • 캐시 파티셔닝 (Partitioning): 보안 프로세스가 사용하는 캐시 라인을 다른 프로세스가 축출(Evict)할 수 없도록 하드웨어적으로 보장한다.

2. 실무적 판단 가이드

  • 성능 영향 평가: 방어 기법(Pre-loading 등)을 적용할 때 발생하는 캐시 오염(Cache Pollution)이 시스템 전체 성능에 미치는 영향을 측정해야 한다.
  • 통계적 유의성: 공격자가 수만 번의 시도를 해야 정보를 얻을 수 있다면, 그 이전에 이상 징후를 감지하여 차단하는 '공격 빈도 기반 탐지' 전략이 실무적으로 효과적이다.

3. 안티패턴 및 체크리스트

  • 안티패턴: 연산 결과에 따라 즉시 응답을 반환하는 API 서버. (연산 시간의 차이가 곧바로 네트워크 지연 시간으로 노출되어 Remote Evict+Time 공격의 빌미가 됨)

  • 체크리스트:

    • 암호화 라이브러리가 'Constant-time' 인증을 받았는가?
    • 고해상도 타이머 사용 권한이 제한되어 있는가?
  • 📢 섹션 요약 비유: 방어 전략은 마치 '항상 같은 시간에 퇴근하기'와 같습니다. 일을 빨리 끝냈든 늦게 끝냈든(어떤 데이터를 처리했든) 무조건 정해진 시간에만 문을 열어주면, 밖에서는 내가 안에서 얼마나 바빴는지 알 수 없습니다.


Ⅴ. 기대효과 및 결론

1. 기대효과

  • 원격 공격 대응: 네트워크를 통한 타이밍 공격의 원리를 이해함으로써 클라우드 API 설계 시 보안 가이드라인을 수립할 수 있다.
  • 포괄적 보안 모델링: 개별 명령어뿐만 아니라 시스템 전체의 '성능 프로파일' 자체가 정보 누출의 통로가 될 수 있음을 인지하게 된다.

2. 한계 및 미래 방향

CPU의 비순차 실행(OoO)과 투기적 실행(Speculative Execution)이 복잡해질수록 전체 실행 시간의 변동성은 더 커진다. 이는 공격자에게는 더 많은 노이즈를, 방어자에게는 더 예측하기 어려운 취약점을 의미한다. 미래에는 하드웨어가 실행 시간을 일정하게 유지하는 '보안 실행 모드'를 제공해야 할 것이다.

3. 최종 결론

Evict+Time은 **"시간은 데이터의 그림자"**임을 보여주는 기술이다. 하드웨어가 아무리 데이터를 암호화하여 숨겨도, 그 데이터를 처리하는 데 걸리는 시간까지는 쉽게 숨기지 못한다. 기술사는 시스템 아키텍처를 설계할 때 기능적 정확성뿐만 아니라, 시간이라는 부채널을 통해 흐르는 정보의 양을 통제할 수 있는 통찰력을 갖추어야 한다.

  • 📢 섹션 요약 비유: Evict+Time은 우리에게 '침묵의 가치'를 일깨워줍니다. 단순히 비밀을 말하지 않는 것을 넘어, 비밀을 지키기 위해 드는 노력(시간)조차 남들에게 들키지 않아야 진정한 보안이 완성됩니다.

📌 관련 개념 맵

개념 명칭연결 포인트 및 시너지
Conflict Miss공격자가 특정 세트를 비우기 위해 의도적으로 유발하는 캐시 미스.
Constant-time연산 내용에 상관없이 항상 동일한 시간을 소모하게 하는 방어 철학.
Jitter 주입타이밍 측정의 정확도를 떨어뜨리기 위해 인위적인 노이즈를 섞는 기술.
S-Box / T-Table타이밍 공격의 주 타겟이 되는 암호 알고리즘의 룩업 테이블.
rdtsc실행 시간의 미세한 차이를 잡아내기 위해 필수적인 CPU 명령어.

👶 어린이를 위한 3줄 비유 설명

  1. Evict+Time은 친구가 보물찾기를 할 때, 특정 장소(캐시)에 미리 장애물을 설치해 두는 거예요.
  2. 친구가 그 장소에서 보물을 찾으려 했다면 장애물 때문에 시간이 훨씬 오래 걸릴 거예요.
  3. 친구가 보물을 찾는 데 걸린 전체 시간을 재어보면, 친구가 어느 장소에 갔었는지 몰래 알아낼 수 있답니다.