TECH 으로 돌아가기
TECH HACKER NEWS 9분 읽기 36 READS

메모리 오염 없이 엣지를 통째로 뚫다: 오렌지 차이의 논리 버그 체인

메모리 오염 없이 엣지를 통째로 뚫다: 오렌지 차이의 논리 버그 체인
SOURCE IMAGE · HACKER NEWS

브라우저 익스플로잇은 오랫동안 메모리 오염(memory corruption) 취약점의 무대였다. 힙 오버플로나 해제 후 사용(UAF)을 찾아 렌더러를 장악하고, 다시 또 다른 메모리 버그로 샌드박스를 탈출하는 식이다. 그런데 DEVCORE 리서치팀의 오렌지 차이(Orange Tsai)가 Pwn2Own Berlin 2026에서 선보인 마이크로소프트 엣지(Edge) 풀체인은 그 공식을 완전히 벗어났다. 메모리 오염이 단 하나도 없고, 생성형 AI의 도움도 받지 않은 순수 '논리 버그'만으로 구성된 체인이다. 전체 공격은 다섯 개의 버그와 두 개의 윈도우 기능을 엮어 샌드박스 탈출까지 도달했고, 상금 17만 5천 달러와 Master of Pwn 17.5점을 가져갔다. 이 체인은 올해 Pwnie Awards의 Epic Achievement 상도 받았다.

출발점은 의외로 평범한 곳, 바로 '브라우징' 그 자체였다. 크로미움이 내비게이션(navigation)이라 부르는 흐름을 따라가던 중 저자는 '내비게이션 스로틀(Navigation Throttles)'에 주목했다. 브라우저 프로세스에 자리 잡고 브라우저와 렌더러가 발생시키는 모든 내비게이션 요청을 가로채는 장치다. 지난 5년간 크롬이 고친 3,000건이 넘는 CVE 중 이와 관련된 것은 20건도 되지 않는다. 그만큼 연구자들의 눈길이 덜 닿은 구석이라는 뜻이다.

엔터프라이즈 기능이 연 UXSS

엣지는 기업용 Entra ID를 위해 EdgeCAGuidanceNavigationThrottle이라는 독자 스로틀을 두고 있다. 여기서 CA는 조건부 접근(Conditional Access)을 뜻한다. 사용자가 login.live.com 같은 마이크로소프트 사이트에서 업무 계정으로 로그인하면, 현재 프로필의 이메일과 쿼리스트링의 ?email={email}을 비교해 맞으면 switch_profile={url}에 담긴 주소로 크로미움 내부 내비게이션 API를 통해 새 이동을 시작한다. 이 새 내비게이션이 브라우저 프로세스에서 출발한다는 점이 핵심이다. 원래라면 금지된 edge://settings나 devtools://, 심지어 javascript: 같은 유사 스킴으로도 뛰어넘을 수 있기 때문이다.

처음에는 그저 '조금 센 오픈 리다이렉트'로 보여 메모에 묻어둔 버그였다. 전환점은 구조를 다시 뜯어보다 떠올린 의문이었다. 스로틀은 브라우저 프로세스에서 처리되는데, 스로틀을 발화시킨 login.live.com 페이지는 렌더러에 산다. 둘을 묶는 코드가 보이지 않는다면 CURRENT_TAB은 대체 어느 탭을 가리키는가? 트리거에 지연을 넣고 그 사이 다른 탭으로 전환하자 google.com에서 UXSS가 터졌다. 크로미움의 Navigate()가 source_contents 없이 호출되면 현재 활성 탭을 렌더러 소스로 잡아버리는데, disposition이 CURRENT_TAB이고 source_contents가 NULL인 것이 바로 기본값이라 크로미움 예제 코드조차 이 함정에 빠진다.

클릭 없는 무기화

UXSS 기본기를 쥐었지만 실전 무기로 만들려면 네 가지 난관을 넘어야 했다. 첫째, 스로틀은 마이크로소프트 사이트에서만 발화한다. 스로틀이 GetLastCommittedURL()로 출처를 검사하지만, 내비게이션이 다른 창에서도 올 수 있다는 점을 놓친 탓에 단순한 window.open()으로 우회됐다. 둘째, 팝업 차단이 window.open을 막지만 마이크로소프트가 내부용으로 심어둔 하드코딩 화이트리스트 주소로 창을 연 뒤 원래 사이트로 되돌리면 통과됐다. 셋째, 조건부 접근 검사는 로그인된 프로필과 이메일 일치를 요구하는데, OneAuth 기능 덕에 마이크로소프트 사이트 방문만으로 현재 MSA 자격으로 자동 로그인된다. 윈도우 25H2부터 OOBE가 MSA 로그인을 요구하므로 www.microsoft.com 방문만으로 프로필이 생성된다. 넷째, 피해자 이메일은 edge://new-tab-page-online에 내장된 assets.msn.com이 로그인 사용자의 이메일을 돌려주는 데다 CORS 설정 오류까지 겹쳐, 자격 증명을 포함한 fetch() 한 번으로 어느 사이트에서든 탈취됐다. 이렇게 완성된 UXSS는 클릭 한 번 없이 발화하며, 브라우저 프로세스에서 출발하므로 CSP마저 무시하고 google.com, facebook.com, icloud.com 등 원하는 모든 오리진에서 자바스크립트를 실행할 수 있다.

UXSS에서 임의 코드 실행으로

하지만 목표는 임의 코드 실행(ACE)이었고 UXSS만으로는 샌드박스를 벗어날 수 없다. edge://settings 같은 특권 WebUI를 노리는 가장 직관적인 방법은 이미 막혀 있었다. 렌더러의 Mojo 핸들러가 특권 스킴 목록(not_allowing_javascript_urls_schemes)에 걸리면 자바스크립트 URL을 무시하기 때문이다. 돌파구는 엣지가 자체 리더 모드 Immersive Reader를 위해 쓰는 커스텀 read:// 스킴이었다. 크로미움에서 일찍 분기해 독자 개발한 이 스킴은 블랙리스트에 등록되지 않아 UXSS가 그대로 먹혔다. 이 특권 WebUI에서는 자바스크립트로 여러 네이티브 C++ 객체에 접근할 수 있는데, chrome.edgeFeedbackPrivate.zipDiagnosticLogFiles()가 특히 쓸 만했다. 파일명과 JSON 문자열을 받아 임시 폴더에 파일을 쓰고 압축해 서버로 보내는 함수인데, ../로 폴더를 벗어날 수 있고 거슬리는 .json 확장자는 널 바이트로 떼어낼 수 있었다. 결국 파일명과 내용을 모두 통제하는 임의 파일 쓰기가 완성됐다.

이 체인이 주는 교훈은 분명하다. 공격면은 더 이상 메모리 안전성에만 있지 않다. 벤더가 크로미움을 포크해 얹은 기업용 기능(Conditional Access, OneAuth, Immersive Reader)과 상대적으로 방치된 내비게이션 스로틀이야말로 검증이 느슨한 틈이었다. GetLastCommittedURL 기반 출처 검사, 팝업 화이트리스트, assets.msn.com의 CORS 설정처럼 하나하나는 사소해 보이는 논리적 허점이 연쇄하면 메모리 버그 못지않은 완전 장악으로 이어진다. 다만 이 공격은 특정 조건(엣지 사용, 마이크로소프트 자동 로그인, 윈도우 25H2 환경 등)이 맞아떨어져야 성립하는 복잡한 체인이며, Pwn2Own을 통해 공개·제보된 만큼 실제 익스플로잇은 벤더의 대응으로 메워지는 과정에 있다. 자체 포크와 커스텀 스킴, 기본값에 숨은 함정을 다시 점검해야 한다는 신호인 셈이다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://blog.orange.tw/posts/2026-10-the-last-proof-of-human...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...