출시 직전의 암초

222025년 08월 13일4

크롬 113의 기능 동결일이 코앞으로 다가왔다. Dawn 프로젝트 팀은 마지막 남은 P2, P3 등급의 사소한 버그들을 처리하며 숨 가쁜 마무리에 여념이 없었다. 연구실은 조용한 긴장감과 곧 다가올 성공에 대한 기대로 가득 차 있었다. 이제 며칠만 더 버티면, 그들의 오랜 노력이 결실을 보는 순간이 올 터였다.

그 평온을 깬 것은 한 통의 붉은색 경고 플래그가 붙은 내부 메일이었다.
발신인은 ‘Google Project Zero’.

그 이름을 확인하는 순간, 드미트리의 심장이 철렁 내려앉았다. 프로젝트 제로는 구글 내에서도 가장 악명 높은, 최고의 보안 연구원들로 구성된 엘리트 팀이었다. 그들은 아군과 적군을 가리지 않고, 세상의 모든 소프트웨어에서 아직 알려지지 않은 치명적인 보안 취약점(Zero-day)을 찾아내는 ‘악마의 변호인’이었다. 그들에게서 온 메일은 단 한 가지 의미밖에 없었다.

재앙.

드미트리는 떨리는 손으로 메일을 열었다. 제목은 간결했지만 내용은 섬뜩했다.

[P0] WebGPU Context Isolation Bypass Vulnerability

컨텍스트 격리 우회 취약점.
그는 빠르게 본문을 읽어 내려갔다. 프로젝트 제로 팀은 교묘하게 조작된 컴퓨트 셰이더를 이용하여, 완전히 다른 웹사이트(Origin)가 사용하는 GPU 메모리 영역의 데이터를 일부 읽어내는 데 성공했다는 내용이었다.

연구실의 모든 소음이 멎는 듯했다.
“말도 안 돼…”
벤이 모니터를 들여다보며 창백한 얼굴로 중얼거렸다.

이것은 단순한 버그가 아니었다. 웹의 근간을 뒤흔드는, 최악의 시나리오였다. 브라우저의 가장 신성한 원칙인 ‘동일 출처 정책(Same-Origin Policy)’, 즉 A 사이트는 B 사이트의 정보에 절대 접근할 수 없다는 대원칙이 깨진 것이다. 악의적인 광고 페이지가, 옆 탭에서 열려 있는 사용자의 은행 사이트 화면을 훔쳐볼 수도 있다는 의미였다.

출시를 불과 며칠 앞두고 발견된 치명적인 암초.
팀의 분위기는 순식간에 절망의 나락으로 떨어졌다.

“이제 끝났어. 113 출시는 물 건너갔군.”
누군가의 자조 섞인 목소리가 정적을 깼다. 이 정도의 P0 등급 보안 이슈라면, 출시 연기는 물론이고 프로젝트 전체가 원점에서 재검토될 수도 있었다.

바로 그때, 드미트리가 자리에서 일어났다. 그의 얼굴에는 절망 대신 차가운 결의가 서려 있었다.
“아직 끝나지 않았어. 누구를 탓하거나 좌절할 시간은 없다. 지금 우리에게 주어진 시간은 오직 해결책을 찾는 시간뿐이다.”

그는 즉시 프로젝트 제로 팀과 긴급 화상 회의를 잡았다. 화면 너머로 나타난 보안 연구원은 담담한 표정으로 취약점의 원리를 설명했다. 문제는 Dawn이 GPU 컨텍스트를 전환하는 과정에 있었다. 하나의 탭에서 다른 탭으로 GPU 사용 권한이 넘어갈 때, 이전에 사용하던 메모리 영역을 완벽하게 초기화해야 했다. 하지만 아주 특정한 타이밍과 조건 하에서, 이 초기화 과정의 일부가 건너뛰어지는 미세한 허점이 존재했다.

“마치 이전 세입자가 나간 방을 청소하지 않고 다음 세입자를 들이는 것과 같습니다. 운이 좋으면 아무것도 없겠지만, 운이 나쁘면 이전 세입자가 남긴 중요한 물건(데이터)을 발견할 수도 있는 거죠.”

원인은 파악됐다. 문제는 시간이었다.
기능 동결까지 남은 시간은 단 48시간.

드미트리는 즉시 팀을 두 개로 나누었다.
“카이, 당신과 벤은 이 취약점을 재현하는 가장 확실한 테스트 케이스를 만드시오. 어떤 상황에서도 100% 실패를 보장하는 테스트가 있어야, 우리가 만든 수정안이 완벽하다는 것을 증명할 수 있소.”
“나머지 팀원들은 나와 함께 Dawn의 메모리 관리자 코드를 한 줄 한 줄 다시 검토한다. 단 하나의 예외도 없이, 모든 컨텍스트 전환 시점에 강제적인 메모리 배리어(Memory Barrier)와 초기화 로직을 추가한다.”

그날부터 연구실의 불은 꺼지지 않았다. 텅 빈 피자 상자와 커피 컵이 쌓여갔다. 팀원들은 말없이 각자의 키보드만 두드렸다. 그들의 등 뒤로, 모니터 위에서는 크롬 113 기능 동결까지 남은 카운트다운 시계가 무심하게 흘러가고 있었다.

36시간 후, 드디어 수정안이 나왔다. 불필해 보일 정도로 강력한 메모리 보호 로직이 추가된 패치였다. 그들은 카이의 팀이 만든 테스트 케이스에 이 패치를 적용했다.

컴파일이 끝나고, 테스트가 실행되었다.
수십 초가 흐른 뒤, 화면에 결과가 나타났다.

PASS.

성공이었다. 하지만 기뻐할 시간은 없었다. 남은 시간은 12시간. 이제 그들은 이 패치를 크롬의 공식 빌드 시스템에 제출하고, 수만 개의 다른 테스트를 모두 통과시켜, 출시 관리자의 최종 승인을 받아내야 했다.

코드는 수정되었다. 이제부터는 시간과의 싸움이었다.