Devlery
Blog/OpenAI

ChatGPT 링크 열기만 해도 계정 탈취 가능했다…보상금은 고작 670만원

ChatGPT 공유 링크를 열면 공격 코드가 실행돼 비공개 대화를 빼낼 수 있었습니다. OpenAI는 10월 26일 막고 5,000달러를 지급했고, 원인인 MathLive는 닷새 뒤 0.111.2에서 기본값을 고쳤습니다.

ChatGPT 링크 열기만 해도 계정 탈취 가능했다…보상금은 고작 670만원
AI 요약
  • 공유 링크만 열어도 공격 코드가 돌던 ChatGPT 결함이 P1으로 확인됐습니다.
  • OpenAI는 10월 26일 막았고 원인 MathLive는 31일에야 고쳤습니다.
  • MathLive 0.111.1 이하를 쓰는 앱은 직접 올려야 합니다.

공격자가 만든 ChatGPT 공유 링크를 열기만 해도 피해자의 로그인 상태에서 공격 코드가 실행돼 비공개 대화가 밖으로 나갈 수 있었던 사실이 드러났습니다. 앱을 설치하거나 코드를 붙여 넣을 필요도 없었습니다. 보안업체 Parameter의 Mukul Goyal이 10월 28일 보고서로 공개했습니다. OpenAI는 이 결함을 최고 등급인 P1으로 분류해 10월 26일 수정을 마쳤고 보상금 5,000달러(약 670만원, 1달러 1,334원 기준)를 지급했습니다.

실제 피해 사례는 보고되지 않았습니다. 시험은 연구진이 만든 별도 계정끼리 진행했고 Parameter 보고서에는 실제 악용 여부가 나오지 않습니다. OpenAI의 별도 공지도 찾지 못했습니다.

격리는 버텼고, 옆의 수학 라이브러리가 뚫렸습니다

ChatGPT 미리보기는 대화 속 HTML을 작은 웹페이지로 실행해 주는 기능입니다. 아무 코드나 돌 수 있어서 ChatGPT와 다른 웹 주소를 쓰는 제한된 틀 안에 가둡니다. Parameter는 이 격리 자체는 제대로 작동했다고 밝혔습니다. 미리보기 안의 코드는 바깥 ChatGPT 페이지를 읽지 못했습니다.

틈은 같은 대화에 들어 있던 인터랙티브 그래프였습니다. 그래프가 수식 입력 라이브러리 MathLive를 불러오면 MathLive가 ChatGPT 본 페이지에 메시지 수신기를 설치합니다. 브라우저의 postMessage는 격리된 프레임끼리 쪽지를 주고받는 기능이라 받는 쪽이 보낸 쪽을 확인해야 안전합니다. MathLive 수신기는 보낸 쪽을 확인하지 않았습니다.

공격자가 그래프와 HTML 미리보기를 넣은 대화를 공개 공유

↓

피해자가 공유 링크를 열면 미리보기가 메시지 2개를 전송

↓

MathLive가 발신자 확인 없이 키보드 레이아웃을 공격자 HTML로 교체

↓

본 페이지에 격리 없는 iframe 생성, chatgpt.com 신원을 물려받음

↓

허용 목록에 있던 YouTube 주소로 스크립트 차단을 우회

↓

비공개 대화를 조회해 외부 서버로 전송

마지막 관문은 CSP였습니다. CSP는 페이지가 어디서 온 스크립트를 실행할지 정한 허용 목록입니다. ChatGPT는 인라인 스크립트를 막았지만 YouTube는 허용했습니다. YouTube의 oEmbed 주소는 잘못된 callback 값을 오류 응답 앞에 그대로 넣어 돌려줬고 연구진은 이 응답을 스크립트로 불러왔습니다. Parameter는 이 우회가 마지막 단계일 뿐 근본 원인은 아니라고 적었습니다.

클릭 횟수는 시험 방식에 따라 다릅니다. 가장 안정적으로 재현한 방식은 링크를 연 뒤 미리보기 버튼을 한 번 누르는 것입니다. HTML 블록을 미리보기 가능으로 표시하면 자동으로 열려서 링크를 여는 것이 유일한 동작이 됩니다. 연구진은 별도 계정에서 이 경로를 세 번 재현했고 코드는 약 4.5초 뒤 실행됐습니다.

시연한 것은 비공개 대화 조회까지입니다

연구진이 실제로 보인 것은 세 가지입니다.

  • 피해자의 최근 대화 목록 조회
  • 공격자에게 공유된 적 없는 비공개 대화 내용 조회
  • 그 응답 일부를 연구진 서버로 전송

외부로 보낸 값은 일부러 작게 제한했습니다. 삽입된 코드가 응답 전체를 읽을 수 있었으므로 유출 범위가 그 값에 한정되지는 않습니다.

연구진 서버의 수신 기록. source 값 chatgpt-private-chat-v3와 가려진 canary 값이 요청 쿼리로 들어와 있다

계정 탈취는 연구진의 판단입니다. 보고서는 코드가 피해자 권한으로 ChatGPT 내부 API를 호출하므로 피해자가 웹에서 할 수 있는 모든 행동이 가능하다고 봤습니다. 보고서 도식에는 파일 읽기와 계정 변경도 적혀 있습니다. 다만 이 두 동작을 실제로 시연한 기록은 없습니다.

5,000달러가 낮다는 비판

Hacker News 토론(284점, 댓글 139개)에는 보상금이 낮다는 댓글이 여러 건 달렸습니다. OpenAI는 2025년 3월 최고 보상금을 2만 달러에서 10만 달러로 올렸습니다. 이번 5,000달러는 그 최고액의 5%입니다. 9월에 OpenAI 직원 계정까지 탈취한 Hacktron의 공격 체인에는 6,500달러가 지급됐습니다.

10만 달러는 "예외적이고 차별화된" 결함에 주는 상한이지 P1 기본액이 아닙니다. 현재 P1 지급 구간은 확인하지 못했습니다. 첫 판정은 P2였고 OpenAI가 재현한 10월 21일에 P1로 올랐습니다.

OpenAI가 막은 뒤 닷새 동안 열려 있던 MathLive

ChatGPT는 고쳐졌지만 MathLive는 별개의 오픈소스입니다. 저장소를 확인해 보니 기본값을 바꾼 패치는 OpenAI 수정 닷새 뒤에 나왔습니다.

날짜일어난 일
10월 18일Parameter가 OpenAI에 제보
10월 21일OpenAI가 재현, P2에서 P1로 상향
10월 26일OpenAI 웹 프런트엔드 2개 수정 완료
10월 28일Parameter 보고서 공개
10월 31일MathLive 0.111.2가 npm에 배포 (UTC 20시 38분)

해당 커밋은 메시지 출처 검사 기본값을 'none'에서 'same-origin'으로 바꿨습니다. 이전 버전은 검사가 꺼진 채로 나갔습니다. 변경 기록에 따르면 이제 다른 창에서는 내장 레이아웃만 고를 수 있고 사용자 지정 HTML은 보낼 수 없습니다. 검사를 꺼도 마찬가지입니다.

MathLive의 npm 주간 다운로드는 42만 1,823회(10월 23일부터 29일까지)입니다. 그런데 이 변경을 알리는 보안 권고는 없습니다. 목록의 최신 항목은 10월 9일자입니다. 커밋과 변경 기록은 ChatGPT나 Parameter를 언급하지 않아서 이번 보고서가 계기였는지는 확인되지 않습니다. 권고가 없으니 자동 취약점 알림에 안 잡힐 수 있습니다.

이전 버전을 쓴다고 곧바로 위험한 것은 아닙니다. 이전 버전은 최상위 페이지에 로드되는 순간 수신기를 켜므로 같은 페이지에 믿을 수 없는 iframe이 있을 때 같은 경로가 열립니다. 코드 실행까지 가려면 그 앱의 CSP도 넘어야 합니다.

독자상태조치
ChatGPT 이용자(한국 포함)10월 26일 수정 완료. 보고서에 지역·요금제 제한 언급 없음없음. 수정은 OpenAI 웹 쪽에서 끝남
MathLive를 쓰는 개발자0.111.1 이하는 출처 검사 기본값이 꺼짐0.111.3으로 업데이트(무료)
다른 출처 프레임과 키보드를 연동한 개발자업데이트하면 기본값이 바뀌어 연동이 끊길 수 있음originValidator에 허용 출처를 명시

LLM이 만든 HTML을 화면에 보여 주는 앱을 운영한다면 이번 사건과 구조가 같습니다. 미리보기를 아무리 잘 가둬도 바깥 페이지의 라이브러리가 그 쪽지를 받아 주면 격리가 소용없어집니다. 이번 주에 npm ls mathlive로 버전부터 확인하고 내친김에 최상위 페이지의 message 수신기가 event.origin과 event.source를 둘 다 검사하는지 하나씩 살펴보세요. Parameter가 꼽은 첫 번째 교훈도 이 두 값을 검사하라는 내용입니다.