시연용 스크립트인 compaction_smuggle.py는 Xint의 GitHub 저장소에서 확인할 수 있습니다.
컴팩션 스머글링(Compaction Smuggling)을 통한 OpenAI 추론 트레이스 탈취
요약
AI 추론 모델이 답을 내기 전 거치는 '생각 과정'은 AI 기업들이 외부에 공개하지 않고 숨겨두는 데이터입니다. 이 데이터가 새어 나가면 다른 회사가 이를 학습 재료로 삼아 비슷한 성능의 모델을 따라 만들 수 있기 때문입니다.
2026년 8월, Xint 연구진은 OpenAI API에서 이 생각 과정의 원문을 빼낼 수 있는 취약점을 발견했습니다. 올해 공개된 탈취 기법(Stolen Thoughts 논문)을 막기 위해 OpenAI가 적용한 방어 조치를 우회하는 새로운 방법으로, Xint는 이 공격 기법을 '컴팩션 스머글링(Compaction Smuggling)'이라고 이름 붙였습니다.
OpenAI는 제보를 확인한 뒤 10월 23일 비공개 패치를 적용했고, Xint에 6,000달러의 버그 바운티를 지급했습니다.
배경
gpt-5.6-sol 같은 추론 모델은 답을 내놓기 전에 먼저 추론 과정을 거칩니다. 이 과정에서 모델이 단계별로 써 내려가는 사고 텍스트를 사고 사슬(Chain of Thought, CoT)이라고 하는데, OpenAI는 API 사용자에게 이 원문을 보여주지 않고 원하는 경우에만 요약본을 제공합니다.
원문을 숨기는 이유 중 하나는 '증류(distillation)'를 막기 위해서입니다. 증류는 작은 모델(학생)이 큰 모델(교사)의 출력을 보고 따라 배우는 학습 방식입니다. 이때 정답만 보는 것보다 풀이 과정까지 보는 편이 훨씬 효과적입니다. 추론 원문에는 막다른 길에 부딪히고 스스로 고쳐 나간 흔적까지 고스란히 담겨 있어, 최종 답변보다 훨씬 값진 학습 데이터가 되기 때문입니다.
그래서 OpenAI API는 추론 원문을 암호화된 데이터 덩어리(블롭, blob)로만 돌려줍니다. 사용자는 이 내용을 직접 읽을 수 없습니다. 대신 다음 대화에서 이 덩어리를 다시 보내면, 서버가 이를 복호화해 모델에게만 전달합니다. 내용은 모르는 채로 봉인된 메모를 들고 있다가, 필요할 때 다시 모델에게 건네주는 셈입니다.
OpenAI는 '컴팩션' 결과물도 같은 방식으로 암호화합니다. 컴팩션은 대화가 길어졌을 때 모델이 그동안의 내용을 짧게 압축해 정리하는 기능입니다. 컴팩션 결과물 역시 사용자에게는 읽을 수 없는 암호화된 형태로만 전달됩니다(컴팩션의 동작 방식은 GhostCompact 게시물에서 자세히 다뤘습니다). 이번 컴팩션 스머글링 공격은 바로 이 컴팩션 기능에서 출발합니다.
관련 연구: Stolen Thoughts
2026년 8월, Panfilov 연구진은 암호화된 추론 데이터의 이식이 가능하다는 Matthew Green의 이전 연구를 바탕으로 Stealing Reasoning Traces from Proprietary LLM APIs (stolen-thoughts.com) 논문을 발표했습니다. 이 논문은 프런티어 모델의 암호화된 추론 데이터를 동일 프로바이더의 하위 모델로 재전송한 뒤, 그 모델이 내용을 그대로 받아 적도록 강제할 수 있음을 보여주었습니다. 이 공격 기법은 Anthropic, OpenAI, Google 세 곳 모두에 유효했습니다.
OpenAI는 세 프로바이더 중 공격하기 가장 까다로웠습니다. GPT-5.6의 추론 데이터는 다른 GPT-5.6 모델로만 재전송이 가능했기 때문에, 저자들은 gpt-5.6-luna를 디코더로 사용해야 했을 뿐 아니라, 증류 방지 방어 체계를 우회하기 위해 블록별 프롬프트 템플릿, Best-of-N 샘플링, 50토큰 미만의 출력 청크 단위를 결합하여 활용해야 했습니다.
취약점 제보 후 프로바이더들은 완화 조치 적용을 완료했으며, 논문에 따르면 2026년 8월 기준으로 해당 공격은 더 이상 재현되지 않는 것으로 확인되었습니다. Xint 연구진의 8월 자체 테스트에서도 이전 공격 방식으로 더 이상 추론 트레이스를 추출할 수 없음을 확인했습니다.
컴팩션 스머글링(Compaction Smuggling)이란?
컴팩션 스머글링이라는 새로운 공격 기법은 한 모델의 추론 데이터를 컴팩션 항목 안에 인코딩해 다른 모델로 이전시킵니다. 공격은 총 세 번의 API 호출만으로 가능합니다:
추론 생성 (Produce the reasoning): Xint 연구진은
gpt-5.6-sol모델에store=False옵션을 주어 요청을 보내고 암호화된 추론 항목(encrypted_content)을 확보했습니다. 시연에서는 무작위로 생성된 수학 및 알고리즘 문제를 활용했으나, 어떤 작업에서도 동일하게 작동합니다.컴팩션 제어 (Steer the compaction): 컴팩션 단계에서는 복호화된 추론 데이터를 참조할 수 있으며,
instructions파라미터를 통해 컴팩션의 동작 및 출력 형식을 제어합니다. 연구진은 대화 기록에서 기존에 요청했던 작업을 삭제하고, 추론 데이터를 원본 그대로 보존하도록 하는instructions를 설정해/responses/compact를 호출했습니다. 작업 기록이 없으면, 컴팩션 단계에서 모델이 문제를 다시 풀거나 요약하는 식으로 편법을 쓸 수 없습니다. 또한 추론 데이터를 JSON 객체의"solution"키 하위에 배치하고, 모든 공백을 탭(\t)으로 대체하도록 요청했습니다. 이는 OpenAI의 이용 정책 분류기를 우회하기에 충분했습니다.내용 출력 (Echo the contents): 암호화된 컴팩션 항목은 여전히 이식 가능하므로, 해당 컴팩션 항목을
gpt-4.1및gpt-4o로 전송해 각각 입력 그대로 출력하도록 요청했고, 모델들은 이 요청을 그대로 수행했습니다. 이후 JSON을 디코딩하고 탭(\t)을 다시 공백으로 변환했습니다.
이 공격이 가능했던 이유는 OpenAI가 8월에 적용한 완화 조치가 추론 데이터를 다른 모델로 재전송하는 것만 차단한 반면, 컴팩션 호출은 추론을 생성한 동일한 모델 상에서 그대로 실행되기 때문입니다. 이 공격은 minimal부터 max까지, Xint 연구진이 테스트한 모든 reasoning effort 설정에서 예외 없이 성공했습니다. 공격 시연에 사용된 토큰 수는 아래와 같습니다.
단계 | 토큰 수 |
|---|---|
추론 항목 (Reasoning item) | 405 |
컴팩션 항목 (Compaction item) | 612 |
각각의 출력 결과 (Each echoed output) | 609 |
아래는 Stolen Thoughts 논문 부록 E.7에서 디코딩한 것과 동일한 문제인 Codeforces 1974C(소규모 무작위 예제)의 추론 트레이스 발췌본입니다:
We need solve. Need enumerate triples positions:
1 (4,4,4)
2 (4,4,3)
3 (4,3,3)
4 (3,3,4)
5 (3,4,1)
6 (4,1,3)
Pair differs exactly one coordinate = Hamming dist1. Compare.
T1 and T2 differ third only yes.
[...]
Beautiful: (1,2),(2,3),(2,6),(3,6) =4. Ensure pairs triples maybe codeforces beautiful triples definition exactly differs one? likely pair differs in exactly one position means other two equal. Answer 4. Need explain concise.트레이스 검증
렌더링 정확도를 검증하기 위해, 서로 다른 두 개의 모델에 각기 다른 프롬프트를 적용하여 컴팩션을 출력했고, 동일한 결과가 나오는 것을 확인했습니다. 이로써 출력 단계에서의 오류 가능성은 배제되었지만, 컴팩션 단계에서 추론 내용이 패러프레이징되었을 가능성은 여전히 남아 있습니다.
원본 평문(plaintext) 없이는 토큰 단위의 완전한 일치성을 입증할 수 없으며, 이는 Stolen Thoughts 저자들도 동일하게 겪은 한계점입니다. 그러나 컴팩션 항목은 JSON 구조와 탭 치환으로 인한 오버헤드를 감안하면 예상대로 원본 추론 항목보다 크기가 더 큽니다(612토큰 vs 405토큰). 출력된 트레이스는 시행착오와 자가 수정 흔적을 그대로 유지하고 있으며, 논문에서 동일한 문제를 두고 디코딩한 gpt-5.6-sol 트레이스 특유의 개조식에 가까운 간결한 문체와도 일치합니다.
취약점 발견 과정
GhostCompact 연구를 진행하는 과정에서, Xint 연구진은 컴팩션이 사실상 어떤 작업에든 쓸 수 있는 기능이며 단지 출력이 암호화된 블롭으로 나올 뿐이라는 사실을 알게 되었습니다. 또한 암호화된 컴팩션 항목이 여전히 이식 가능하다는 것도 이미 알고 있었습니다. Codex 같은 에이전트 하네스(agent harness)가 컴팩션 후에도 중요한 컨텍스트를 잃지 않고 모델을 전환할 수 있게 해주기 때문입니다. 그 연장선에서 Xint 연구진이 마주한 다음 질문은 '컴팩션 모델이 이전 추론 항목을 무손실 포맷으로 인코딩하도록 유도할 수 있는가'였습니다.
파급 효과
컴팩션 스머글링은 OpenAI 프런티어 모델의 대규모 증류를 가능하게 하며, 이는 결코 가상의 우려가 아닙니다. 지난 9월 초, NSA와 CISA, FBI는 미국 프런티어 모델들을 노린 "산업 규모의 증류 캠페인"에 대한 합동 보안 권고문을 발표했습니다. 며칠 뒤 Anthropic은 중국 기반 연구소에 의해 진행된 7건의 증류 캠페인을 보고했으며, 그중 여러 건은 CoT 전사본 탈취를 목표로 하고 있었습니다. 이어 9월 30일, OpenAI는 자사 모델의 비공개 추론 과정을 추출하려던 캠페인을 무력화했다고 공개했으며, 이 캠페인은 7월에 4,000개 이상의 계정에서 약 16,000건의 요청을 기록하며 정점을 찍었습니다.
시사점
복호화된 추론 데이터를 읽고 클라이언트로부터 지시사항을 수신하는 모든 서버 측 단계는 잠재적인 복호화 오라클(decryption oracle) 취약점이 될 수 있습니다. Stolen Thoughts 논문은 컴팩션을 자신들이 제안한 방어 체계에서 예외로 두어야 할 정상 기능으로 취급했습니다. 하지만 컴팩션 스머글링은 이 기능 역시 추론 데이터 자체와 동일한 수준의 보안 보호 조치가 필요함을 시사합니다.
💡
📩 최신 보안 인사이트 받아보기
Xint 팀이 분석한 취약점 연구와 최신 보안 인사이트를 이메일로 가장 먼저 받아보세요.
문의: contact@xint.io
웹사이트: xint.io