How Cloudflare verifies the code WhatsApp Web serves to users

WhatsApp의 보안 메시지에 사용되는 코드가 조작되지 않았는지 확인하는 데 Cloudflare가 어떻게 도움이 되는지 알아보세요.

웹 사이트를 방문할 때 웹 브라우저에서 다운로드하려는 코드가 웹 사이트에서 실행하려는 코드인지 어떻게 알 수 있을까요? 신뢰할 수 있는 앱 스토어에서 다운로드한 모바일 앱과 달리 웹에서는 코드가 조작되지 않았다는 동일한 수준의 보증을 제공하지 않습니다. 오늘, Clouldflare에서는 WhatsApp과 파트너십을 맺게 된 것을 기쁘게 생각하며 사용자가 웹에서 WhatsApp을 방문할 때 실행되는 코드가 WhatsApp에서 의도한 코드임을 사용자에게 보장하는 시스템을 제공하게 되었습니다.

브라우저에서 WhatsApp 사용이 증가하고 기자, 활동가, 인권 운동가를 포함하여 위험한 환경에 있는 사용자의 수가 증가함에 따라 WhatsApp에서는 브라우저 기반 사용자에게 보증을 제공하기 위한 조치를 취하고자 했습니다. WhatsApp은 사용자 간 메시지의 종단간 암호화를 담당하는 코드를 손상하거나 조작하려는 제3자의 기준을 극적으로 높이는 데 도움을 얻기 위해 Cloudflare를 찾았습니다.

어떻게 작동할까요? Cloudflare는 WhatsApp 사용자가 실행해야 하는 코드의 해시를 보유합니다. 사용자가 브라우저에서 WhatsApp을 실행할 때 WhatsApp Code Verify 익스텐션은 브라우저에서 실행 중인 코드의 해시를 Cloudflare에서 보유하고 있는 해시와 비교해서 실행 중인 코드가 반드시 실행해야 하는 코드인지 손쉽게 확인할 수 있도록 합니다.

해시를 비교하여 조작 또는 손상된 파일을 감지하는 개념 자체는 새로운 것이 아니지만, 이를 자동화하여 규모에 맞게 배포하고 WhatsApp 사용자를 위해 '제대로 작동'하게 하는 것이 혁신적입니다. WhatsApp의 영향력과 Cloudflare에 대한 암묵적인 신뢰를 바탕으로, 이 시스템이 실제로 어떻게 작동하는지 기술적인 관점에서 자세히 설명하고자 합니다.

자세히 살펴보기 전에 분명히 알아두어야 할 한 가지 중요한 사항이 있습니다. Cloudflare에서는 코드 확인을 지원하기 위해 신뢰할 수 있는 감사 엔드포인트를 제공하고 있습니다. WhatsApp 사용자 간의 메시지, 채팅 또는 기타 트래픽은 절대 Cloudflare로 전송되지 않으며, 종단간 암호화되어 비공개로 유지됩니다. 메시지와 미디어는 신뢰할 수 있는 제3자로서의 역할에 대한 Cloudflare의 관점에서 중요한 자산인 이 시스템의 일부로 Cloudflare의 네트워크를 거치지 않습니다.

보다 쉬운 확인 과정

2003년으로 돌아가보겠습니다. Red Hat을 기반으로 하는 대중적인 리눅스 배포판인 Fedora가 막 출시되었습니다. Fedora를 다운로드하고 싶지만 '진짜' Fedora인지, 다운로드한 파일이 비밀번호를 빼돌리거나 키 입력을 기록하는 '가짜' 버전이 아닌지 확인해야 합니다. 다운로드 페이지로 이동해서 다운로드를 시작하면 다운로드 옆에 MD5 해시(당시에 안전한 것으로 간주됨)가 표시됩니다. 다운로드가 완료되면 md5 fedora-download.iso를 실행하고 해시 아웃풋을 페이지의 해시와 비교합니다. 두 개의 해시가 일치하면 컴퓨터에 Fedora 설치를 진행합니다.

하지만 잠깐만요. 만약 다운로드를 제공하는 웹 사이트가 해시도 제공한다면 악의적 행위자가 다운로드와 해시를 모두 자신의 값으로 대체할 수 있지 않을까요? 위에서 실행한 md5 검사는 여전히 통과하겠지만 우리가 다운로드하고자 했던 '진짜'(조작되지 않은) 버전이라는 보장은 없습니다.

Hosting the hash on the same server as the software is still common in 2022.
소프트웨어와 동일한 서버에서 해시를 호스팅하는 것은 2022년에도 일반적입니다.

이를 개선할 수 있는 다른 방법이 있습니다. 다른 곳에서 호스팅된 '잘 알려진' 공용 키로 서명되었는지 확인할 수 있는 서명된 서명을 제공하는 것입니다. 신뢰할 수 있는 제3자와 함께 이러한 시그니처(또는 '해시')를 호스팅하면 조작에 대한 기준을 크게 높일 수 있지만, 이제는 사용자가 누구를 신뢰할지를 알고 GnuPG와 같은 도구를 학습하도록 요구합니다. 이것은 현대 인터넷의 규모에서 소프트웨어를 신뢰하고 검증하는 데 도움이 되지 않습니다.

여기에서 Code Verify 익스텐션과 Cloudflare가 필요합니다. Meta Open Source에서 발행하는 Code Verify 익스텐션은 이를 자동화하여 WhatsApp Web에서 사용하는 라이브러리의 암호화 해시를 로컬에서 컴퓨팅하고 해당 해시를 신뢰할 수 있는 제3자 소스(이 경우에는 Cloudflare)와 비교합니다.

사용자, WhatsApp, Cloudflare 등 세 당사자가 각각 서로 상호작용하는 방식을 보여줌으로써 이 시스템의 작동 방식을 더 명확하게 설명했습니다.

WhatsApp 웹에서 코드를 확인하는 4단계 다이어그램.

코드가 조작되지 않았는지 확인하는 4가지 주요 단계는 다음과 같습니다.

  1. WhatsApp은 최신 버전의 JavaScript 라이브러리를 서버에 게시하고 해당 버전의 상응하는 해시를 Cloudflare의 감사 엔드포인트에 게시합니다.
  2. WhatsApp 웹 클라이언트가 WhatsApp에서 최신 라이브러리를 가져옵니다.
  3. Code Verify 브라우저 익스텐션은 이후 별도의 보안 연결을 통해 Cloudflare에서 해당 버전의 해시를 가져옵니다.
  4. Code Verify는 Cloudflare에서 '정상' 해시를 로컬에서 컴퓨팅한 라이브러리의 해시와 비교합니다.

거의 모든 상황에서 그러하듯 해시가 일치하는 경우, 코드가 익스텐션의 관점에서 '확인'됩니다. 해시가 일치하지 않는 경우, 사용자의 브라우저에서 실행되는 코드가 WhatsApp이 모든 사용자의 브라우저에서 실행하려는 코드와 다르다는 것을 나타냅니다.

보안은 편리해야 합니다

확장 가능한 방식으로 투명성을 제공하는 데 도움이 되는 것은 프로세스와 이것이 사용자를 대신하여 자동화된다는 사실입니다. 사용자가 수동으로 해시를 가져와서 계산하고 비교해야 한다면 조작을 감지하는 것은 극소수의 기술 사용자만이 가능할 것입니다. WhatsApp과 같은 대규모 서비스에서 이는 특별히 접근하기 쉽거나 사용자 친화적인 접근 방식이 아닐 것입니다.

이 접근 방식은 현재 사용되고 있는 여러 기술과도 비슷합니다. 그 중 하나는 웹 브라우저의 하위 자원 무결성(Subresource Integrity)으로, 제3자 자산(스크립트 또는 스타일 시트 등)을 가져올 때 브라우저는 반환된 자산이 설명된 해시와 일치하는지 확인합니다. 일치하지 않는 경우, 해당 자산의 로드를 거부하여 잠재적으로 손상된 스크립트가 사용자 데이터를 빼돌리는 것을 방지합니다. 또 다른 기술은 인증서 투명성(Certificate Transparency)과 관련 바이너리 투명성 프로젝트입니다. 이 두 가지 모두 WebPKI 인증서 및 기타 바이너리 Blob을 비롯한 중요한 자산에 대해 공개적으로 감사 가능한 투명성을 제공합니다. 이 게시물에서 설명한 시스템은 아직 임의 자산으로 확장되지 않았지만, Cloudflare에서는 바이너리 투명성과 같이 더 일반적이고 사용 가능한 것으로 이 서비스를 확장할 수 있는 방법을 모색하고 있습니다.

WhatsApp 팀과의 협력은 Cloudflare가 웹에서 개인 정보 보호 및 보안을 향상시키기 위해 진행하고 있는 작업의 시작에 불과합니다.  Cloudflare는 다른 조직들이 사용자에게 전달된 코드가 그들이 실행하고자 하는 코드인지 확인할 수 있도록 지원하는 것을 목표로 하고 있습니다. 규모에 따라 인터넷 사용자를 보호하고 개인 정보를 보호하는 것은 Cloudflare에서 우리가 하는 일의 핵심 신조이며, 2022년 한 해 동안 이 업무를 지속할 수 있기를 기대하고 있습니다.