먼저 확인할 수 있는 한 줄입니다. 주소창이나 클라이언트의 자물쇠는 중계까지 TLS를 썼다는 뜻일 뿐, 중계가 프롬프트를 못 읽는다는 뜻이 아닙니다. 개발자 도구의 Network를 열고 요청 Host를 보세요. 모델 사업자 도메인인지, 다른 대행 호스트인지. 카나리아는 시험 트래픽에만 넣으십시오. 운영 SSH나 살아 있는 알리바바 클라우드 AccessKey로 실험하지 마십시오.
이번 주 논점은 「모델이 학습하느냐」가 아니라, 가운데 한 구간이다
2026년 9월 10일 전후, 보안 연구자 서우차오판(Chaofan Shou)은 소셜에 글을 올렸습니다. 중국의 대형 LLM API 중계에서 Fable 모델 호출 데이터 약 6TB를 샀고, 그 안의 SSH 키, VPN 설정, 알리바바 클라우드 키, GitLab 토큰이면 여러 중국 기업과 정부 관련 기관의 시스템에 닿을 수 있다고 주장했습니다. 이후 보안 매체는 같은 주장을 「중계 로그가 회색 시장에 흘렀다」로 적었습니다. 그 보도는 동시에 이렇게도 적습니다. 점명된 기업은 침해를 공개 확인하지 않았고, 독립 감사도 「데이터셋에 토큰이 보였다」를 「사내망이 장악됐다」와 같게 두지 않았습니다. 이 글은 그 소식을 고리로 씁니다. 트윗 스크린샷을 침입 판결로 다루지 않습니다.
앞선 「ChatGPT에 키를 붙이면」 글과 같은 질문이 아닙니다. 그 글은 소비자용 대화창을 봅니다. 대화 기록, 학습 스위치, 임시 채팅의 약 30일 안전 보관입니다. 이 글은 개발자가 실제로 더 자주 만나는 회색 인프라를 봅니다. 요청이 Claude나 GPT로 간 줄 알았는데, 먼저 본문을 풀고 인증 헤더를 고친 뒤 넘기는 라우터에 떨어집니다. 에이전트는 스스로 .env, 터미널 출력, 작업 공간 파일을 읽습니다. 키를 손으로 붙이지 않아도 프롬프트에 들어갈 수 있습니다.
SSH 개인 키, 클라우드 액세스 키, GitLab 개인 액세스 토큰, VPN 설정은 OWASP 로깅 치트시트가 보통 공유 기록에 평문으로 남기지 말라고 하는 묶음입니다. OWASP 대규모 언어 모델 애플리케이션 Top 10은 이미 민감 정보 유출과 공급망을 목록에 넣었습니다. 중계는 둘을 한꺼번에 밟습니다. 프롬프트가 다음에 저장되는 곳이고, 나와 모델 사업자 사이에 하나 더 생긴 공급자입니다.
자물쇠는 한 구간만 지킨다. 중계는 JSON 평문을 합법적으로 푼다
많은 사람이 「처음부터 끝까지 HTTPS」를 「길을 따라 아무도 못 읽는다」로 듣습니다. 응용 계층 프록시는 그렇게 일하지 않습니다. arXiv:2604.08407, Your Agent Is Mine: Measuring Malicious Intermediary Attacks on the LLM Supply Chain는 첫머리부터 이렇게 적습니다. 이런 라우터는 응용 계층 프록시로 동작하며, 비행 중인 JSON 페이로드마다 완전한 평문 접근권을 가진다. 어떤 사업자도 클라이언트와 상위 모델 사이에 암호학적 무결성 검사를 강제하지 않는다. 요청은 중계에서 먼저 복호화되고, 풀리고, 인증 헤더가 바뀐 뒤, 상위 쪽으로 두 번째 TLS가 열립니다. 암호화가 깨진 것이 아닙니다. 중계에서 한 번 합법적으로 끝난 것입니다.
그래서 모순처럼 보이는 현장이 생깁니다. IDE에서 중계까지는 TLS일 수 있고, 중계에서 Anthropic이나 OpenAI까지도 TLS일 수 있습니다. 그런데 가운데 그 기계는 이미 프롬프트, 도구 호출, 환경 변수, 돌아온 코드를 봤습니다. 메일의 STARTTLS를 종단 간 비밀로 듣는 것과 같은 종류의 오해입니다. 전송 암호화가 막는 것은 선로 위의 구경꾼입니다. 이미 들어온 저장 사본은 막지 못합니다. 메일은 적어도 보낸편지함에서 내가 쓴 그 통을 찾을 수 있습니다. 중계의 호출 로그는 보통 내가 열 수 있는 페이지가 아닙니다. 로컬 대화를 지워도, 상대 디스크에 이미 쓰인 한 줄은 지워지지 않습니다.
코딩 에이전트는 노출면을 넓힙니다. Claude Code, Cursor, 직접 만든 에이전트는 작업 공간을 훑고, 프로젝트 설정을 읽고, 터미널 출력을 가져갑니다. API Host를 감사되지 않은 제3자로 돌린 뒤, 스크립트를 고치거나 시험 호스트를 세우거나 비공개 저장소를 당길 때 나온 키가 주변 문맥과 함께 요청 본문에 탈 수 있습니다. 「키 보내기」를 누른 적이 없습니다. 에이전트에게 「왜 연결이 안 되는지 고치라」고 했을 뿐입니다.
| 위치 | 보통 남는 것 | 아직 읽을 수 있는 사람 |
|---|---|---|
| 중계 호출 로그 | 프롬프트, 도구 호출, 환경 변수의 평문 키 | 중계 운영자. 로그나 백업을 얻은 사람 |
| 재판매 / 미세 조정 데이터셋 | 마스킹하지 않은 과거 요청. 통째로 팔릴 수 있음 | 데이터 묶음을 산 사람. 이후 미러한 사람 |
| 상위 모델 사업자 | 중계가 넘긴 뒤의 같은 평문 | 그 사업자 자신의 보관·학습 정책 |
| 다시 쓰인 도구 호출 | 논문의 포이즌 페이로드. 로컬에서 조용히 실행될 수 있음 | 그 중계의 운영자와 이후 제어면 |
논문의 428개 노드: 유료도 주입하고, 카나리아는 자동으로 집어 간다
9월의 6TB 이야기 전에, 같은 연구 줄은 이미 인용할 수 있는 측정을 냈습니다. 저자들은 타오바오, 셴위, Shopify 상점에서 유료 라우터 28개를 사고, 공개 커뮤니티에서 무료 노드 400개를 모아 모두 428개를 봤습니다. 샌드박스 에이전트 트래픽에 추적 가능한 AWS 자격 증명과 미리 채워 둔 이더리움 개인 키를 넣고, 중계가 읽고 쓰는지 지켜봤습니다.
결과는 네 문장으로 충분합니다. 9개 노드가 악성 코드를 적극 주입했습니다. 유료 1개, 무료 8개입니다. 2개가 적응형 회피 트리거를 두었습니다. 17개가 연구자 소유의 AWS 카나리아 자격 증명을 건드렸습니다. 1개가 시험 지갑의 ETH를 옮겼습니다. 논문은 「좋아 보이는 노드」도 같은 면에 끌어들이는 포이즈닝 관찰을 두 줄 더 적습니다. 일부러 흘린 OpenAI 키와 설정이 약한 미끼가 이 라우터들에서 약 21억 토큰을 처리했고, Codex 세션 440건에서 자격 증명 99개가 노출됐으며, 그중 401건은 이미 사람 확인이 없는 YOLO 모드로 돌아가고 있었습니다. 클라이언트는 중계가 돌려준 도구 호출을 거의 검증하지 않습니다. 저자들은 공개 에이전트 프레임워크 네 개를 상대로 연구용 프록시 Mine을 만들어, 다시 쓴 페이로드를 보여 줬습니다.
그 숫자가 「지금 쓰는 그 한 곳」이 9개나 17개 안에 있다고 증명하지는 않습니다. 증명하는 것은 메커니즘입니다. 중계는 평문을 봅니다. 일부는 응답을 고칩니다. 일부는 자격 증명을 스스로 집어 갑니다. 가격표는 종단 간 약속이 아닙니다. 「더 비싼 대행」으로 바꿔도 대조할 것은 여전히 Host, 로그 정책, 실제 키를 넣었는지입니다. 청구서가 아닙니다.
호출 로그가 상품이 되면, 로컬 대화를 지워도 되돌리지 못한다
9월 소식이 거슬리는 지점은, 또 하나의 대화창이 학습할 수 있다는 것이 아닙니다. 호출 이력을 팔리는 데이터셋으로 다뤘다는 점입니다. 공개 서술은 마스킹하지 않은 요청 기록에 GitLab 토큰, 호스트 SSH 키, VPN 설정, 퍼블릭 클라우드의 높은 권한 키가 있었다고 합니다. 산 사람은 먼저 화웨이나 샤오미 사내망을 뚫을 필요가 없습니다. 토큰이 아직 살아 있으면, 유효한 자격 증명으로의 로그인은 회사 로그에서 평범한 운영처럼 보입니다. 「살아 있는 계정」에 「공급망에 구간이 하나 더 생긴 것」입니다. TLS를 깨는 일이 아닙니다.
그래서 「IDE 대화는 이미 지웠다」는, 이미 팔린 묶음을 되찾지 못합니다. 중계의 보관 시계는 상대 것입니다. 전역 로그, 오브젝트 스토리지, 미세 조정 시장에 팔린 사본은 내 삭제 버튼을 공유하지 않습니다. 소비자용 ChatGPT는 적어도 학습 스위치와 임시 채팅을 도움말에 씁니다. 회색 대행은 대등한 데이터 정책을 보통 주지 않습니다. 이 기기에서 확인할 때 그 6TB를 내려받지 말고, 스크린샷의 토큰을 전달하지 마십시오. 이미 중계를 지난 실제 키는 발급처에서 먼저 폐기하십시오. 채널을 바꾸는 일은 그다음입니다.
상위 모델 사업자는 또 하나의 사본입니다. 중계가 넘기는 데 성공하면 Anthropic이나 OpenAI는 그 평문을 자기 API 보관 규칙으로 다룹니다. 소비자 제품 하나에서 「모델 개선」을 꺼도, 한 번도 로그인하지 않은 대행 계정에는 닿지 않고, 이미 팔린 과거 묶음에도 닿지 않습니다. 두 철을 나누어 두십시오. 사업자 정책이 한 권이고, 중계 로그가 다른 한 권입니다.
운영 SSH, 알리바바 클라우드 AccessKey 쌍, GitLab glpat- 토큰, 마스킹하지 않은 연결 문자열로 실험하지 마십시오. 그 6TB 묶음을 사거나, 받거나, 전달하지 마십시오. canary-relay-2026-do-not-reuse처럼 버릴 수 있는 카나리아를 준비하십시오. 확인할 것은 Network의 Host와 본문에 이 문자열이 있는지입니다. 사내 열쇠를 다시 퍼뜨리는 일이 아닙니다. 이미 중계에 들어간 실제 키는 폐기하십시오.
바로 확인하기: Host를 보고, 카나리아는 시험 요청에만 넣는다
「우리는 전달만 한다」는 구호는 스스로를 증명하지 못합니다. 한자리에서 볼 수 있는 것은 셋입니다. 이 요청의 Host가 모델 사업자 자신의 도메인인지, 본문에 나가면 안 되는 키가 아직 있는지, 에이전트가 돌아온 도구 호출을 확인 없이 실행하는지. 이 단계는 「이번 호출에서 평문을 받은 쪽」만 증명합니다. 어떤 중계가 로그를 팔았는지는 증명하지 않습니다. 그쪽은 감사할 수 있는 보관 설명을 내놓는지, 그리고 내가 아직 실제 키를 넣고 있는지로만 대조할 수 있습니다.
시험 프로젝트에서 API Base URL을 실제로 쓰는 그 주소로 두십시오. 개발자 도구나 로컬 프록시의 요청 목록을 열고, 카나리아만 들어 있는 프롬프트를 보내십시오. 예를 들어 「canary-relay-2026-do-not-reuse만 되풀이하고 다른 일은 하지 마」. 요청 줄을 봅니다. Host가 api.anthropic.com, api.openai.com, 또는 회사가 만들고 계약에 적은 게이트웨이면, 이 구간의 상대는 사업자이거나 우리 기계입니다. 이름 없는 대행 도메인, 날 IP, 중계 경로의 연쇄이면 평문은 이미 가운데에 떨어졌습니다. 이어서 본문을 엽니다. 카나리아가 JSON에 평문으로 나와야 합니다. 로그를 남기는 중계가 적는 문자열이 바로 그것입니다.
실제 .env를 에이전트에게 넘겨 「어느 줄이 틀렸는지 보라」 하지 마십시오. 먼저 이 기기에서 비밀번호와 개인 키를 카나리아로 바꾸거나, 파일 전체를 로컬에서 암호문으로 만든 뒤 브라우저를 떠날지 결정하십시오. 실제 키를 모델이 아니라 동료에게 줘야 하면 일회용 링크로 바꿉니다. 키는 URL의 # 프래그먼트에 남고, 서버는 암호문만 잠시 둡니다. 해시까지 포함한 전체 링크를 다시 중계 대화창에 붙이면, 그 층은 사라집니다.
- 시험 프로젝트에서
canary-relay-2026-do-not-reuse처럼 카나리아만 들어 있는 프롬프트를 보냅니다. 실제 키는 쓰지 않습니다. - Network나 로컬 프록시를 열고 요청
Host를 대조합니다. 모델 사업자 도메인인지, 중계 호스트인지. - 본문을 열어 카나리아가 JSON 평문으로 나오는지 확인합니다. 로그를 남기는 중계가 저장할 수 있는 내용입니다.
- 운영 키는 먼저 폐기하고 새로 발급합니다. 프롬프트가 나가기 전에 이 기기에서 가립니다. 사람이 실제 값을 받아야 하면 일회용 링크로 보내고, 중계로는 보내지 않습니다.
증명의 범위는 좁습니다. 이번 한 번에서 평문이 요청 본문으로, 내가 본 그 Host를 향해 나갔습니다. 확장 프로그램이 따로 저장하지 않았다는 증명이 아니고, 6TB 묶음에 내 저장소 주소가 들어 있다는 증명도 아닙니다. 중계나 에이전트를 바꾼 뒤에는 새 Base URL을 상대로 카나리아를 다시 돌릴 가치가 있습니다.
열자마자 쓰는 이 기기 마스킹으로, 실제 키는 탭 안에 둔다
「키가 중계 요청에 들어가지 않게」를 반복할 수 있는 동작으로 만들려면, MakePwd의 개인정보 마스킹부터 넣으십시오. 열자마자 쓰며, 가입과 계정이 없습니다. 규칙 기반 마스킹은 현재 탭에서 텍스트를 다룹니다. 원문을 올리지 않고, 마스킹을 기다리는 본문을 analytics에 쓰지도 않습니다. 에이전트에게 넘기려던 오류 덤프, 설정 조각, 터미널 붙여넣기를 먼저 가린 뒤, 그 요청이 아직 중계를 지나야 하는지 결정하십시오. 마스킹은 익명화가 아닙니다. 놓친 이름, 읽어 준 숫자, 직접 만든 토큰 형태는 사람이 한 번 더 봐야 합니다. 필드 단위의 한계는 티켓이나 채팅 기록을 밖으로 보내기 전에, 규칙 기반 마스킹이 가릴 수 있는 것과 가릴 수 없는 것에 있습니다.
전체 .env나 키 파일을 「드라이브에 올리고 모델이 읽게」로 되돌리지 마십시오. 파일 암호화는 현재 탭에서 AES-256-GCM으로 .lock / .enc를 만듭니다. 단일 파일은 5 GB까지입니다. 암호문은 드라이브로 가도 되고, 암호 문구는 다른 채널로 가야 합니다. 동료가 실제 암호 문구를 받아야 하면 일회용 링크를 씁니다. 브라우저는 Web Crypto로 AES-256-GCM을 쓰고, 밖으로 나가는 칸은 암호문, 기한, 남은 읽기 횟수입니다. 페이지는 키를 s.html?id={번호}#{키}의 프래그먼트에 붙입니다. RFC 9110에서 요청 줄에는 해시 뒤가 들어가면 안 됩니다. 이미 중계를 지난 로그인 비밀번호는 먼저 폐기한 뒤, 비밀번호 생성기로 이 기기에서 6–128자 새 문자열을 만듭니다. 기본은 16자이고, 8자 미만은 약하다고 표시됩니다. 어느 단계도 로그인을 요구하지 않습니다.
소비자용 대화창이 세션을 어떻게 두고 어떻게 학습하는지는 여전히 그 사업자 도움말입니다. 비밀번호나 API 키를 ChatGPT에 붙이면, 이 대화와 학습 쪽에 남는 것을 보십시오. 두 글을 섞지 마십시오. ChatGPT 글은 공식 대화창에 남는 것을 답하고, 이 글은 중계 구간에 남는 것을 답합니다. 공식 창에서 학습을 꺼도, 중계가 이미 판 로그는 되팔리지 않습니다.
자주 묻는 질문
요청이 HTTPS면 중계도 평문을 못 읽습니까?
아닙니다. 논문은 LLM API 라우터가 응용 계층 프록시로 동작하며, 비행 중인 JSON 페이로드마다 완전한 평문 접근권을 가진다고 적습니다. 클라이언트에서 중계까지가 TLS 한 구간이고, 중계에서 상위 모델까지가 다른 한 구간입니다. 중계 디스크에서 키는 기본적으로 읽을 수 있는 본문입니다. 「Anthropic만 본다」가 아닙니다.
유료 중계면 종단 간으로 안전합니까?
아닙니다. 유료는 종단 간이 아닙니다. 논문은 타오바오, 셴위, Shopify 상점에서 유료 라우터 28개를 사고, 공개 커뮤니티에서 무료 노드 400개를 모아 모두 428개를 봤습니다. 9개가 악성 코드를 적극 주입했고, 그중 유료 노드가 들어 있습니다. 17개가 연구자 소유의 AWS 카나리아 자격 증명을 건드렸습니다. 1개가 시험 지갑의 ETH를 옮겼습니다.
9월의 6TB 데이터가 화웨이나 샤오미 침해를 증명합니까?
아닙니다. 공개된 서술은 연구자가 약 6TB 호출 데이터를 샀다고 했고, 그 안의 SSH·VPN·클라우드·GitLab 토큰이면 일부 기업과 기관에 닿을 수 있다고 주장한 것입니다. 글을 쓰는 시점까지 점명된 기업은 침해를 공개 확인하지 않았습니다. 이 글은 「중계가 평문을 보고 재판매할 수 있다」만 확인할 수 있는 범위로 둡니다. 점명을 입증된 침입으로 다루지 않습니다.
모델이 키가 들어 있는 설정을 봐야 할 때는 어떻게 합니까?
먼저 이 기기에서 비밀번호, 토큰, 개인 키를 카나리아로 가린 뒤, 그 요청의 Host가 모델 사업자 자신의 도메인인지 확인하십시오. 실제 키는 중계에도, 소비자용 대화창에도 넣지 마십시오. 사람에게 실제 값을 줘야 하면 일회용 링크로 한 번 보내고, 키는 URL의 # 프래그먼트에 둡니다. 만들기와 읽기 모두 열자마자 씁니다.
API Host를 다시 바꾸기 전에 기억할 세 가지
첫째, 중계는 평문을 합법적으로 풉니다. 클라이언트에서 대행까지가 TLS 한 구간이고, 대행에서 모델까지가 다른 한 구간입니다. 프롬프트, 도구 호출, .env의 키는 가운데 그 기계에서 기본적으로 읽을 수 있습니다. 둘째, 9월의 6TB 이야기는 호출 로그가 통째로 팔릴 수 있다는 이야기입니다. 논문의 428개 노드는 유료도 주입하고, 카나리아가 집어 가진다는 것을 보여 줍니다. 셋째, 한자리에서는 Host와 본문만 대조하십시오. 카나리아가 나갈 수 있으면 실제 키도 나갈 수 있습니다. 이미 중계를 지난 비밀번호는 먼저 폐기하고, 프롬프트가 나가기 전에 이 기기에서 가리십시오.
소비자용 대화창에 키를 붙인 뒤 남는 것을 이어서 보려면 비밀번호나 API 키를 ChatGPT에 붙이면, 이 대화와 학습 쪽에 남는 것을 읽으십시오. 해시 뒤의 키가 HTTP에 들어가는지를 대조하려면 URL의 # 뒤에 키를 두기 좋은 이유, 그리고 이 보호가 깨지는 순간을 읽으십시오. 이 글이 결론에 적을 수 있는 선은 「키가 LLM API 중계에 들어간 뒤 아직 무엇이 남을 수 있는가」뿐입니다.