2025-06-13-Friday

오유찬·2025년 6월 15일

daily

목록 보기
4/30

Day planner


Daily Log


[!error] Habits

  • 보안 기사 공부 || 보안 뉴스 || 보안 논문 읽기
  • CTF || algorithm

공부 기록


  • 야외스포츠 - 레포트
  • 컴퓨터보안 - 실습 진행 : 부채널 공격
  • 웹정보시스템 : 1,2장 + 5장

Spectre

Tree-PLRU 기반 L1 캐시 퇴출 타이머

What is Tree-PLRU?
하나의 캐시 세트는 트리 구조로 구성되어 있고, 트리의 각 노드는 LRU(Least Recently Used) 방향을 가리키는 정보를 저장한다. 따라서 어떤 캐시 라인을 퇴출시키는지 결정하는 것은 트리에서 화살표 방향을 따라가면 된다.

Tree-PLRU 기반 L1 캐시 퇴출 타이머
CPU가 어떤 값을 L1 캐시에 로드할 때, L1 캐시가 이미 가득차 있으면 하나를 퇴출하고 로드한 값을 넣는다. 이때 캐시 퇴출 전략(eviction strategy)에는 여러 가지가 있는데, 대부분은 Tree 기반의 Pseudo Least Recently Used(PLRU) 알고리즘을 사용한다. 이걸 줄여서 Tree-PLRU라고 부른다.

운영체제 시간에 배운 게 나와서 좀 신기하네. 진짜 활용되는 걸 보니까 재밌다.

이제 이걸 어떻게 활용하냐면 hit, miss를 활용해서 결과를 도출해낼 수 있다.
1. 공격자가 캐시에 올릴 값들을 값은 캐시 세트에 매핑되는 메모리 주소들로 구성해서 L1 캐시에 미리 채운다.
2. victim 코드가 secret 값을 사용해서 채워둔 캐시 세트의 메모리 주소에 접근하게 되면, eviction이 발생한다.
3. 내가 넣은 값들을 다시 접근하면서 타이밍을 측정하면, 밀려난 값은 느리게(L1 miss), 그대로 남아있는 값은 (L1 hit) 빠르게 접근됨을 알 수 있다.
- 이때, 비밀값의 이웃값들만 계속 접근해서 비밀값이 덜 사용된 것처럼 보이게 한다. 이를 통해서 secret 값을 캐시에 계속 남겨둘 수 있다. 그러면 secret 값은 eviction 대상에서 제외된다.


특정 캐시 세트에 코드가 접근했는지 테스트 → 이를 활용해서 JavaScript 객체의 memory layout을 추론해보자.

Javascript 배열의 다양한 오프셋에 접근함으로써 어떤 오프셋이 어떤 캐시 세트에 매핑되는지 유추할 수 있다.
대부분 L1 캐시 세트는 주소의 6번~11번 비트를 기반으로 선택되므로, 이는 배열 요소의 page offset에 해당한다.
가장 하위 6비트(0~63)는 캐시 세트의 경게를 찾아서 추론할 수 있다.

  • 배열 인덱스 19: 캐시 세트5 / 인덱스 20: 캐시 세트6 → 인덱스 20이 새로운 캐시 세트의 시작점

cache line hit가 정확히 16개의 인덱스 증가마다 앞으로 이동하는 것을 확인할 수 있다.(예제에서)

  • 캐시 라인 크기(64byte) / element size(4byte) = 16 element per 1 cache line
  • 16번 인덱스가 바뀔 때마다 다음 캐시 세트로 넘어간다.

Spectre 실습의 핵심 데모
1. 메모리 레이아웃 구성
- 하나의 JavaScript 배열 & 여러 개의 Uint8Array 구성
- JavaScript 배열의 page offset을 유추
- 뒤따라오는 Uint8Array들의 페이지 오프셋도 모두 알 수 있다. (JS 배열 뒤에 고정된 오프셋으로 배치되어서)
2. Uint8Array 객체의 내부 구조
- 각 객체는 두 개의 중요한 필드 가진다.
- length field
- pointer to data
- 이 두 필드가 서로 다른 캐시 라인에 존재하는 배열을 선택
- 이렇게 선택된 배열은
- length를 캐시에서 플러시(evict)할 수 있고
- 포인터는 남겨서 speculative execution 중에도 접근이 가능하다.
- 이 구조를 활용하려면 정확한 page offset info가 필요하다.

length는 캐시에서 제거돼야 CPU가 분기 조건을 예측할 수 있고 data pointer는 캐시에 남겨야 예측 실행 도중 빠르게 비밀값을 접근할 수 있다. 이 둘이 다른 캐시 라인에 있어야 별도로 조작이 가능해서 이런 구조를 의도적으로 선택하는 것이 Spectre 공격을 가능토록 하는 핵심 포인트다.

profile
열심히 하면 재밌다

0개의 댓글