Forging a Microsoft Edge Full Chain with Logic Bugs Only
논리 버그만으로 Microsoft Edge 전체 공격 체인 만들기
Orange Tsai는 메모리 손상 없이 Microsoft Edge의 논리 버그와 Windows 기능을 연결해 브라우저 샌드박스 탈출을 완성했습니다. 내비게이션 처리 오류에서 시작해 UXSS, 임의 파일 쓰기, 코드 실행으로 이어지는 과정을 공개했으며 Pwn2Own Berlin 2026에서 17만 5천 달러를 받았습니다.
- 주제
에디터 노트
이 체인의 설득력은 개별 버그의 강도보다 브라우저와 운영체제 사이의 연결 지점을 차례로 찾아낸 데 있습니다. 활성 탭을 출발점으로 삼는 내비게이션 처리에서 UXSS를 만들고, Edge 전용 read:// 페이지의 파일 쓰기를 프로토콜 허용 목록과 PATH 검색에 연결해 코드 실행까지 이어갑니다. 다만 성공 조건은 Edge의 특정 구현과 OneAuth 로그인 동작, 사용자 쓰기 권한이 있는 경로에 기대고 있습니다. 저자가 보고한 Pwn2Own 시연은 이 조합이 실제 공격으로 이어짐을 보여주지만, 글의 설명만으로 각 조건이 다른 Windows 환경에서도 동일하게 성립한다고 일반화할 수는 없습니다. AI를 쓰지 않았다는 설명은 연구 방식에 관한 저자의 기록이며, 취약점 체인의 기술적 근거와는 별도로 읽어야 합니다.
AI 요약
Orange Tsai는 Pwn2Own Berlin 2026에서 Microsoft Edge의 브라우저 샌드박스를 탈출하는 공격 체인을 시연했습니다. 메모리 손상 없이 논리 버그와 Windows 기능을 엮었으며, 글에서는 취약점 탐색부터 최종 코드 실행까지의 과정을 설명합니다.
내비게이션 처리에서 UXSS로
Edge의 Conditional Access 기능은 특정 Microsoft 사이트에서 시작된 내비게이션을 가로채고, 프로필 이메일이 조건에 맞으면 쿼리 문자열의 주소로 새 내비게이션을 시작합니다. 이때 Chromium의 Navigate() 호출에 source_contents가 지정되지 않으면 현재 활성 탭을 출발점으로 삼습니다. 공격자가 원래 탭에서 지연을 둔 뒤 다른 탭으로 전환하면, 새 탭에서 공격자 지정 주소를 열 수 있습니다. 주소가 javascript: 스킴이면 해당 사이트의 JavaScript를 실행하는 UXSS(Universal Cross-Site Scripting)로 이어집니다.
이를 아무 웹사이트에서나 발동하려면 조건을 더 풀어야 합니다. Edge의 출처 검사는 현재 WebContents의 마지막 주소를 확인하지만, 다른 창에서 시작한 내비게이션은 제대로 연결하지 않습니다. window.open()으로 창을 연 뒤 그 창의 주소를 바꾸면 검사 조건을 우회합니다. 팝업 차단은 about:blank#quickAuthPopup을 허용하는 Edge의 하드코딩된 예외를 이용해 통과합니다.
프로필 조건과 이메일 획득
Conditional Access 경로는 로그인된 Edge 프로필과 일치하는 이메일을 요구합니다. 저자는 Windows의 OneAuth가 Microsoft 계정 자격 증명으로 Microsoft 사이트에 자동 로그인하는 동작을 이용했습니다. 글에 따르면 Windows 25H2의 OOBE는 로컬 계정 우회가 없으면 MSA 로그인을 요구합니다. 로그인된 사용자의 이메일은 assets.msn.com의 사용자 정보 API에서 가져왔습니다. 이 API의 CORS 설정 문제로, 자격 증명을 포함한 cross-origin fetch에서 응답을 읽을 수 있었다고 설명합니다. 이 과정을 거쳐 클릭 없이 UXSS를 발동하고 CSP도 우회했습니다.
UXSS에서 임의 파일 쓰기와 코드 실행으로
일반 웹 UI의 보호된 스킴에서는 javascript: 실행이 차단됩니다. 하지만 Edge의 Immersive Reader는 Chromium의 기존 Reader Mode와 다른 read:// 스킴을 사용하며, 이 스킴이 차단 목록에서 빠져 있었습니다. 저자는 이 페이지에서 Edge의 네이티브 JavaScript 객체인 chrome.edgeFeedbackPrivate.zipDiagnosticLogFiles()를 호출했습니다. 함수가 임시 폴더에 파일을 쓰고 ZIP으로 묶는 과정에서 경로 이동과 NULL 바이트를 이용해 .json 확장자 제한을 우회했고, 임의 경로에 파일을 쓰는 원시 기능을 얻었습니다.
처음 검토한 DLL 사이드로딩은 JSON 문자열의 UTF-8 제약과 64비트 PE 형식 때문에 포기했습니다. 대신 Edge가 시작할 때 읽는 AutoLaunchProtocolsComponent의 protocols.json을 덮어써, 원하는 출처에서 URL 프로토콜 핸들러를 실행하도록 바꿨습니다. 이후 Edge를 재시작하고 telnet:// 핸들러를 호출했습니다. Windows에 telnet.exe가 기본 제공되지 않는 점을 이용해 PATH 검색을 유도했고, 사용자 쓰기 권한이 있는 WindowsApps 경로에 둔 실행 파일을 실행해 ACE(Arbitrary Code Execution)를 달성했습니다.
저자는 전체 체인이 다섯 개의 버그와 두 가지 Windows 기능으로 구성됐으며, 연구에 두 달이 걸렸다고 밝혔습니다. Pwn2Own에서 17만 5천 달러와 17.5 Master of Pwn 포인트를 받았고, Pwnie Awards의 Epic Achievement 상도 수상했습니다.
원문: Orange Tsai 블로그 / 번역·요약: Trawling