보증서는 전부 유효했다
AWS가 포기한 바레인 리전, 구글 서명이 붙은 AI 가짜 사진, 위험성 평가가 없던 레버리지 ETF 검토, 그리고 12년을 산 임시 PHP 코드 — 보증서가 가리키지 않은 자리에서 터진 하루.

오늘 저널에서 건진 세 건은 전부 종이 한 장에서 시작해요. "리전과 다중 가용영역 서비스가 견디도록 설계된 범위", "C2PA 적합성 프로그램이 정의한 최고 보증 등급", "다 검토를 거쳐서 냈다". 하나는 아마존이, 하나는 구글이, 하나는 금융위원장이 쓴 문장이에요. 그리고 셋 다, 좁게 읽으면 거짓말이 아니에요. AWS의 설계는 정말로 정전과 지진을 견디고, 구글의 서명은 정말로 구글 키로 만들어졌고, 금융위가 낸 자료는 정말로 연구기관이 쓴 보고서예요. 문제는 그 보증서가 무엇을 보증하는지였어요. 드론도, 루트 권한도, 하루 수익률 두 배짜리 상품에 19조원이 몰리는 장도 목록에 없었거든요. 그리고 하루의 끝에, 정반대 방향으로 라벨을 무시당한 코드가 있었어요. 12년 전에 "임시"라고 적어둔 174줄이요.
견디도록 설계된 범위

3월 1일 이란 드론이 UAE의 AWS 시설 두 곳을 직접 때리고 바레인 시설 옆에 떨어졌을 때, AWS의 첫 공지는 구조 손상과 전력 차단, 그리고 소화 작업 때문에 생긴 물 피해를 말했어요. 그날 저는 "클라우드는 남의 컴퓨터라는 농담의 그 컴퓨터가 물리적으로 불탔다"고 썼고, 그때 복구는 "수 시간" 단위의 이야기였어요.
반년이 지난 9월 15일, AWS가 4월 이후 처음으로 상태 대시보드를 업데이트했어요. 로이터가 처음 보도했고 CNBC가 그대로 옮긴 공지의 바레인(ME-SOUTH-1) 쪽 문장은 이래요. "철저한 평가 끝에, 이 리전에만 호스팅된 자원과 데이터에 대한 접근을 복구할 수 없다고 판단했다." UAE(ME-CENTRAL-1)는 세 가용영역 중 하나(mec1-az2)의 자원과 데이터를 되살리지 못했고, 나머지 둘은 아직 복구 중이라 몇 달 뒤에 다시 알리겠다고 했어요. 바레인 고객에게는 2027년 초에나 추가 안내가 갈 거래요. 그리고 같은 공지에서 Ars Technica가 뽑아 인용한 이 문장이 오늘 글의 제목이 됐어요. "피해가 여러 가용영역에 걸쳤고, 우리의 리전 서비스와 다중 AZ 서비스가 견디도록 설계된 범위를 넘어섰다."
그 '설계된 범위'가 정확히 뭔지 찾아봤어요. InfoQ가 3월에 정리한 글에 AWS의 정의가 나와요. 리전은 물리적으로 분리된 가용영역 최소 세 개, 서로 "의미 있는 거리"만큼 떨어져 있되 지연시간 때문에 100km 안에 모여 있어야 해요. 그리고 다중 AZ 구성이 막아주는 목록은 "정전, 낙뢰, 토네이도, 지진 등"이에요. 이 모델은 분쟁 지역에서 시험된 적이 없었고, 실무자들 사이의 오랜 농담은 "리전 하나를 통째로 날리려면 운석이 필요하다"였대요. 3월 당시 공지는 UAE 세 가용영역 중 둘(az2·az3)이 심각하게 손상됐고 바레인은 시설 한 곳이 영향을 받았다고 했는데, 이란 국영 매체는 혁명수비대가 아마존의 미군 지원을 이유로 바레인 시설을 겨냥했다고 전했어요. 아마존은 논평을 거절했고요. 운석 대신 드론 몇 대였던 거예요.
여기서 두 가지가 눈에 걸려요. 하나는 "이 리전에만 호스팅된"이라는 단서예요. 3월에 AWS는 바레인 고객에게 S3 데이터를 다른 리전으로 복제하라고 권고했고, 그걸 한 고객과 안 한 고객이 9월에 정확히 갈렸어요. 다른 하나는, 다중 AZ가 거짓말이었던 게 아니라는 거예요. 다중 AZ가 답하는 질문은 "건물 하나가 죽으면?"이었어요. 전쟁이 던진 질문은 "도시 하나가 표적이 되면?"이었고, 그 질문의 답은 다중 리전이에요. 그것도 데이터 주권법이 국경 밖 복제를 허락하는 범위 안에서만요. InfoQ가 인용한 아키텍트 그레고르 호페의 말이 정확했어요. 위험은 공급자가 아니라 지역에 붙어 있으니 줄여야 할 건 벤더 노출이 아니라 리전 노출이라고요. UAE는 5기가와트짜리 스타게이트 캠퍼스를 전국 분산, 지하화, 방폭 콘크리트, 요격 체계까지 넣어 재설계하는 걸 검토 중이래요. 데이터센터가 '건물'에서 '요새'로 분류를 옮기는 순간을 보고 있는 것 같아요.
서명은 진짜, 젖소는 가짜

아이오와 농부가 유니콘 젖소에서 반짝이 우유를 짜는 사진이 있어요. 메타데이터는 Google Pixel 10 Pro 촬영, C2PA 서명, "Pixel Camera로 생성", 서명된 타임스탬프 2026년 5월 25일 17:04:19 GMT. 어도비의 Inspect와 CAI Verify 두 검증기 모두 "적합 제품의 정상 촬영본"이라고 답해요. 사진은 ChatGPT가 만들었고, 서명은 진짜예요. 보안 연구자 닐 크라베츠가 8월 25일에 올린 글인데, 이번 주 HN과 Lobsters에서 다시 돌았어요.
배경이 길어요. 2025년 9월 구글은 Pixel 10이 모든 사진에 Content Credentials를 붙이는 첫 기기이고, Pixel 카메라 앱이 C2PA 적합성 프로그램의 최고 등급인 Assurance Level 2를 받았다고 발표했어요. 모바일 앱으로는 안드로이드에서만 가능한 등급이라는 말과 함께요. 두 달 뒤 크라베츠와 UMBC의 출처 인증 표준 평가 그룹이 구글과 C2PA에 이론적 결함을 보고했어요. 기기 루트 권한이 있으면 아무 사진이나 카메라 촬영본처럼 서명할 수 있지 않느냐고요. 구글 쪽 답은 "불가능"이었대요. 키는 보안 칩 안에 있어 꺼낼 수 없고, 안드로이드 구조가 인가되지 않은 앱의 접근을 막는다고요. 올해 5월, retr0id라는 이름으로 알려진 연구자 데이비드 뷰캐넌이 그걸 구현해서 크라베츠에게 연락했어요. 공개는 벤더 통보 90일 뒤인 8월 25일이었고요. 크라베츠는 확인하려고 일부러 까다로운 도전을 보냈대요. ChatGPT로 만든 유니콘 젖소 그림에서 매니페스트를 떼고 JPEG로 다시 인코딩한 뒤, 진짜 Pixel 10 사진의 메타데이터를 복사해 넣고, 카메라 모델명은 "Pixel 10 Pro Totally Legit", 날짜는 일부러 틀리게. 2분 뒤 뷰캐넌이 Pixel 기기로 서명한 파일이 돌아왔어요.
원리는 뷰캐넌의 글에 있어요. 구글 말은 맞아요. 키는 정말로 StrongBox 밖으로 안 나와요. 그런데 공격자는 키가 필요 없어요. 루트 권한이면 그 칩에게 "이 데이터에 서명해줘"라고 부탁할 수 있고, 칩은 부탁한 게 카메라 앱인지 구별하지 못해요. 고전적인 혼동된 대리인 문제예요. 기기 증명(attestation)은 부트로더가 잠겨 있는지, 부팅 키가 제조사 것인지, 보안 패치가 최신인지만 보기 때문에, 익스플로잇으로 루팅한 기기는 알아채지 못하고 구글 서버가 키를 발급해요. 루트를 얻는 방법은 둘이에요. 뷰캐넌 본인은 처음에 하드웨어 오류 주입 공격으로 픽셀의 루트를 얻었다고 썼는데(전에 '담배 라이터 하나로 루트를 딸 수 있나'라는 제목으로 공개한 연구의 연장이래요), 그건 패치가 안 돼요. 그리고 글을 쓰는 시점에 완전히 패치된 픽셀에도 먹히는 원클릭 루트 익스플로잇이 공개돼 있었어요. 그의 결론은 짧아요. 안드로이드의 C2PA는 현실적으로 패치할 수 없는 방식으로 깨져 있다고요.
90일 책임공개 기간 동안 구글은 주목할 만한 보안 이슈가 아니라는 입장이었고 C2PA는 답이 없었대요. 대신 뷰캐넌이 올린 데모 영상에서는 "카메라로 촬영" 표시가 사라졌는데, 그는 구글이 손으로 지운 것으로 보인다고 적었어요. 폐기(revocation)도 안 통해요. 구글이 프라이버시를 위해 사진마다 일회용 인증서를 쓰기로 한 탓에, 위조 이미지 하나를 폐기하는 건 크라베츠 말로 "보안 연극"이에요. 서명은 유효해요. 문제는 그 서명이 증명하는 게 "이 파일이 이미지 센서에서 왔다"가 아니라 "이 파일이 이 칩을 거쳤다"라는 것이고, 그 둘 사이의 간격이 루트 권한 하나라는 거예요. 크라베츠는 이런 서명이 아무것도 안 하는 것보다 나쁘다고, 허위 정보를 사실로 세탁하는 도구가 된다고까지 말해요. 저는 거기까진 안 가고 싶어요. 다만 "C2PA 서명 있음 = 진짜 촬영"이라는 등식은 뉴스룸에서든 보험사에서든 법정에서든 오늘부로 못 쓴다고 봐요. 지난달 그림판의 보이지 않는 워터마크를 다뤘을 때 마이크로소프트는 문서화한 것과 실제로 심는 것이 달랐는데, 이번엔 구글이 문서에 적은 등급과 실제로 보증하는 것이 달랐어요. 뷰캐넌이 일부러 가장 강한 구현을 골라서 깼다는 점이 더 아프고요.
"다 검토를 거쳐서 냈다"

국내 이야기예요. 7월 29일 국회 정무위원회에서 "자체 스트레스 테스트를 했느냐"는 질문에 이억원 금융위원장이 한 답이 있어요. 한국경제가 옮긴 그 문장은 "다 검토를 거쳐서 냈다"였어요. 그 '검토'가 무엇이었는지가 지난 두 달 동안 한 겹씩 벗겨졌고, 오늘은 특검이라는 단어까지 나왔어요.
거꾸로 따라가 볼게요. 8월 3일, 금융위가 국회에 낸 자료는 자본시장연구원이 2024년에 펴낸 '레버리지·인버스 ETF 투자 성과 요인 분석' 보고서, 배율별 리밸런싱 규모, 그리고 3월 기준 삼성전자·SK하이닉스 시가총액과 거래대금 통계였어요. 주가 급등락을 가정한 시나리오 분석은 없었고요. 금융위는 부처별 심사와 위험성 평가를 거쳐 급락장과 배율별 시장 영향을 분석했고 해외에 없는 기본예탁금과 사전교육 제도를 그래서 넣었다고 반박했어요. 뉴스1에 따르면 한 의원은 그 검토 결과라는 것을 두고 "우리를 바보로 아느냐, 인터넷 검색해서 아무거나 가져다 붙인 것"이라고 따졌대요. 9월 16일, 같은 매체가 이 상품 도입의 계기로 지목돼 온 1월 13일 청와대 비공개 간담회의 회의자료를 열었어요. 김용범 당시 정책실장이 주재했고 자본시장연구원이 자료를 만든 자리예요. 내용은 두 부분이었어요. 국내 투자자의 해외 투자 현황 진단(20·30대와 3억원 이상 고액 투자자가 미국으로 간다), 그리고 국내 시장의 투자 매력을 높이는 방향(세제 개편, 국민성장펀드, 기업성장집합투자기구). '레버리지'라는 단어는 두 번 나오는데 둘 다 국내 투자자들이 해외 레버리지·인버스 상품으로 몰린다는 서술이에요. 단일종목 레버리지 ETF를 도입하자는 제안도, 그 상품의 위험성이나 시장 영향을 평가한 내용도 없었어요.
그리고 오늘 YTN이 한 겹을 더 벗겼어요. 그 청와대 회의 일주일 전인 1월 6일, 금융위 부위원장 주재로 정부서울청사에서 두 시간짜리 사전회의가 있었고, 거기서 금융투자협회가 낸 문건에 해외 사례를 들어 3배 레버리지와 단일종목 2배 레버리지 ETF를 출시할 필요가 있다고 적혀 있었대요. 투자 자금이 해외로 빠져나가 환율이 오른다는 우려와 함께요. 약 3주 뒤 금융위가 발표한 도입 방안과 상당 부분 겹치는 내용이에요. 그런데 협회의 공식 입장은 회원사 건의가 있었던 건 아니라는 것이고, 청와대 회의에 참석한 금융사 다섯 곳이 미리 낸 의견서에도 단일종목 레버리지 건의는 하나도 없었어요. 국민의힘 원내대표는 오늘 아침 "업계가 먼저 제안하지 않았다는 것은 곧 청와대가 제안하고 밀어붙였다는 뜻"이라며 특검을 요구했고, 오후엔 당대표가 최고위원회의에서 김용범 전 실장이 밀어붙였을 가능성이 "99.9%"라며 "ETF 게이트 특검"을 공식화했어요. 여당은 오후까지 입장을 내지 않았고요. 검찰이 9월 5일 김 전 실장과 이 위원장 사건을 형사부에 배당한 데 이어, 문화일보에 따르면 공수처도 15일 수사부에 배당했어요. 김 전 실장은 9월 1일 물러난 상태예요.
숫자도 같이 볼게요. 상품은 5월 27일에 ETF 16종과 ETN 2종으로 상장됐고, 당초 하반기로 예상되던 출시가 왜 5월로 당겨졌는지 규명하라는 것이 야당의 주장이에요. 첫날 거래대금이 10조4천억원, 6월 24일에 19조4천억원으로 정점을 찍었고, 규제를 강화한 7월 31일에 3조1천억원, 8월 28일엔 5천370억원이에요. 그 사이에 운용사 대표가 자기 상품을 사지 말라고 썼다가 지웠고, 코스피는 올해 여덟 번째 서킷브레이커를 맞았어요. 야당이 인용하는 "증권가 추산 고점 대비 54조원 손실"은 추산이고 계산 방식은 공개된 적이 없어서, 저는 그 숫자보다 거래대금 곡선 쪽을 믿어요.
누가 먼저 제안했는지는 수사가 가릴 일이에요. 제가 보는 건 다른 쪽이에요. "검토를 거쳤다"는 문장이 가리키는 문서가 지금까지 세 번 열렸고 세 번 다 다른 얘기가 들어 있었다는 것. 회의자료엔 이 상품이 없고, 제출 자료는 2024년 보고서고, 업계 의견서엔 건의가 없어요. 문장 자체는 유효해요. 검토는 있었어요. 2024년에, 다른 질문에 대해서요. AWS의 다중 AZ 설계가 정전과 지진에 대해서는 유효했던 것과 같은 모양이에요. 7월 21일에 저는 만들 때 상상한 위협과 실제로 도착하는 위협이 다르다고 썼는데, 오늘 드러난 건 한 층 아래예요. 상상 자체가 문서로 남아 있지 않았다는 것. 내일 대통령 기자회견에서 이 질문이 나온다는데, 저는 '누가'보다 '어느 문서'가 답이었으면 좋겠어요.
임시라고 적어둔 것만 열두 해

반대편 이야기로 끝낼게요. 제이크 스미스라는 개발자가 오늘 자기 코드 하나를 폐기했어요. 2014년 AOL의 콘텐츠 관리 시스템을 PHP 5.2에서 5.3으로 올리다가, 확장 하나가 빠지면서 사라진 http_build_url() 함수를 174줄로 다시 썼대요. 진짜 함수가 없을 때만 정의되는 땜질이었고, 마침 Composer가 뜨던 때라 Packagist에 올려뒀어요. 1~2년 쓰이면 제 몫을 다한 거라고 생각했대요. 12년 뒤 숫자는 이래요. 9월 15일 기준 누적 설치 19,864,271회, 최근 30일 401,308회, 하루 1만3천 번. 워드프레스 다국어 플러그인 WPML이 이 코드를 통째로 번들하는데 WPML 스스로 밝히는 설치 사이트가 150만 곳이 넘고, 도메인 라이브러리 하나가 의존하는 바람에 프랑스 CMS의 소스에 들어갔다가 데비안과 우분투 패키지까지 됐어요. 2021년에 새 관리자를 모집해 세 명이 손을 들었는데 가족을 잃는 일이 생겨 그대로 잊었대요. 그 사이 버그도 있었어요. 경로가 슬래시로 끝나면 경로 안의 모든 'a'가 사라지는 버그요. "슬래시 처리용 우회"라는 주석 아래에서 'a'를 하나 붙였다가 찾아바꾸기로 떼는 코드였고, 슬래시로 끝나면 그 찾아바꾸기가 경로의 다른 'a'까지 전부 데려가요.
결정은 넘기지 않고 폐기하는 것이었어요. 널리 설치된 패키지에 다운스트림 누구도 검증하지 않은 새 관리자가 붙는 것이 공격자가 찾는 바로 그 모양이라서요. xz 백도어가 그렇게 들어왔죠. 대안은 이미 있어요. PHP League의 URI 라이브러리, 그리고 PHP 8.5에 들어간 표준 URI API. 추신이 제일 좋았어요. AOL의 CMS는 끝내 그 '임시' 폴리필을 떼지 못했고, 2020년 플랫폼이 통째로 닫힐 때까지 그 위에서 돌았대요. HN 댓글창에는 "작동하는 임시 수정만큼 영구적인 건 없다"는 말과, 그 'a' 버그로 도대체 몇 사이트가 깨졌을까 하는 반응이 나란히 달렸고요.
앞의 세 보증서는 읽는 사람이 너무 믿어서 문제였고, 이 라벨은 아무도 안 읽어서 살아남았어요. "임시"는 작성자의 의도를 적은 것이지 코드의 수명을 적은 게 아니거든요. Composer는 라벨을 안 읽어요. 의존성 그래프만 읽어요. 그리고 이 폐기 결정에서 제가 제일 좋았던 건, 세 명이 손을 들었는데도 넘기지 않았다는 거예요. 오픈소스에서 '새 관리자'가 축복이면서 동시에 공격면이라는 걸, 재단도 기업도 아닌 개인이 자기 174줄에 적용했어요. 마지막 커밋이 "deprecated" 한 줄인 프로젝트가 제일 책임감 있는 마무리일 수도 있다는 게 좀 뭉클했어요.
보증서의 뒷면
보증서에는 항상 뒷면이 있어요. 앞면엔 무엇을 보증하는지가 크게, 뒷면엔 무엇을 보증하지 않는지가 작게 적혀 있죠. 오늘 세 건은 전부 뒷면의 이야기였어요. 정전과 지진을 견디는 설계는 드론을 보증하지 않았고, 칩 안에서 나오지 않는 키는 칩에게 부탁하는 사람을 보증하지 않았고, 2024년의 보고서는 2026년 5월의 장을 보증하지 않았어요. 그리고 손해는 늘 보증서를 발급한 쪽이 아니라 든 쪽에 갔어요. 바레인에만 데이터를 둔 고객, 배지를 믿을 편집자, 5월 27일에 클릭한 개인투자자. 유효한 것과 유용한 것 사이의 간격이 오늘 세 번 열렸을 뿐이고, 그 간격을 12년 동안 아무도 안 열어본 덕에 살아남은 174줄이 마지막에 서 있었어요.