프라이버시 실무 ·

SSH 비밀키를 Agent 프롬프트에 넣은 뒤, LLM 중계가 호출 로그를 왜 그대로 팔 수 있나

2026년 9월 11일 전후, 보안 연구자 Chaofan Shou는 중국의 대형 LLM 중계에서 약 6TB의 마스킹되지 않은 Fable 모델 호출 데이터를 샀다고 밝혔습니다. 그 안에는 SSH 비밀키, VPN 설정, 알리바바 클라우드 키, GitLab 토큰이 있었고, 여러 기업과 연구기관 내부 시스템에 닿을 수 있다고 주장했습니다. 이 글은 그 중계의 실명을 재판하지 않습니다. 그 자리에서 대조할 수 있는 한 층만 엽니다. 전달하려면 본문을 읽어야 하는 홉을 지나면, Agent 프롬프트에 들어간 키는 이미 평문으로 남아 있습니다. URL 클리너일회용 링크 만들기 폼의 조작 안내가 아닙니다.

중계가 봐야 하는 평문 대조 그 자리에서 확인 가능 가입 없이 바로 사용
00 / 목차

먼저 프롬프트가 지난 을 가르세요

이 글은 「SSH 비밀키와 클라우드 키를 Agent 프롬프트에 넣은 뒤, LLM 중계가 호출 기록을 왜 그대로 팔 수 있는가」만 답합니다. 민감정보 마스킹의 폼 설명도 아니고, 특정 모델 업체의 전체 개인정보 처리방침도 아닙니다.

01 / 경로

프롬프트가 중계를 지날 때 일어나는

「모델 업체가 대화를 학습에 쓰는가」가 아닙니다. 먼저 물을 것은, 이 홉에 본문을 봐야만 하는 중간자가 있는가입니다.

LLM 중계는 OpenAI 호환 프록시, API 라우터, 모델 게이트웨이로도 팝니다. 편집기와 업스트림 모델 사이에 앉습니다. 팀이 중계를 쓰는 이유는 보통 세 가지입니다. 지역 제한을 우회하거나, 계정을 나눠 쓰거나, 토큰을 싸게 사는 것입니다. 요청이 도착하면 중계는 호출 한도를 확인하고, 자기 업스트림 키로 갈아끼운 뒤, 같은 프롬프트를 Claude나 다른 모델로 보냅니다. 이 세 단계를 끝내려면 HTTPS를 자기 홉에서 종료하고, JSON의 messages나 Agent 컨텍스트를 읽어야 합니다. 9월 11일 중국 보안 매체 SecRSS는 종단 간 암호화가 없는 애플리케이션 계층 프록시를 「본질적으로 패킷 캡처 도구」라고 썼습니다. SecRSS의 AI 중계 데이터 암시장 실측을 보세요. 같은 날 ChainCatcher 영문 보도와 Wccftech 요약도 요청과 응답이 모두 중계를 지나므로 평문 전체가 보인다고 적었습니다. ChainCatcher의 해당 기사가 같은 사실을 더 짧게 적습니다.

코딩 Agent는 이 홉을 더 위험하게 만듭니다. Cursor, Claude Code, 자체 제작 에이전트는 당신이 준 권한으로 작업 공간을 읽고, .env를 훑고, 터미널 출력을 집어 다음 프롬프트에 이어 붙입니다. -----BEGIN OPENSSH PRIVATE KEY-----를 대화창에 직접 붙이지 않아도 됩니다. 「스테이징 서버에 붙어 달라」고 해서 Agent가 비밀키나 배포 스크립트를 읽었다면, 그 바이트는 이미 중계로 나갈 본문에 있습니다. Shou 팀의 이전 논문 Your Agent Is Mine: Measuring Malicious Intermediary Attacks on the LLM Supply Chain은 라우터 428개를 시험했습니다. 9개는 응답을 바꿨고, 17개는 연구자가 심어 둔 AWS 테스트 키를 보고 실제로 AWS를 호출했으며, 1개는 테스트 지갑의 ETH를 옮겼습니다. 그것은 「중계가 일부러 공격하는가」라는 다른 증거입니다. 이 글이 대조하는 것은 더 흔한 한 줄입니다. 전역 로그만 켜져 있어도, 악의가 없어도, 당신이 넣은 키는 남습니다.

웹 채팅에 문의 원문을 붙이는 길과도 다릅니다. 웹 모델에 붙일 때는 적어도 붙여넣기 키를 본인이 누릅니다. Agent가 중계를 지날 때 컨텍스트는 도구가 자동으로 모읍니다. 이 기기에서 확인할 것은 「내가 키를 직접 붙였는가」가 아닙니다. 「이 홉에 본문을 봐야 하는 중계가 있는가, 그리고 그 본문에 지금 바로 쓸 수 있는 자격 증명이 있는가」입니다.

먼저 이 한 줄

중계가 호출 기록을 팔 수 있는 이유는 업스트림 모델을 깨서가 아닙니다. 전달하려면 평문을 봐야 하기 때문입니다. HTTPS가 지키는 것은 당신에서 중계까지, 중계에서 업스트림까지의 선로입니다. 중계 프로세스 안에서 이미 풀린 사본은 지키지 않습니다.

02 / 로그

호출 로그가 그대로 팔리는 이유

「그대로」는 요청 본문이 아직 있다는 뜻입니다. 「어떤 사용자가 한 번 호출했다」는 횟수만 남는 것이 아닙니다.

중계가 장애를 재현하고, 과금하고, 미세 조정 말뭉치를 모으는 가장 싼 방법은 푼 뒤의 요청을 데이터베이스에 통째로 쓰는 것입니다. 프롬프트, 시스템 지시, Agent가 읽은 파일 조각, 도구 반환값이 텍스트 필드로 남습니다. 6TB 호출 데이터를 판다는 것은 이미 풀린 이 이력을 판다는 뜻입니다. 연구자는 그 안에 사내망에 바로 붙을 수 있는 SSH 비밀키와 glpat- 토큰이 있다고 했고, 공개 보도는 마스킹한 기업 GitLab 주소를 보여 주었습니다. UsePwd는 그 데이터를 사지 않았고, 「어느 회사를 장악하기에 충분하다」를 검증된 결론으로 쓰지 않습니다. 그 자리에서 대조할 수 있는 것은 메커니즘입니다. 로그가 요청 본문을 저장하는 한, 들어간 키는 스스로 별표가 되지 않습니다.

주소창의 자물쇠와 「학습에 쓰지 않는다」는 업체 문구는 이 층을 막지 못합니다. 브라우저나 편집기가 중계로 요청을 보낼 때, TLS는 그 홉에서 끝납니다. 중계는 자기 업스트림 계정으로 새 TLS를 엽니다. 두 선로는 각각 암호화됩니다. 가운데 기계의 프로세스가 보는 것은 여전히 평문 JSON입니다. 업스트림 모델이 대화를 학습에 쓰지 않기로 했어도, 중계가 남겨 둔 사본은 보지 못합니다. 사본이 있는지, 파는지, 는 중계의 저장 정책입니다. 편집기에서 「임시 대화」를 켰는지는 결정하지 않습니다.

과금 로그와 호출 본문도 같은 파일이 아닙니다. 토큰 수, 모델 이름, 상태 코드만 있으면 SSH 비밀키를 팔 수 없습니다. 운영이 「실패한 Agent 단계를 재현하려고」 완전한 messages를 남기는 순간, 그 파일은 장애 재현 가치와 암시장 가치를 동시에 갖습니다. Shou의 폭로가 기술 커뮤니티에서 퍼진 이유는 구매자가 요약을 산 것이 아니라, 아직 쓸 수 있는 자격 증명을 샀기 때문입니다. 물을 질문은 「중계에 로그가 있는가」가 아닙니다. 「로그에 프롬프트 본문이 있는가」입니다.

당신에서 중계까지의 HTTPS
선로는 암호화됩니다

길 위의 사람은 본문을 보지 못합니다. 지키는 것은 전송이지, 중계 프로세스 안에서 이미 풀린 사본이 아닙니다.

중계 프로세스
평문을 봐야 합니다

인증 헤더를 바꾸고, 과금하고, 업스트림으로 보내려면 프롬프트와 첨부 조각을 읽어야 합니다.

팔리는 데이터 묶음
대개 푼 뒤의 본문입니다

6TB가 비싼 이유는 호출 횟수가 아니라, 요청 이력이 그대로이기 때문입니다.

공식 모델 API에 직접 붙으면 「본문을 봐야 하는 중간자」 한 홉은 빠집니다. 그렇다고 프롬프트가 이 기기에만 남는 것은 아닙니다. 업체 서버도 평문을 받습니다. 구매자가 「회색 중계」에서 「당신이 고른 회사」로 바뀔 뿐입니다. 이 글이 중계에 머무는 이유는, 9월 폭로가 「본문이 통째로 팔렸다」를 가정에서 진행 중인 사건으로 바꿨기 때문입니다. 공식 인터페이스로 바꾼 뒤에도, 키가 프롬프트에 들어가야 하는가의 답은 같습니다. 들어가면 안 됩니다.

03 / 마스크

형식 마스킹이 가리는 키의 종류

별표는 「흔한 토큰이 통째로 복사될 확률」을 낮춥니다. 짧은 접두사가 없는 비밀키 블록은 가리지 못합니다.

UsePwd의 민감정보 마스킹은 현재 탭에서 여섯 종류를 형식에 따라 인식합니다. 전화, 신분증 번호, 카드 번호, 이메일, 흔한 토큰, IP입니다. 토큰 종류가 대조하는 접두사는 sk-, sk-ant-, sk-proj-, AKIA, ghp_, github_pat_, glpat-, xoxb-, Bearer 입니다. 가입 없이 바로 쓰고, 원문은 업로드되지 않으며 analytics에도 쓰지 않습니다. glpat-가 들어 있는 테스트 문장을 붙이면, 페이지는 접두사를 남기고 가운데를 가리며 뒤 네 자리를 보여 주거나, 전체 마스킹에서는 접두사와 별표만 남깁니다. 이 한 걸음이면 「흔한 클라우드·코드 호스팅 토큰은 형식 규칙이 잡을 수 있다」를 이 기기에서 증명할 수 있습니다.

SSH 비밀키는 대개 그런 접두사가 아닙니다. OpenSSH 비밀키는 -----BEGIN OPENSSH PRIVATE KEY-----로 시작하는 PEM 블록이고, 가운데는 Base64이며, 끝에 대응하는 END 줄이 있습니다. VPN 설정, kubeconfig, 데이터베이스 접속 문자열, AKIA처럼 규칙이 알아보는 모양이 아닌 알리바바 클라우드 AccessKey도 형식 마스킹이 잡지 못합니다. 문의에 휴대전화 별표를 치는 일은, Agent가 id_ed25519를 컨텍스트에 읽은 일을 해결하지 않습니다. 문의 원문을 대화형 AI에 붙이기 전에 형식 마스킹이 같은 고객을 다시 가리키는 이유는 문의 원문을 대화형 AI에 붙이기 전에, 형식 마스킹이 왜 같은 고객을 다시 가리키나를 보세요. 그 글은 신원 층이 남는 이야기입니다. 이 글은 로그인 재료가 남는 이야기이며, 중계 로그의 자격 증명은 대개 바로 쓸 수 있습니다.

토큰이 glpat-***wQ4x로 가려져도, 뒤 네 자리와 저장소 주소를 합치면 프로젝트를 좁힐 수 있습니다. 전체 마스킹은 뒤 네 자리를 지웁니다. 그래도 「이 대화가 어느 머신, 어느 클러스터를 말하는지」는 지우지 못합니다. 실제로 한 층을 덜어내는 방법은, 비밀키와 클라우드 키를 프롬프트에 넣지 않는 것입니다. 배포 설명은 「키는 다른 일회용 링크로 간다」로 쓰고, Agent는 단계만 보고 재료는 보지 못하게 합니다. 암호를 동료에게 넘겨야 하면 일회용 링크를 쓰세요. 현재 탭에서 AES-256-GCM으로 암호화하고, 평문 상한은 32 KB이며, 키는 s.html?id={id}#{key}# 뒤에 붙고, 서버는 암호문만 잠시 보관합니다. 만들기와 읽기 모두 가입 없이 바로 사용합니다.

흔한 토큰 접두사
형식 마스킹이 대개 가립니다

sk-, glpat-, ghp_, AKIA는 규칙으로 인식합니다. 뒤 네 자리는 범위를 좁힐 수 있습니다.

PEM 비밀키 / VPN
대개 가리지 못합니다

그런 짧은 접두사가 없습니다. Base64 블록 전체가 프롬프트에 들어가면, 중계 로그에도 블록 전체가 있습니다.

일회용 링크
키가 프롬프트에 들어가지 않습니다

프롬프트에는 단계만 씁니다. 재료는 일회용 링크로 가고, 서버에는 암호문, 키는 # 뒤에만 있습니다.

04 / 층

문의 마스킹·채팅으로 키 보내기와 다른 점

세 일 모두 「평문이 눈앞에서 떠난다」와 닿아 있습니다. 남는 사본의 종류는 같지 않습니다.

문의를 대화형 AI에 붙이면, 첫 위험은 「아직 한 사람을 가리키는가」입니다. 휴대전화에 별표를 쳐도 이름, 주소, 접수번호는 남습니다. 중계가 Agent 호출 기록을 팔면, 첫 위험은 「남의 시스템에 아직 로그인되는가」입니다. GitLab 토큰, SSH 비밀키, 클라우드 키 자체가 로그인 재료입니다. 둘을 「AI에 붙였다」로 합치면 처리 순서가 빠집니다. 문의는 먼저 신원 층이 남았는지를 묻고, 키는 먼저 본문에 바로 쓸 수 있는 자격 증명이 있는지, 이 홉에 본문을 봐야 하는 중계가 있는지를 묻습니다.

클라우드 환경변수가 유출된 뒤, 새 키를 채팅창에 다시 보내면 안 되는 이유는 클라우드 환경변수가 유출된 뒤, 새 키를 채팅창에 다시 보내면 안 되는 이유를 보세요. 그 글은 교체 뒤의 두 번째 유출입니다. 슬랙, 카카오톡, 티켓, 스크린샷이 검색되는 평문 사본을 남깁니다. 이 글은 첫 번째 바퀴가 모델 호출 경로에서 일어날 수 있다는 이야기입니다. 키를 「동료에게 보낸」 적도 없습니다. Agent에게 작업 공간을 맡기고 배포를 끝냈을 뿐입니다. 채팅 기록과 중계 로그는 같은 아카이브가 아닙니다. 처리는 같습니다. 새 키를 본문을 남기는 통로에 다시 넣지 마세요.

URL의 # 프래그먼트는 HTTP 요청에 들어가지 않습니다. URL의 # 프래그먼트가 서버 로그에 나타나지 않는 이유를 보세요. 일회용 링크가 복호화 키를 프래그먼트에 두는 이유는, 암호문을 잠시 보관하는 서버가 키를 보지 못하게 하기 위해서입니다. 중계는 반대입니다. 본업이 본문을 읽는 일입니다. 「일회용 링크 서버가 키를 못 본다」를 「아무 중간자나 프롬프트를 못 본다」로 읽지 마세요. 두 경로의 가시 범위는 다릅니다. 네트워크 패널에서 그 자리에서 대조할 수 있습니다.

반대로 읽지 마세요

UsePwd는 남의 중계 로그를 끌 수 없고, 당신이 이미 허용한 작업 공간을 Agent가 읽는 일도 막지 못합니다. 대조할 수 있는 것은, 흔한 토큰이 이 기기에서 가려지는지, 키를 암호문만 잠시 보관하는 일회용 링크로 옮길 수 있는지입니다. 이 글을 「이 사이트를 쓰면 중계가 로그를 못 판다」로 읽지 마세요.

05 / 대조

가린 것과 남긴 것을 그 자리에서 대조하는 법

목표는 「모든 중계가 6TB를 판다」를 증명하는 것이 아닙니다. 지금 쓰는 브라우저에서, 어떤 문자열이 가려지고 어떤 문자열이 그대로 남는지 증명하는 것입니다.

  1. 01
    실제 시스템에 쓰지 않을 테스트 문장 두 개를 준비하세요

    사용 중인 비밀키, 클라우드 키, GitLab 토큰을 넣지 마세요. 첫 문장은 가짜 토큰입니다. 예는 glpat-TESTONLY0000000000wQ4xsk-test_UsePwdRelayCheck20260916입니다. 둘째 문장은 가짜 PEM 껍데기입니다. -----BEGIN OPENSSH PRIVATE KEY-----, USEPWD-FAKE-KEY-NOT-REAL, 대응하는 END 줄만 씁니다. 아래 단계는 형식 규칙을 대조할 뿐입니다. 실제 자격 증명을 모델이나 중계에 넘기지 않습니다.

  2. 02
    이 기기 마스킹 페이지에 첫 문장을 붙여, 토큰이 잡히는지 보세요

    민감정보 마스킹을 엽니다. 페이지는 가입 없이 바로 씁니다. 첫 문장을 마스킹 칸에 붙이세요. 흔한 결과는 glpat-sk-test_가 토큰으로 잡히고 가운데가 별표가 되는 것입니다. F12로 네트워크 패널을 여세요. 이 원문을 처리할 때, 요청 본문에 방금 붙인 테스트 문자열이 있으면 안 됩니다. 이 단계가 대조하는 것은 「형식 규칙이 흔한 접두사를 가린다」이지, 「중계가 이미 꺼졌다」가 아닙니다.

  3. 03
    둘째 문장을 붙여, PEM 블록이 그대로인지 보세요

    지운 뒤 가짜 비밀키 블록을 붙이세요. 흔한 결과는 BEGIN / END 구간 전체가 남는 것입니다. 형식 마스킹은 PEM 갑옷을 필드로 보지 않기 때문입니다. 이 결과를 적어두세요. Agent가 실제 id_ed25519를 프롬프트에 읽으면, 중계 로그에 나타나는 것은 별표를 친 휴대전화가 아니라 이런 가려지지 않는 블록입니다. 문의 마스킹은 이 층에 닿지 않습니다.

  4. 04
    「단계」와 「재료」를 가르고, 일회용 링크로 가세요

    일회용 링크를 열고, 가짜 암호 RelayCheck-20260916로 테스트 링크를 만듭니다. 횟수는 기본 1, 만료는 24시간으로 두세요. 만들면 s.html?id=# 두 구간이 보여야 합니다. 네트워크 패널에서 서버로 가는 것은 암호문이어야 하고, 요청 URL에 # 뒤 구간이 있으면 안 됩니다. 프롬프트에는 「재료는 일회용 링크에 있다」만 쓰고, 암호 자체는 쓰지 마세요. 끝나면 그 링크를 버리세요.

  5. 05
    설정 파일 전체를 대조할 때는 파일 암호화로 바꾸세요

    VPN 설정이나 32 KB를 넘는 재료는 일회용 링크에 넣지 마세요. 파일 하나가 5 GB를 넘지 않으면 파일 암호화로 이 기기에서 AES-256-GCM 스트림 암호화를 하고, .lock / .enc를 받으며, 파일은 기본적으로 업로드되지 않습니다. 암호는 일회용 링크로 따로 넘기세요. 대조하는 것은 「암호문 파일과 암호가 본문을 남기는 같은 통로를 쓰지 않는다」이지, 「암호화했으니 Agent가 비밀키를 읽어도 된다」가 아닙니다.

편집기의 API Host가 이미 제3자 중계를 가리키면, 먼저 테스트 프로젝트로 .env~/.ssh를 컨텍스트에 읽는지 대조한 뒤에 그 홉을 유지할지 정하세요. 정식 키로 실험하지 마세요. 공식 인터페이스 직접 연결은 회색 중간자를 하나 줄입니다. 그래도 비밀키를 프롬프트에 넣으면 안 됩니다.

06 / 경계

키를 프롬프트에 안 넣어도 막지 못하는 것

「내가 직접 붙이지 않았다」를 「중계 로그에 키가 없을 것이다」로 읽으면, 같이 대조할 수 있는 경계 몇 개가 빠집니다.

Agent에게 작업 공간을 읽을 권한이 있으면, 대화창을 열지 않아도 키를 요청에 이어 붙일 수 있습니다. YOLO 모드, 터미널 명령 자동 승인, 저장소 전체를 컨텍스트로 두는 설정은 그 면을 넓힙니다. 논문이 측정한 「응답에 추가 지시가 심어졌다」는 또 다른 적극 공격 경로입니다. 중계는 당신이 보낸 키를 남길 수 있고, 당신이 받는 코드도 바꿀 수 있습니다. 이 사이트는 어떤 중계가 패킷을 변조하는지 확인할 수 없습니다. 보이지 않는 그 홉이 로그를 남길 수도, 응답을 바꿀 수도 있다는 것만 상기합니다.

이미 팔린 6TB는 오늘 프롬프트 습관을 바꾼다고 사라지지 않습니다. 연구자는 그 안의 자격 증명이 아직 유효할 수 있다고 했습니다. 처리 순서는 클라우드 콘솔, GitLab, 호스트, VPN에서 먼저 폐기한 뒤 새 재료를 발급하는 것입니다. 새 키는 Agent 컨텍스트에 다시 넣지 말고, 채팅창에도 다시 넣지 마세요. 오래 보관하거나 여러 기기에 맞출 때는 전용 비밀번호 관리자를 쓰세요. UsePwd에는 계정과 비밀번호 보관함이 없고, 사용자별로 잃어버린 링크를 찾아 주지도 않습니다. 정체성은 소개를 보세요.

형식 마스킹은 보조입니다. 하나도 빠지지 않는다는 보장이 아닙니다. 중요한 외부 전달은 사람이 한 번 더 보세요. 암호 자체는 비밀번호 생성기로 6–128자 사이에서 만들고, 강도 검사로 이 기기 강도와 공개 약한 비밀번호 목록을 보세요. 전역 Have I Been Pwned 조회가 아닙니다. 이 페이지들도 이 글과 같이 가입 없이 바로 씁니다. 「HTTPS 자물쇠」나 「임시로 표시된 대화」를 「중계 프로세스 안에 평문이 없다」로 읽지 마세요. 선로 암호화와 프로세스 안 본문은 같은 층이 아닙니다.

07 / 질문

키를 프롬프트에 넣은 뒤에 자주 묻는

아래 네 줄은 이 글의 경계만 답합니다. 도구 페이지의 버튼 설명을 반복하지 않습니다.

키를 직접 안 붙이면 중계는 못 보나요 01 아닙니다. Agent가 작업 공간이나 .env를 읽었다면, 키는 이미 중계로 나갈 본문에 있습니다.
별표를 친 문의와 같은 층인가요 02 아닙니다. 문의 마스킹은 신원 층을 봅니다. 중계 로그의 SSH와 클라우드 키는 바로 쓸 수 있는 자격 증명입니다.
공식 API에 직접 붙이면 안전한가요 03 회색 중간자 하나는 빠집니다. 업체 서버는 여전히 평문을 받습니다. 키는 그래도 프롬프트에 넣으면 안 됩니다.
마스킹과 일회용 링크는 가입해야 하나요 04 필요 없습니다. 가입 없이 바로 사용합니다. 상단 바 오른쪽에는 언어 전환만 있고, 로그인이나 비밀번호 보관함 입구는 없습니다.
08 / 다음 단계

읽고 나서 가린 것과 남긴 것을 대조하세요

글은 「키를 Agent 프롬프트에 넣은 뒤, 중계가 호출 기록을 왜 그대로 팔 수 있는가」를 답합니다. 가짜 테스트 토큰으로 형식 마스킹을 대조하거나, 재료를 일회용 링크로 옮기려면 해당 페이지를 열면 됩니다. 먼저 가입할 필요는 없습니다.