ChatGPT가 커넥터 사이로 조용히 데이터를 넘긴다는 보안 제보
ChatGPT silently passes data between connectors and the bounty wants an ID card
TL;DR Highlight
커넥터 2개를 켜자 후속 툴 호출이 다른 커넥터로 조용히 넘어갔다
Who Should Read
ChatGPT Apps SDK나 MCP 서버로 확인 코드·OAuth 기반 다단계 툴 흐름을 만드는 백엔드 개발자
Core Mechanics
- 후속 호출이 다른 커넥터로 갔다
- 커넥터 2개를 켠 대화에서 A로 시작한 흐름의 후속 툴 호출이 B로 나갔다.
- 사용자에게는 전환 사실이 전혀 안 알려졌다.
- 일회용 확인 코드가 같이 넘어갔다
- A 위젯이 ui/message로 대화에 보낸 코드가 B 호출에 실려 갔다.
- 글쓴이는 앱끼리 사용자 동의 없이 데이터가 넘어가는 문제라고 본다.
- 서버가 코드를 막아서 실패했다
- 코드가 커넥터 A의 OAuth client에 묶여 있어 B에서 쓰면 거부됐다.
- 해당 대화의 모든 시도가 실패했다.
- 재현 조건은 같은 MCP 서버 두 커넥터다
- A는 개발자 모드 커스텀 커넥터, B는 앱 디렉터리에 게시된 앱이다.
- 각각 별도 OAuth client를 가져서 서버는 같은 사용자를 두 client로 본다.
- URL이 아니라 OAuth client가 경계다
- 같은 MCP URL 뒤에서도 서버는 OAuth client에 따라 다른 테넌트·파트너·환경으로 동작할 수 있다.
- 글쓴이는 툴 호출을 URL이 아닌 OAuth client 기준으로 커넥터에 매칭해야 한다고 주장한다.
- 버그바운티 제출은 신분 요구로 막혔다
- 제출 전에 생체 인증과 신분증 제공을 요구해서 글쓴이는 거부했다.
Community Reactions
- bug bounty 신분 확인은 플랫폼 정책이라는 의견
- 제재 준수 때문이라 생각했지만 Bugcrowd 문서를 보니 저품질 제보를 줄이려고 모든 연구자에게 IDV를 의무화했다는 댓글이 있었다.
- 확인도 결국 별도 툴 호출일 뿐이라는 반론
- 확인이 별도 툴 호출이면 스코프나 바인딩이 없고, 모델에 제어를 넘기면 모델에게 넘긴 것이라는 의견이었다.
- OpenAI와 MCP가 보장하는 범위를 과대평가했다는 지적이다.
- techsoft.ye 답글이 LLM 글 같다는 반응
- 길지만 쓸모 있는 내용이 없다고 비판하는 댓글이 있었다.
- 취약점을 암시장에 판다는 극단적 댓글
- NDA나 공개 유예 기간을 거부하고 Tor에서 팔았다는 주장도 있었다.
How to Apply
- 확인 코드를 OAuth client에 묶기
- 오늘 확인 코드 발급부에 client_id, 사용자, 작업 ID를 함께 저장하라.
- 검증 시 세 값이 모두 일치하지 않으면 거부하라.
- 같은 MCP URL 뒤 client별 동작 점검하기
- 같은 서버를 여러 커넥터로 노출 중이면 OAuth client별 권한과 테넌트 분기를 목록으로 정리하라.
- URL이 아닌 client 단위로 접근 제어를 확인하라.
- 커넥터 전환 로그 남기기
- 확인 단계와 후속 호출에서 들어온 client_id를 로그에 기록하라.
- 코드 값 자체는 남기지 마라.
- 확인 코드를 짧은 수명의 일회용으로 만들기
- 코드 만료 시간을 짧게 두고 한 번 쓰면 폐기하라.
- 위젯이 대화에 보내는 값은 다른 커넥터에 노출될 수 있다고 가정하라.
Try It
# Claude 또는 ChatGPT에 붙여넣기 (MCP 서버 확인 코드 설계 리뷰용)
아래는 우리 MCP 서버의 확인 코드 발급·검증 코드다.
{{코드}}
다음 기준으로 취약점을 점검해 줘.
1. 확인 코드가 발급 시점의 OAuth client_id, 사용자, 작업에 묶여 있는가
2. 다른 client_id로 코드를 쓰면 거부되는가
3. 코드가 일회용이고 수명이 짧은가
4. 로그에 코드 값이 노출되지 않는가
이어서 해 볼 것: 부족한 부분의 수정 코드와 client_id 불일치 테스트 케이스를 써 줘.Terminology
관련 논문
AI Brain Fry 이겨내기: git 기반 우선순위 큐로 에이전트 작업 관리
티켓을 git에 두고 결정만 한 곳에서 처리했더니 20개 스레드 혼란이 줄었다
Goldman Sachs, 트레이더·뱅커의 Claude Code 접근을 제한하다
Goldman이 코딩 에이전트를 엔지니어에게만 허용하고 트레이더·뱅커는 막았다
Agent memory에도 OpenTelemetry 같은 공통 규격이 필요하다는 주장
에이전트 메모리 포맷이 제각각이라 OpenTelemetry식 공통 규격을 제안한 글
Claude Code를 접고 Pi로 갈아탄 이유
Claude Code의 잦은 시스템 프롬프트 변경에 지쳐 Pi로 갈아탔다
에이전트 메모리의 구성 요소: 노트, dreaming, 위키
Claude에 메모리 폴더와 dreaming을 붙였더니 문서 질의 점수가 13%→48%로 올랐다
Claude Code가 User-Agent 헤더에 이메일을 실어 웹사이트로 보낸다
Claude Code가 curl 요청 User-Agent에 사용자 이메일을 넣어 스팸 피해 제보가 나왔다
Rivet: S3 위에서 에이전트를 확장·오케스트레이션하는 Actor 플랫폼
에이전트마다 Actor를 띄웠더니 콜드스타트 4.99ms, 메모리 72KB가 됐다
Stroq: 코딩 에이전트가 한 일과 이유를 로컬에서 감사하는 도구
Stroq는 에이전트 세션에서 유출된 키를 찾고 위험 명령을 출처까지 추적해 막는다