Do the math: How we took over ChatGPT accounts
Parameter 연구진, ChatGPT 공개 대화 링크로 비공개 대화 열람 취약점 재현
Parameter 연구진은 ChatGPT 공개 대화의 그래프와 HTML Preview를 결합해 링크를 연 사용자의 로그인 세션에서 코드를 실행하고, 비공개 대화 내용을 읽어 일부를 외부로 보낼 수 있었다고 밝혔습니다. Parameter에 따르면 OpenAI는 보고를 P1으로 분류했으며 2026년 10월 26일 두 웹 프런트엔드에서 취약한 메시지를 거부하도록 수정했습니다.
- 주제
본문
Parameter 보안 연구진은 ChatGPT 공개 대화 링크를 연 사용자의 로그인 세션에서 JavaScript를 실행하고, 비공개 대화 내용을 읽어 일부를 외부 서버로 보내는 취약점을 재현했다고 밝혔습니다. 연구진에 따르면 OpenAI는 2026년 10월 26일 두 웹 프런트엔드에서 문제의 교차 프레임 메시지를 거부하도록 수정했습니다. 공격 코드는 피해자 브라우저에 열린 로그인 세션으로 ChatGPT API를 호출했으며, Parameter는 이 권한 범위를 계정 장악으로 설명했습니다.
ChatGPT의 HTML Preview는 별도 웹 주소의 제한된 프레임에서 실행됩니다. Preview 안의 JavaScript는 메인 ChatGPT 페이지를 직접 읽지 못했지만, 공개 대화 속 그래프가 수학 라이브러리 MathLive를 메인 페이지에 불러와 가상 키보드 메시지를 받는 수신기를 설치했습니다. Preview는 postMessage로 다른 프레임에 메시지를 보낼 수 있었고, MathLive 수신기는 메시지를 보낸 웹 출처와 프레임이 허용된 것인지 확인하지 않았습니다. 키보드 레이아웃에 HTML을 넣을 수도 있어, MathLive는 전달받은 내용을 메인 페이지의 innerHTML에 렌더링했습니다.
MathLive는 이 HTML에서 sandbox 속성 없는 srcdoc 프레임을 만들었습니다. ChatGPT 페이지가 프레임을 만들었기 때문에 브라우저는 프레임에도 chatgpt.com과 같은 출처 권한을 부여했습니다. ChatGPT의 콘텐츠 보안 정책(CSP)은 인라인 스크립트를 막았지만 YouTube 스크립트는 허용했습니다. 연구진은 YouTube oEmbed의 JSONP 응답을 이용해 새 프레임에서 JavaScript를 실행했습니다. 취약점은 Preview가 직접 메인 페이지를 읽은 데서 생긴 게 아니라, 메인 페이지의 MathLive 수신기가 Preview의 메시지를 검증 없이 HTML 렌더링으로 이어간 데서 생겼습니다.
연구진은 MathLive를 불러오는 그래프와 메시지를 보내는 HTML Preview를 한 공개 대화에 넣었습니다. 처음 재현한 경로에서는 사용자가 링크를 연 뒤 Preview 버튼을 한 번 눌렀습니다. 이후 Preview 자동 실행 버전에서는 링크를 여는 것만으로 코드가 실행되는 경로를 별도 계정에서 세 차례 재현했다고 밝혔습니다.
실행된 코드는 로그인 세션의 권한으로 대화 목록을 불러오고, 공격자가 공유하지 않은 비공개 대화의 메시지를 요청했습니다. 연구진은 응답을 읽은 뒤 선택한 일부를 자신들이 관리하는 서버로 보내는 통제된 증명을 공개했습니다. 연구진은 같은 세션 권한으로 프런트엔드 API가 제공하는 다른 데이터와 작업에도 접근할 수 있다고 설명했지만, 공개된 구체적인 증명은 비공개 대화 조회와 일부 데이터 전송입니다. Parameter의 글은 실제 외부 악용 사례나 피해 규모는 제시하지 않습니다.
Parameter는 OpenAI가 보고를 P1으로 분류하고 취약점을 재현한 뒤 수정했다고 전했습니다. 수정 과정에서 CSP 변경이 공격 경로의 일부를 막았고, 10월 26일에는 두 웹 프런트엔드 모두 취약한 교차 프레임 MathLive 메시지를 거부하도록 바뀌었습니다.
자료: Parameter / 정리·해설: Trawling