1호03 / 05
Cloudflare Workers에서 Spectre 공격이 실제로 재현됐다
Cloudflare가 2024~2025년에 걸쳐 자사 Workers에 대한 원격 Spectre 공격 가능성을 다시 평가한 결과를 공개했습니다. 결론부터 말하면 실제 운영 환경에서 성공했고, 그다음에 막았습니다.
Spectre가 무엇인가
CPU는 조건 분기의 결과를 기다리는 대신 미리 실행해봅니다(투기 실행). 예측이 틀리면 결과를 되돌리지만, 그 과정에서 캐시에 남은 흔적까지는 지우지 않습니다. 공격자는 메모리 접근 시간의 미세한 차이를 재서 원래 접근할 수 없는 값을 추측합니다.
2018년에 알려진 뒤 브라우저들은 타이머 정밀도를 낮추는 식으로 대응했습니다. 서버리스 플랫폼은 상황이 다릅니다. 여러 고객의 코드가 한 프로세스 안에서 격리되어 도는 구조이기 때문입니다.
이번에 확인된 것
- 원격 타이머: 외부 서버로 여는 WebSocket 연결만으로 밀리초 이하의 타이밍 측정이 가능했습니다. 거리가 멀어도 표본 몇 개면 중앙값 기준 1ms 미만 해상도가 나왔습니다
- 같은 자리 올라타기: 공격 대상 스크립트를
fetch()로 호출하면 스케줄러가 같은 프로세스에 인스턴스를 띄웁니다. 어렵지 않았습니다 - 가젯 두 종류: 타입 검사 과정에서 압축된 힙 포인터를 흘리는 것, TypedArray의 64비트 백킹 스토어 포인터를 이용해 임의 주소를 읽는 것
- 결과: 프로덕션 환경에서 초당 12비트를 99% 정확도로 유출. 같은 프로세스에 있던 다른 고객 Worker에서 JWT 토큰을 실제로 빼냈습니다
초당 12비트는 느려 보이지만, 토큰이나 키처럼 짧고 가치 높은 값을 노린다면 충분한 속도입니다.
Cloudflare의 대응
- V8 샌드박스: 힙에서 64비트 포인터를 걷어냅니다. 위 가젯 중 하나가 이걸 이용했습니다
- 메모리 보호 키(MPK): 하드웨어로 프로세스 내부를 나눕니다
- 탐지 개선: 오래 도는 실행과 I/O가 많은 작업을 겨냥합니다
우리가 할 일
이건 Cloudflare만의 문제가 아니라 멀티테넌트 서버리스 전반의 구조적 조건입니다. 실무에서 취할 수 있는 자세는 이렇습니다.
- 토큰과 API 키의 유효 기간을 짧게 잡습니다. 유출되더라도 쓸 수 있는 창을 줄이는 것이 유일하게 우리 손에 있는 통제입니다
- 정말 민감한 연산은 멀티테넌트 런타임에 올리지 않습니다
- 플랫폼의 보안 공지를 읽습니다. 이번처럼 "뚫렸고 막았다"를 공개하는 곳이 그렇지 않은 곳보다 낫습니다
1호의 다른 글
요약으로 한 번에 보기 →- 01DuckDB 2.0, 서버 모드와 트리거를 넣는다
- 02DDR5 128GB가 3,399달러, 그리고 기다려도 안 내려가는 이유
- 03Cloudflare Workers에서 Spectre 공격이 실제로 재현됐다지금 읽는 글
- 04uBlock Origin을 계속 쓰려면 이제 Firefox뿐
- 05270억 파라미터 모델이 맥북에서 돈다
댓글
불러오는 중…