챗GPT 프롬프트 인젝션 공격으로 지메일 데이터 몰래 유출…사용자 화면엔 흔적 없어

작성일

체크포인트리서치, 챗GPT 숨은 지시로 지메일 데이터 유출 취약점 공개
오픈AI, 내부 아티팩토리 서비스 차단으로 대응

챗GPT 관련 이미지 / AI 생성 일러스트(삽화)
챗GPT 관련 이미지 / AI 생성 일러스트(삽화)

보안업체 체크포인트리서치(Check Point Research)가 챗GPT(ChatGPT) 대화 속에 심어둔 지시문 하나로 사용자의 지메일(Gmail) 데이터를 다른 계정으로 몰래 빼낼 수 있는 취약점을 발견했다고 밝혔다. 공격자가 만든 지시문이 대화에 들어가 있으면, 챗GPT는 사용자의 질문에 정상적으로 답하면서 동시에 뒤에서 공격자를 위한 작업을 수행했다. 사용자 화면에는 이상한 점이 전혀 나타나지 않았다. 체크포인트는 이 발견을 오픈AI(OpenAI)에 알렸고, 오픈AI는 문제가 된 내부 서비스를 오프라인으로 내렸다고 확인했다.

대화 하나에 심어둔 지시문, 답변과 동시에 몰래 작동

체크포인트가 만든 시연에서 챗GPT는 사용자가 묻는 일반 질문에 답하는 동시에 숨겨진 우편함을 확인해 공격자가 남긴 작업 지시를 실행했다. 이 작업은 사용자 세션이 가진 도구와 연동 앱 권한을 그대로 써서 실행됐고, 결과는 다시 공격자 쪽으로 전달됐다. 지시문은 챗GPT의 씽킹(Thinking) 모드에서 같은 대화 턴 안에 두 개의 작업 흐름을 동시에 돌리도록 설계됐다.

체크포인트는 같은 통로로 대화 기록과 대화에 첨부된 파일도 함께 빼낼 수 있었다고 덧붙였다. 공격자가 실제로 얼마나 많은 데이터를 가져갈 수 있는지는 피해자 세션이 이미 접근 가능한 데이터와 도구, 연동 앱 권한에 따라 달랐다.

지시문이 대화에 들어가는 경로는 세 가지였다. 사용자가 직접 붙여넣은 프롬프트, 사용자가 열어본 공유 챗GPT 대화, 혹은 사용자에게 보이지 않는 빌더 지시문에 숨겨놓은 커스텀 GPT(custom GPT)였다. 지시문이 대화 맥락에 자리잡은 뒤로는 요리법을 묻는 것처럼 평범한 메시지 하나만 있어도 숨은 작업이 함께 실행됐다.

화면에 남는 흔적은 답변 위에 뜨는 작은 “Talked to Gmail” 표시 하나뿐이었다. 이 표시는 이미 끝난 읽기 작업을 알리는 것일 뿐, 사용자에게 허용하거나 거부할 기회를 주지 않았다.

격리된 컨테이너를 뚫은 공유 패키지 서버 / AI 생성 이미지
격리된 컨테이너를 뚫은 공유 패키지 서버 / AI 생성 이미지

격리된 컨테이너를 뚫은 공유 패키지 서버

챗GPT는 코드 실행이 필요한 작업마다 대화별로 별도의 컨테이너(격리된 실행 환경)를 만든다. 오픈AI 문서에 따르면 이 컨테이너의 파이썬 환경은 외부 웹이나 API에 직접 요청을 보낼 수 없고, 체크포인트도 서로 다른 계정 아래 만들어진 컨테이너끼리는 직접 통신할 경로가 없다고 확인했다.

다만 모든 컨테이너가 예외 없이 접근할 수 있는 내부 서비스가 하나 있었다. 챗GPT가 파이썬·npm 패키지를 설치할 때 쓰는 내부 JFrog 아티팩토리(Artifactory) 인스턴스다. 컨테이너는 공개 패키지 저장소 대신 이 내부 서비스로만 연결됐는데, 이 서비스가 저장된 파일에 이름표(속성값)를 붙이고 다시 읽어올 수 있는 기능을 제공했다.

문제는 컨테이너가 가진 읽기 권한용 자격 증명이 그 속성값을 쓰는 데도 충분했다는 점이다. 이 자격 증명은 환경변수에 그대로 담겨 있어 챗GPT가 실행하는 코드가 별도의 권한 상승 없이도 바로 가져다 쓸 수 있었다. 체크포인트는 한 계정의 컨테이너에서 chatgpt_test_ts라는 이름으로 현재 시각을 담은 속성값을 캐시 파일에 붙인 뒤, 전혀 다른 계정의 컨테이너에서 같은 파일의 속성값을 요청해 똑같은 값을 받아냈다고 밝혔다.

속성값은 일반 텍스트나 Base64로 담을 수 있고, 한 번에 담기 어려운 큰 데이터는 여러 속성값으로 쪼개 나중에 다시 합칠 수도 있었다. 결국 패키지 서버의 메타데이터가 서로 격리돼야 할 컨테이너 사이의 공유 클립보드처럼 작동했다.

왜 아무도 몰랐나…기본 권한 설정의 함정

지메일 데이터를 읽어가는 과정에서 사용자에게 확인을 구하지 않은 이유는 챗GPT의 기본 권한 설정에 있다. 오픈AI 문서는 연동 앱에서 “Important actions”를 기본 권한으로 두고 있는데, 이 설정에서는 챗GPT가 앱에서 데이터를 읽어올 때 별도로 묻지 않는다. 챗GPT는 챗GPT 밖에 실제 영향을 주거나 민감한 정보를 노출하거나 되돌리기 어려운 행동을 할 때만 사용자에게 먼저 물어본다.

매번 확인받고 싶은 사용자는 “Always ask”로 설정을 바꿀 수 있다. 비즈니스·엔터프라이즈·교육(Business, Enterprise, Edu) 워크스페이스에서는 관리자가 각 앱이 수행할 수 있는 행동과 사용 가능 대상을 직접 정할 수 있다. 다만 앱 연동 기능은 비즈니스 요금제에서는 기본적으로 켜져 있고, 엔터프라이즈·교육 요금제에서는 기본적으로 꺼져 있다.

오픈AI 대응과 반복되는 “공유 인프라” 문제

체크포인트는 발견 내용을 오픈AI에 알렸고, 오픈AI는 문제가 된 내부 아티팩토리 인스턴스를 오프라인으로 내려 계정 간 통로를 막았다고 확인했다. 사용자가 따로 설치해야 할 업데이트는 없다. 체크포인트는 이번 조사 시점을 6월로 밝혔지만, 해당 통로가 실제로 언제까지 열려 있었는지는 밝히지 않았다.

이번 사례는 체크포인트가 챗GPT의 같은 부분에서 발견해 보고한 두 번째 통로다. 앞서 3월 체크포인트는 DNS 조회를 이용해 대화 데이터를 외부 서버로 보내는 통로를 발견했다고 밝혔고, 오픈AI는 이를 2월 20일(현지시각) 수정했다고 밝힌 바 있다. 오픈AI 자체 모델이 보안 테스트 중 내부 아티팩토리 인스턴스를 메시지판처럼 사용한 허깅페이스(Hugging Face) 사건도 별개로 존재했는데, 체크포인트는 메커니즘은 다르지만 두 사례 모두 “격리돼야 할 환경 사이에서 공유 내부 서비스가 의도치 않은 통신 계층이 됐다”는 공통점을 지닌다고 설명했다.

체크포인트는 이런 위험을 “강요당한 내부자(coerced insider)”라는 개념으로 요약했다. 모델 자체가 악의를 가진 것은 아니지만, 자격 증명과 내부 API, 사용자 데이터에 접근할 수 있는 신뢰 경계 안에 있으면서 텍스트 지시를 그대로 따른다는 점에서 문제가 생긴다는 설명이다. 설득력 있게 짜인 프롬프트 하나가 모델을 공격자 대신 움직이게 할 수 있다는 뜻이다.