독점 LLM API에서 추론 트레이스(reasoning trace) 빼내기
Stealing Reasoning Traces from Proprietary LLM APIs
TL;DR Highlight
암호화된 추론 블록을 약한 모델에 재생해 강한 모델의 추론 원문을 복원했다
Who Should Read
에이전트 로그나 트레이스를 GitHub·Hugging Face에 올리거나 저장하는 LLM API 백엔드 개발자
Core Mechanics
- 암호화 추론 블록은 다른 모델에서 재생된다
- Anthropic, OpenAI, Google이 클라이언트에 돌려주는 암호화 chain-of-thought 블록은 세션·사용자·모델을 넘어 재생할 수 있다.
- 이 블록은 서버로 다시 보내는 값이라 클라이언트가 그대로 들고 있다.
- 약한 모델을 탈옥해 원문을 받아냈다
- 강한 모델이 만든 블록을 같은 제공사의 약한 모델에 넣고 탈옥했다.
- 강한 모델을 직접 공격하지 않아서 증류 방지 장치도 건드리지 않았다.
- API 두 번 호출로 끝난다
- 첫 호출에서 강한 모델(claude-opus-4-8)의 thinking 블록과 signature를 받는다.
- 둘째 호출에서 claude-haiku-4-5에 그 블록을 넣고 "추론을 그대로 옮겨 적어라"고 시킨다.
- 복원 분량이 API 토큰 수와 비슷하다
- Codeforces 문제 120개에서 복원한 추론의 토큰 수가 API가 알려준 숨은 thinking 토큰 수와 가깝게 따라갔다.
- 공개된 에이전트 로그에서 비밀이 나왔다
- GitHub·Hugging Face의 에이전트 트레이스 6,708개에서 추론 블록 315,320개를 복원했다.
- 실제 사용자 세션만 보면 고유 개인정보 704개가 나왔고 API 키 62개, 비밀번호 33개, 액세스 토큰 24개, 개인 이메일 30개가 포함됐다.
- 화면엔 없고 추론에만 있는 비밀도 있다
- 704개 중 64개는 보이는 세션 어디에도 없고 추론 블록 안에만 있었다.
- 완화책 후에도 추출이 됐다
- 책임 있는 공개 두 달 뒤 점검에서도 서드파티 API 제공사를 통해 Astra/Sol-6.1의 추론 원문을 뽑을 수 있었다.
Community Reactions
- 암호화 키 재사용에 놀랐다는 반응
- 제공사들이 모델 간에 같은 암호화 키를 쓰는 것 같아 놀랍다는 의견이 있었다.
- Codex compaction도 풀렸다는 경험
- Codex의 암호화된 compaction 데이터를 두 문장짜리 developer 프롬프트를 앞뒤에 자동 삽입해서 평문으로 출력시켰다는 경험이 있었다.
- 더 약한 모델로 내릴 필요도 없었다고 한다.
- thinking 끄고 도구로 우회한다는 의견
- thinking을 끄고 deep_think 도구를 주면 모델이 내부 CoT 형식으로 호출한다는 트윗이 공유됐다.
- 서버 쪽 저장으로 바뀔 거라는 전망
- 제공사가 암호화로 클라이언트에 상태를 맡기는 대신 서버에 저장하게 될 것이라는 의견이 있었다.
- '훔쳤다'는 표현에 반론
- 이미 비용을 낸 토큰을 못 보게 막은 쪽이 문제이니 "복원"이 맞는 말이라는 의견이 있었다.
- 로그프롭 사례처럼 사용자만 불편해진다는 지적
- 로그프롭이 증류를 쉽게 한다는 논문 이후 제공사가 전체 logprobs 제공을 중단하고 상위 10개만 남겼다고 한다.
- 이번에도 사용자 기능이 막힐 거라는 우려가 나왔다.
How to Apply
- 저장된 에이전트 로그에서 비밀 스캔하기
- 오늘 30분 안에 GitHub·HF에 올렸거나 저장 중인 트레이스를 grep으로 훑어라.
- 패턴은 AKIA, ghp_, hf_, sk-, password 등을 넣어라.
- 추론 블록이 암호화돼 있어도 비밀이 들어 있다고 보고 같이 검사해라.
- 추론 블록을 공개 전에 제거하기
- 트레이스를 공유·업로드하기 전에 thinking, encrypted_content, signature 필드를 지워라.
- 공개용 로그는 별도 변환 단계를 두고 그 필드를 빼라.
- 에이전트에 비밀을 직접 보여주지 않기
- 키·토큰은 환경변수나 시크릿 매니저로 주입하고 프롬프트와 도구 출력에는 넣지 마라.
- 모델이 .env를 cat하지 않게 도구 권한을 막아라.
- 서드파티 API 경유 시 로그 보관 기간 정하기
- 라우터나 프록시를 쓰면 암호화 블록이 거기에 남는지 확인해라.
- 보관 기간을 짧게 정하고 접근 권한을 제한해라.
Try It
# Claude나 ChatGPT에 붙여넣기 (원문 점검 방법의 간이 버전: 로그 비밀 스캔)
너는 보안 점검 도우미다. 아래는 우리 에이전트가 남긴 트레이스 로그다. 추론(thinking) 블록도 사람이 읽을 수 있다고 가정하고 같은 기준으로 검사해라.
{{에이전트 트레이스 로그}}
다음 항목을 찾아 표로 정리해라: API 키, 비밀번호, 액세스 토큰, 개인 이메일, 내부 URL.
각 항목마다 위치(어느 턴, 어느 필드), 값의 앞 4글자만, 보이는 출력에도 있는지 여부를 써라.
이어서 해 볼 것: 이 로그를 공개 저장소에 올려도 되는지 판단하고, 지워야 할 필드 목록을 알려줘.Terminology
관련 논문
모델이 그렇게 좋다면 OpenAI는 왜 회사 100개를 직접 안 차릴까
HN 댓글 답: 코드는 쉬워도 뭘 만들지 아는 건 별개라 토큰을 판다
OpenShell: 자율 AI 에이전트를 가두는 NVIDIA의 안전한 샌드박스 런타임
정책 파일로 에이전트의 파일·네트워크·자격증명 접근을 커널 수준에서 통제한다
Omnara: Claude Managed Agents의 오픈소스 대안 (셀프호스팅 가능)
어떤 모델·머신에서도 에이전트를 돌리는 오픈소스 managed agent 플랫폼
Rust off Rails: 코드 없이 Markdown 60개로 만든 AI 에이전트용 웹 스택
Markdown 규칙 60개로 에이전트가 Rust 웹앱을 짜게 한다는 프레임워크
LayerFS: AI 코딩 에이전트를 위한 파일시스템
에이전트마다 임시 Workspace를 마운트하고 결과만 커밋하는 파일시스템
Launch HN: Alter (YC S25) – 멀티유저 에이전트용 접근 제어
에이전트마다 별도 신원·정책·감사로 API 키 공유 문제를 푼다
Claude로 코드의 공격 표면(attack surface) 줄이기
Claude로 25개 오픈소스를 분석해 불필요하게 열린 코드 493건을 찾았다
WhatsApp 도움말 페이지에 숨겨진 LLM 지시문: 규제기관을 추천하지 말라
WhatsApp 도움말에 화면엔 안 보이는 AI 지시문 102개가 숨어 있었다