system

사이드 채널 공격(Side Channel Attack): Flush+Reload로 캐시 접근 패턴 들여다보기

숨usm 2025. 9. 20. 00:27

🛠️ GitHub 레포지토리

프로젝트: sumin-world/rust-security-suminworld

디렉토리 구조:

poCs/cache/        # Flush+Reload PoC (C 코드)
docs/              # Legal Notice, 설명 문서
tools/             # 분석 도구 (Rust)
examples/run.sh    # 실행 스크립트

 

현대 컴퓨터 보안에서 암호화 알고리즘 자체는 수학적으로 견고하게 설계되어 있습니다. 하지만 실제 구현 과정에서 의도치 않게 새어나오는 **부수적인 정보(side channel)**를 통해 비밀 정보가 유출될 수 있습니다. 이번 글에서는 캐시 기반 Flush+Reload 공격을 직접 실험하고, 수집된 데이터를 분석해보겠습니다.

사이드 채널 공격(Side Channel Attack)이란?

사이드 채널 공격은 프로그램 실행 중 발생하는 물리적/시간적 특성을 관찰하여 비밀 정보를 추출하는 공격 기법입니다.

주요 사이드 채널 유형

  • 시간(Timing): 연산 속도 차이 측정
  • 캐시(Cache): 메모리 접근 시간 차이 분석
  • 전력(Power): 소비 전력 패턴 관찰
  • 전자기파(EM): 전자기 방출 패턴 측정

구성

  • Victim 프로그램: 특정 메모리 인덱스를 반복적으로 접근
  • Attacker 프로그램: clflush + rdtscp 조합으로 메모리 접근 시간 측정

데이터 수집 과정

실행 스크립트

bash
# victim 프로세스 백그라운드 실행
./poCs/cache/victim_sim &

# attacker 실행하여 CSV 저장
./poCs/cache/flush_reload_attacker_csv > /tmp/flush_reload_data.csv

# victim 프로세스 종료
kill $VICTIM_PID

수집된 CSV 데이터 구조

csv
iter,cycles
0,158000
1,1000
2,1000
3,1000
4,1000
5,0

사이클 수 의미:

  • 작은 값 (~1000): 캐시 히트 - 데이터가 캐시에 존재
  • 큰 값 (~158000): 캐시 미스 - 메인 메모리에서 데이터 로드 필요

📊 통계 분석

데이터 요약

bash
# 총 샘플 수 확인
wc -l /tmp/flush_reload_data.csv

# 평균 사이클 계산
awk -F, 'NR>1{n++; sum+=$2} END{print "샘플수="n, "평균="sum/n}' /tmp/flush_reload_data.csv

분석 결과:

  • 총 샘플 수: 20,000개
  • 평균 사이클: 약 420 cycles

분포 특성

  • 0 cycles: 측정 루틴 최적화 또는 즉시 반환 케이스
  • ~1000 cycles: 캐시 히트 (victim이 해당 메모리 사용)
  • 100,000+ cycles: 캐시 미스, 컨텍스트 스위칭, 인터럽트 등

시각화 결과

1. 전체 분포 히스토그램 (로그 스케일)

로그 스케일을 사용하여 전체 데이터 분포를 확인할 수 있습니다. 대부분의 값이 저지연 영역에 집중되어 있으며, 희귀한 고지연 값들도 명확히 관찰됩니다.

2. 5000 Cycles 이하 확대 뷰

실제 캐시 히트/미스의 핵심 클러스터를 명확히 보여줍니다.

두 개의 뚜렷한 피크:

  • 0 cycles 근처: 약 12,000회 - 즉시 반환 케이스
  • ~1000 cycles: 약 7,700회 - 실제 캐시 히트

3. 선형 스케일 히스토그램

선형 스케일에서는 대부분의 측정값이 0 근처에 집중되어 있어, 캐시 히트의 압도적 비율을 시각적으로 확인할 수 있습니다.

실험 결과 해석

캐시 접근 패턴 분석

그래프에서 관찰되는 이중 클러스터(Bimodal Distribution):

  1. 저지연 클러스터 (0~1000 cycles)
    • Victim이 해당 메모리를 최근 사용
    • 데이터가 L3 캐시에 로드된 상태
    • 공격자의 메모리 접근이 빠르게 완료
  2. 고지연 값 (158000+ cycles)
    • 캐시 미스 발생
    • 메인 메모리에서 데이터 fetch 필요
    • 인터럽트, 컨텍스트 스위칭 등 외부 요인

공격 메커니즘

Flush+Reload의 작동 원리:

  1. Flush: clflush로 특정 메모리 라인을 캐시에서 제거
  2. Wait: Victim이 해당 메모리 접근할 시간 부여
  3. Reload: 동일 메모리 접근 시간 측정
  4. Analyze: 빠르면 victim이 사용, 느리면 미사용으로 판단

보안적 시사점

실제 공격 시나리오

AES 암호화 공격:

  • S-box 테이블 접근 패턴 추적
  • 각 라운드별 키 바이트 추출
  • 전체 암호화 키 복구 가능

RSA 개인키 추출:

  • Modular exponentiation 중 분기 패턴
  • Square-and-multiply 알고리즘의 비밀 지수 추적

웹 브라우저 공격:

  • 방문한 웹사이트 추적
  • 입력한 패스워드 길이 유추

대응 방안

  1. 상수 시간(Constant-Time) 알고리즘
    • 입력값에 관계없이 동일한 실행 시간
    • 조건 분기 최소화
  2. 캐시 파티셔닝
    • Intel CAT (Cache Allocation Technology)
    • 프로세스별 캐시 영역 격리
  3. 소프트웨어 대응
    • 랜덤 딜레이 삽입
    • 블라인딩 기법 적용
    • 메모리 접근 패턴 난독화

결론

Flush+Reload는 단순하지만 단지 "메모리 접근 시간"만으로도 victim 프로세스의 행동을 정확히 추적할 수 있었습니다.

현대 프로세서의 성능 최적화 기능(캐싱)이 오히려 보안 취약점이 될 수 있다는 역설적인 상황을 보여주는 사례입니다. 보안 크리티컬한 애플리케이션 개발 시 반드시 사이드채널 공격을 고려한 설계가 필요합니다.


⚠️ Legal Notice

본 실험은 순수 학습 및 연구 목적으로 진행되었습니다. 실제 시스템에 대한 무단 공격은 명백한 불법 행위이며, 형사처벌 대상입니다. 보안 연구는 항상 적법한 범위 내에서 수행되어야 합니다.

 

🔗 실험 코드: GitHub - rust-security-suminworld