개발자들은 CORS를 이해하지 못한다 (2019)
1 hour ago
1
- Zoom의 로컬 웹서버 취약점은 많은 웹 개발자가 CORS 동작 방식을 잘못 이해할 때 보안 경계가 쉽게 무너질 수 있음을 보여줌
- Zoom은 localhost:19421 로컬 서버와 통신하면서 AJAX 대신 이미지 크기로 상태 코드를 전달했고, 이는 CORS를 피하려는 우회 구현으로 해석됨
- Chrome은 localhost 웹서버에도 CORS 헤더를 적용하며, 서로 다른 localhost 포트의 프론트엔드·백엔드 통신도 브라우저에서 지원됨
- 더 안전한 설계는 로컬 서버가 REST API를 제공하고 Access-Control-Allow-Origin을 설정해 zoom.us의 JavaScript만 접근하게 제한하는 방식임
- 같은 출처 정책을 우회하면 코드는 동작할 수 있지만, 로컬 서버의 권한 있는 기능이 인터넷의 모든 웹사이트에 노출될 수 있음
Zoom 로컬 웹서버가 만든 CORS 우회
- 풀스택 컨설팅 현장에서 다양한 규모와 산업의 개발자들을 접하면서, 웹 개발자들이 CORS를 이해하지 못하는 문제가 반복적으로 보였음
- 최근 Zoom 취약점에서 보안 연구자 Jonathan Leitschuh는 Zoom이 사용자 머신에 http://localhost:19421 웹서버를 띄운다는 점을 발견함
- 사용자가 Zoom 링크를 열면 Zoom 웹사이트가 localhost 웹서버로 요청을 보내 네이티브 Zoom 앱을 실행함
- 일반 AJAX 요청 대신 로컬 Zoom 웹서버에서 이미지를 로드하고, 이미지의 서로 다른 크기로 서버의 오류·상태 코드를 표현함
- 브라우저가 localhost 서버의 CORS 정책을 무시한다는 해석은 틀렸고, Chrome은 localhost 웹서버의 CORS 헤더를 존중함
- Create React App 프론트엔드와 백엔드 API를 서로 다른 localhost 포트에서 실행할 때도 교차 출처 요청이 발생하며, 이는 모든 브라우저에서 지원됨
- AJAX 요청이 차단되자 Zoom이 이미지 해킹으로 CORS를 우회한 것으로 보임
- 그 결과 Zoom 웹사이트뿐 아니라 인터넷의 다른 웹사이트도 네이티브 클라이언트 동작을 트리거하고 응답에 접근할 수 있게 됨
안전한 대안과 남는 UX 문제
- 안전한 구현은 localhost:19421의 웹서버가 REST API를 구현하고 Access-Control-Allow-Origin 헤더 값을 https://zoom.us로 설정하는 방식임
- 이렇게 하면 zoom.us 도메인에서 실행되는 JavaScript만 localhost 웹서버와 통신할 수 있음
- zoom.us는 백그라운드에서 Zoom 미팅이 자동으로 열리는 것을 막기 위해 iframe 렌더링을 차단하는 Content Security Policy 헤더도 둘 수 있음
- 어떤 페이지든 브라우저를 zoom.us 미팅 링크로 리디렉션할 수 있는 문제는 여전히 남음
- 다만 이는 소프트웨어 취약점보다는 Zoom이 선택한 사용자 경험에 가까움
- 링크를 클릭했을 때 카메라와 마이크가 모르는 사람에게 갑자기 열리지 않을 것이라는 사용자 기대를 Zoom이 깨고 있음
- 브라우저 기본 팝업을 UX 이유로 피하고 싶다면 앱 안에서 팝업을 보여줄 수도 있으며, Google Meet가 그런 방식을 잘 사용함
- localhost에서 웹서버를 실행하는 것 자체가 위험한 시도이며, 특히 소프트웨어 설치 같은 권한 있는 기능을 인터넷의 모든 웹사이트에 제공해서는 안 됨
- CORS는 이런 상황을 안전하게 처리하기 위한 장치이므로 우회하지 않아야 함
Zoom만의 실수가 아닌 CORS 혼란
- Zoom이 실제로 CORS를 이해하지 못해서 이런 방식을 택했는지는 확실하지 않음
- Reddit의 lerunicorn은 Firefox가 보안 출처에서 비보안 출처로의 XHR을 막을 수 있다고 봄
- 하지만 Firefox는 origin이 localhost인 경우 이를 지원함
- 네이티브 앱은 고유한 자체 서명 인증서를 생성할 수 있고, 브라우저 확장을 사용할 수도 있음
- 어떤 경우에도 출처 필터링을 생략할 정당한 이유는 되지 않음
- CORS 혼란은 Zoom만의 문제가 아님
- Stack Overflow에는 Access-Control-Allow-Origin 관련 질문이 많이 존재함
- Express 예제 중에는 그대로 복사하면 애플리케이션이 취약해질 수 있는 불안전한 기본값을 권하는 페이지도 있음
- 다른 벤더들도 Zoom과 동일한 취약점을 겪은 적이 있음
- 개발자는 코드를 동작시키고 싶어 하지만, 같은 출처 정책을 통째로 우회하면 Zoom 사례처럼 로컬 권한이 외부 웹사이트에 노출됨
- CORS 혼란은 숙련 개발자와 신규 개발자 모두에게서 보이며, CORS API가 지나치게 복잡한지 또는 CORS와 CSP 교육이 부족한지는 분명하지 않지만 현재 방식은 잘 작동하지 않고 있음
-
Homepage
-
개발자
- 개발자들은 CORS를 이해하지 못한다 (2019)