공유된 대화를 열었는데 비공개 대화까지 노출됐다: 챗GPT의 기능 사이 빈틈

공유 링크와 그래프, HTML 미리보기가 연결되자 다른 사용자의 비공개 대화에 접근할 수 있었습니다. 10월 26일 수정된 챗GPT 취약점에서 기능 사이의 권한 검사가 왜 필요한지 살펴봅니다.

공유 대화 옆의 경계를 뚫고 드러난 별개의 비공개 대화를 표현한 장면

챗GPT에서 남이 공유한 대화를 읽는 것과 내 비공개 대화를 넘겨주는 것은 전혀 다른 일이다. 그런데 보안 연구업체 Parameter는 두 행동이 이어지는 취약점을 발견했다. 공격자가 그래프와 HTML 미리보기를 담은 대화를 공유하면, 그 링크를 연 사용자의 로그인 상태로 코드가 실행됐다. 연구팀은 공유하지 않은 대화를 불러온 뒤 일부 데이터를 외부 서버로 보내는 데 성공했다고 밝혔다.

10월 28일 공개된 보고서에 따르면 오픈AI는 2026년 10월 26일 수정을 완료했고, 신고의 심각도를 P1으로 분류했다. 이번 공개는 실제 이용자 전체의 유출 규모를 집계한 사고 보고가 아니라, 연구용 계정 사이에서 공격 경로와 비공개 데이터 접근을 확인한 취약점 보고다. 링크 주소가 진짜 chatgpt.com이었고 별도 앱 설치도 필요 없었다는 점에서, 가짜 로그인 페이지를 피하는 습관만으로 막기 어려운 유형이었다.

미리보기는 격리돼 있었는데 어디로 빠져나갔나

챗GPT의 HTML 미리보기는 코드로 만든 작은 웹페이지를 보여 주는 기능이다. 임의의 프로그램이 들어갈 수 있어 본체와 다른 웹 주소의 제한된 프레임에서 실행된다. 브라우저는 서로 다른 출처의 페이지가 상대 문서를 마음대로 읽지 못하게 한다. 연구팀이 처음 확인했을 때도 미리보기에서 바깥 챗GPT 화면을 직접 읽으려는 시도는 막혔다.

빈틈은 같은 대화에 들어 있던 그래프에서 생겼다. 그래프가 수학 라이브러리 MathLive를 불러오면서, 챗GPT 본체에는 가상 키보드 관련 메시지를 받는 기능도 설치됐다. 브라우저의 postMessage는 출처가 다른 프레임끼리도 메시지를 보낼 수 있게 한다. 문서를 읽을 수 없다는 제한이 메시지 전송까지 막아 주지는 않는다.

당시 MathLive의 수신부는 문제의 설정 변경 메시지를 보낸 웹 주소와 허가된 창을 충분히 확인하지 않았다. 미리보기 쪽에서 보낸 키보드 배치 설정에는 HTML까지 들어갈 수 있었다. 연구팀은 배치를 바꾸고 키보드를 표시하라는 메시지를 보내, 외부 입력이 챗GPT 본체의 HTML로 삽입되게 했다.

격리된 미리보기의 메시지를 MathLive가 받아 챗GPT 본체에 HTML을 삽입한 경로
원문 기반 한글 재구성. 출처: Parameter

허용된 외부 사이트가 코드 실행 경로가 됐다

HTML이 들어갔다고 곧바로 모든 스크립트가 실행되는 것은 아니다. 연구팀은 새 문서를 품은 프레임을 삽입하는 방식을 썼다. 이 프레임에는 격리 속성이 없었고, 챗GPT 본체가 만들었기 때문에 같은 chatgpt.com 출처를 물려받았다. 처음의 미리보기는 여전히 격리돼 있었지만, 그 메시지를 받아 만들어진 새 문서는 본체에 접근할 수 있게 됐다.

콘텐츠 보안 정책(CSP)도 한 차례 실행을 막았다. CSP는 페이지가 어떤 곳의 스크립트를 불러올 수 있는지 정하는 브라우저 방어 장치다. 챗GPT는 인라인 코드는 막되 유튜브의 스크립트는 허용하고 있었다. 연구팀은 유튜브의 oEmbed 응답이 콜백 값을 자바스크립트로 돌려주는 경로를 조합해 이 제한을 우회했다. 유튜브 주소 하나를 차단하는 것만으로는, 신뢰하지 않는 입력을 본체 HTML로 받아들인 앞선 문제까지 해결되지 않는다.

공유 링크로 전달하는 데도 조건이 있었다. 그래프가 빠지면 MathLive 수신부가 준비되지 않아 공격이 이어지지 않았다. 최종적으로 그래프와 뒤따르는 HTML 미리보기를 한 공개 대화에 함께 넣었다. 안정적으로 재현한 경로에서는 링크를 연 뒤 미리보기 버튼을 한 번 눌렀고, 이후 자동 미리보기 경로에서는 링크를 여는 것만으로 실행됐다. 연구팀은 자동 경로를 별도 계정에서 세 차례 재현했다고 기록했다.

Parameter 연구 화면 원본과 한국어 설명. 챗GPT 본체 하단에 코드 실행 확인 배너가 추가돼 있다
출처: Parameter

화면을 바꾸는 데서 끝나지 않은 이유

화면에 알림을 띄우는 것과 비공개 대화를 읽는 것은 피해 범위가 다르다. 연구팀은 챗GPT 페이지가 가진 세션 정보를 사용해 로그인한 사용자 권한으로 대화 API를 호출했다. 최근 대화 목록을 먼저 가져오고, 그중 공격자에게 공유한 적 없는 대화의 메시지 내용을 요청했다. 화면에 보이는 문장을 긁어 모은 것이 아니라 서비스가 사용하는 인증된 요청으로 데이터를 받은 것이다.

이어 응답의 일부 값을 연구팀 서버로 보내 외부 반출까지 확인했다. 공개된 증거 화면에는 수신 요청의 출처 표식이 있고, 확인용 값은 가려져 있다. 시험에서 반출량을 작게 제한했지만, 주입된 코드는 이미 비공개 대화 응답을 읽을 수 있는 상태였다. 보고서는 같은 로그인 권한으로 가능한 다른 데이터 접근과 계정 동작도 영향 범위에 들어간다고 설명한다. 공개된 실증의 중심은 비공개 대화 조회와 일부 데이터 반출이다.

Parameter의 수신 요청 기록 원본. source에 chatgpt-private-chat-v3가 표시되고 확인용 값은 가려져 있다
출처: Parameter

기능을 따로 시험하면 놓치는 경계

수정도 한 번에 모든 화면에 적용되지는 않았다. 보고서의 경과 기록에는 10월 22일 웹 프런트엔드 두 버전 중 하나가 고쳐졌고, 23일에는 CSP 변경이 공격 경로 일부를 막았다고 적혀 있다. 26일에는 두 버전 모두 신고에 쓰인 MathLive 메시지를 거부한다는 확인을 받고 문제가 종료됐다. 공개 시점에는 이 경로가 수정된 상태였다.

서비스를 만드는 쪽에서 되짚을 부분은 기능 사이의 전달 권한이다. 격리된 화면에서 오는 메시지라면 발신 주소와 실제로 허가한 창을 함께 검사해야 한다. 창 사이의 설정 값으로 생 HTML을 받아들이는 구조도 줄여야 한다. 외부 입력으로 새 문서를 만들 때는 처음 적용한 격리가 그 문서에도 이어져야 한다.

이 사례에서는 공유, 그래프, 미리보기, 외부 스크립트 허용이 한 페이지에서 만났다. 각 기능의 단독 시험에 더해, 남이 만든 공개 대화를 로그인 상태로 열었을 때 다른 기능이 어떤 권한으로 반응하는지를 시험해야 했던 것이다. 챗GPT를 업무에 쓰는 조직도 공유한 대화의 범위와 계정에 보관한 자료의 범위를 별개로 관리할 필요가 있다. 공유 링크에 포함하지 않은 자료라도 로그인한 웹앱의 권한이 뚫리면 접근 대상이 될 수 있기 때문이다.

출처: Parameter, Do the Math: How We Took Over ChatGPT Accounts