들어가며

클라우드플레어의 HTML 파서 버그로 CF 와 통신하던 상당수 웹 사이트의 원본 서버와의 통신 내용 일부가 캐싱 결과에 섞여 나오는 사건이 발생했습니다.

이에, 일반인들의1 해당 사태의 이해를 돕기 위해 이 글을 씁니다.

메모리 커럽션?

컴퓨터는 이름에서도 알 수 있지만, 계산을 하는 기계입니다. 우리가 컴퓨터를 사용하면서 보고 듣는 모든 것들은 결국엔 계산을 통해 만들어진 결과물인 것이죠.

이 과정에서 컴퓨터는 값들을 기억하기 위해 이를 주 기억 공간에 저장합니다. 이 부분을 우리는 주로 “메모리” — 흔히 RAM 이라 불리는 그 것 — 라고 부릅니다.

컴퓨터는 이 메모리를 선형적 공간으로 다룹니다. 즉, 기다란 종이 테이프처럼 다루는 것이죠.

컴퓨터가 정보를 기억할 때, 이 “종이 테이프”에 정보를 적은 다음, 어느 위치 에 이를 적어 두었는지만 기억해 둡니다. 프로그래머들은 이 것을 포인터 혹은 메모리 주소라고 부릅니다.

프로그램을 작성할 때, 경우에 따라 정보의 위치를 동적으로 “계산해 내는”과정이 필요할 때가 있습니다.

이 과정에서 무언가가 잘못되어(거의 대부분의 경우, 프로그램 버그), 잘못된 위치를 계산해 내게 될 경우에 프로그램은 메모리의 잘못된 위치를 참조하게 되고, 잘못된 위치를 읽거나 쓰게 됩니다.

이 것이 “메모리 커럽션” 이라 불리는 오류입니다.

클라우드블리드?

최근 클라우드플레어 캐시 서버의 HTML 파서(웹 문서를 처리하는 프로그램)에 메모리 커럽션 버그가 존재함이 밝혀졌습니다.

문제는 이 메모리 커럽션 버그의 결과가, 캐시 서버가 가지고 있던 원본 서버와의 통신 내용을 캐시 결과로 출력해 버린 데에 있습니다.

웹 어플리케이션과 프록싱 서비스라는 클라우드플레어의 특성 상, 해당 통신 내용 속에는 다음과 같은 민감한 정보들이 들어 있게 됩니다.

  • 쿠키
  • HTTP Auth 정보
  • CloudFlare 내부 인증서
  • HTTP POST로 보낸 정보
  • 기타 통신에 사용된 정보

그리고 Google Project Zero 에 따르면, 위의 누출 가능한 데이터의 실례로2

  • 온라인 데이팅 사이트의 개인 메시지
  • 온라인 패스워드 관리 앱의 데이터
  • 호텔 예약 사이트의 기록

과 같은 민감한 정보를 끌어낼 수 있었다고 합니다.

대책은?

사용하는 사이트를 http://www.doesitusecloudflare.com/ 과 같은 클라우드플레어를 사용하는지를 테스트해주는 도구로 체크합니다.

만약, 해당 서비스가 클라우드플레어를 사용한다면, 해당 서비스와의 통신 내용이 모두 새어나간 걸로 간주하고, 대책을 세울 것을 권장합니다.

예를 들어, 일반 웹 사이트라면, 비밀번호를 변경해야 하고, 만약 자신이 쓰는 온라인 패스워드 매니저 (e.g. 1password UPDATE 2017-02-25T15:43+0900: 1Password 는 CF 와의 통신에 TLS 아래에 추가 암호화 통신을 하고 있었기에 안전하다는 1Password 측의 설명이 있습니다.3) 가 사용중이었다면, 해당 패스워드 매니저에 저장된 모든 암호를 바꾸는 것과 같은 대응이 필요합니다.

여담: 비슷했던 하트블리드

이와 유사했던 이슈로, 하트블리드가 있었는데, 이 또한 메모리 커럽션 버그로 유발되었습니다.

다만, 하트블리드의 경우엔 의도적으로 만들어진 요청을 통해 공격이 유발되었지만, 이번 클라우드블리드의 경우엔, 정상적인 요청 속에도 새어나간 데이터가 포함되었던 것이 문제 + 클라우드플레어의 상당히 큰 마켓 셰어 덕분에 더 큰 이슈가 되고 있습니다.

  1. CS 전공자가 아닌 사람들
  2. https://bugs.chromium.org/p/project-zero/issues/detail?id=1139
  3. https://blog.agilebits.com/2017/02/23/three-layers-of-encryption-keeps-you-safe-when-ssltls-fails/