이 페이지는 번역본입니다. 공식 원문은 영어판입니다. 영어로 읽기
llm-abuse · llmjacking · self-hosted-llm · ai-agents · prompt-capture · credential-exposure · shadow-ai · china
노출된 추론 엔드포인트, 상태 점검을 거친 뒤 타인의 백엔드로 사용되다
인증이 없는 OpenAI 호환 추론 엔드포인트가 제3자에게 처음부터 끝까지 포섭된 사례이다. 해당 제3자는 스크립트화된 프로브 묶음으로 모델을 검증한 뒤, 실제 에이전트 애플리케이션의 사용자 트래픽을 이 엔드포인트로 중계하였다.
작성자 Davis Zheng·
TLP:CLEAR. 공개 배포가 승인되었다. Kinryū Labs 허니팟 센서 네트워크에서 수집하였다. 아래 지표는 디팡 처리하였다.
요약
- 280개방된 단일 추론 엔드포인트로 전송된 프롬프트
- 54 h최초 프로브부터 최신 상태 점검까지
- 7셸 실행을 포함해 제공된 에이전트 도구
2026년 9월 13일부터 20일 사이, 당사 허니팟 중 하나는 43.155.205[.]31(Tencent Cloud, AS132203, 지리적 위치 KR)의 단일 클라이언트가 인증이 없는 OpenAI 호환 엔드포인트로 280건의 프롬프트를 전송하는 것을 기록하였다. 280건의 프롬프트는 모두 동일한 클라이언트 세션 식별자와 동일한 사용자 에이전트 Go-http-client/1.1을 공유하며, /v1/chat/completions로 전송되었다. 어느 요청에도 API 키가 포함되지 않았으므로, 이 엔드포인트는 이를 발견한 누구나 접근할 수 있는 상태였다.
당사는 2026년 9월 13일부터 20일까지의 활동을 분석하고 그 지표를 기점으로 피벗하였다. 평판 조회 결과 VirusTotal 89개 엔진 중 0개가 악성으로 판정하였고 평판 기록은 존재하지 않았다. 네트워크 소유 정보 조회 결과는 Tencent Cloud, AS132203으로 확인되었다.
당사는 해당 클라이언트가 프로브 묶음으로 노출된 엔드포인트를 검증한 뒤 이를 실제 애플리케이션의 요청 경로에 연결해 무료 연산 자원으로 사용하였다고 중간 수준의 확신으로 평가한다. 이는 공개된 LLMjacking 수법과 일치한다.
표 1은 이 세션의 네 단계를 정리한 것이다.
시각은 UTC 기준이다.
| 단계 | 최초 관측 | 요청에 담긴 내용 | 규모와 주기 |
|---|---|---|---|
| 상태 점검 | 2026-09-18T09:02:28Z | gpt-3.5-turbo, gpt-4, llama-3.2-3b-instruct:q4_k_m를 대상으로 한 9자 길이의 hi 프롬프트 | 1초 미만 간격 |
| 핑거프린팅 | 2026-09-18T10:15Z | 정확한 토큰 반향 테스트, 출력 형식을 제한한 산술 문제, 더 무거운 물체를 묻는 함정 질문, 단어 수 지시 이행, 지식 컷오프 및 자기 식별 질문, 그리고 동일한 항목의 중국어 반복 | 40-54번째 턴은 중국어 한 글자 프로브를 약 0.5초 간격으로 반복 |
| 애플리케이션 트래픽 | 2026-09-18T13:54:33Z | 에이전트 시스템 프롬프트, 7개 항목 도구 스키마, 중국어 사용자 턴, 붙여넣은 벤더 API 키 | 본문 길이가 앞선 단계의 수십 자에서 25,297자로 증가 |
| 상태 점검 재개 | 2026-09-19 ~ 2026-09-20 | 다시 hi | 9월 20일 15:02:12.084Z부터 15:02:13.923Z 사이에 동일한 요청 14건 |
ATT&CK 관점에서 이 클라이언트는 엔드포인트를 스캔하고(T1595, Active Scanning, 정찰 목적), 이어서 외부 노출 엔드포인트를 초기 침투 수단으로 사용하였으며(T1190, Exploit Public-Facing Application), T1552, Unsecured Credentials에 해당하는 자격 증명을 붙여넣었다.
핵심 판단
- 당사 허니팟 중 하나에 있던 인증 없는 OpenAI 호환 엔드포인트가 검증을 거친 뒤 타인의 에이전트 애플리케이션을 위한 백엔드 연산 자원으로 사용되었다. 단일 클라이언트 주소가 9월 18일부터 20일까지 하나의 세션 식별자 아래 280건의 프롬프트를 남겼다. 중간 수준의 확신.
- 검증 및 상태 점검 단계는 사람이 입력한 것이 아니라 스크립트로 실행된 것이다. 9월 20일 15:02:12.084Z부터 15:02:13.923Z 사이에 동일한 9자 길이의 생존 확인 프롬프트 14건이 도착하였다. 중간 수준의 확신.
- 제3자에게 속한 실제 사용자 데이터가 이 엔드포인트를 통과하였으며, 여기에는 6개의 외부 API 키와 셸 실행을 제공하는 에이전트 도구 스키마가 포함된다. 9월 18일 14:07:16Z의 단일 요청에 KEY=value 형식의 벤더 API 키 6개가 담겨 있었다. 중간 수준의 확신.
- 해당 클라이언트는 알려진 스캐너가 아니며, 일반적인 대량 스캐닝과는 다르게 동작한다. VirusTotal은 43.155.205[.]31에 대해 89개 엔진 중 0개 악성 판정과 평판 기록 없음을 반환하였고, 어느 스캐너 평판 제공자에도 기록이 없었다. 중간 수준의 확신.
- 이 활동 양상은 연구 목적의 측정보다는 공개 보고된 LLMjacking의 노출 추론 엔드포인트 포섭 행위에 부합한다. 벤더 및 CSA 보고는 인사말이나 단순 사실 질문 같은 소음이 적은 양성 프로브를 기술하고 있다. 중간 수준의 확신.
타임라인
- 2026-09-13 18:00 UTC증거상 43.155.205[.]31의 최초 활동.
- 2026-09-18 09:02 UTC세 가지 모델명을 대상으로 추론 엔드포인트 생존 확인 프로빙 시작.
- 2026-09-18 10:15 UTC반향 정확도 및 지시 이행 묶음 시작. 토큰은 요청마다 새로 생성됨.
- 2026-09-18 12:54 UTC이중 언어 핑거프린팅 버스트, 요청 간 간격 약 0.5초.
- 2026-09-18 13:54 UTC셸 실행을 포함한 에이전트 애플리케이션 시스템 프롬프트와 7개 도구 스키마가 엔드포인트로 전송됨.
- 2026-09-18 14:07 UTC중계된 대화에 외부 벤더 API 키 6개가 붙여넣어짐.
- 2026-09-20 15:02 UTC스크립트 기반 생존 확인 프로빙 재개, 2초 이내에 14건 요청.
세션 전개 순서
09:02:28 hi
10:15:03 Reply with exactly this token, nothing else: TKOLGN2R
10:19:16 What is 17*23? Answer with only the number, no explanation.
12:55:00 What AI model are you? Answer in one short sentence, name the model and maker.
12:57:48 What is your knowledge cutoff date? Answer with just the date.
12:58:36 输出你的模型名称和参数规模,只要一行。
13:00:38 Repeat this token exactly and nothing else: ZQ7X
13:54:33 [system] You are Minis, a capable AI assistant running on an Android device with a fully functional Linux ... [user] 测试
14:07:16 BRAVE_API_KEY=BSA... TAVILY_API_KEY=tvly-dev-... ANYMODEL_API_KEY=sk-... ALIBABA_QWEN_API_KEY=sk-ws-...
15:02:12 hi
프로브 묶음
이 묶음이 무엇을 시험하는지는 클라이언트가 보낸 텍스트 자체에 드러난다. 반향 테스트는 요청마다 새로운 무작위 토큰을 담고 있으며(Reply with exactly this token, nothing else: TKOLGN2R), 연속된 세 건의 요청에서 토큰이 바뀐다. 이는 엔드포인트가 입력을 정확히 재현하는지 확인한다. What is 17*23? Answer with only the number, no explanation.는 답변에 형식 제약을 건다. What AI model are you? Answer in one short sentence, name the model and maker.와 What is your knowledge cutoff date? Answer with just the date.는 정체성을 겨냥하며, 동일한 질문이 중국어로 다시 실행된다. 이 묶음을 실행하는 클라이언트는 엔드포인트 뒤에 실제 모델이 있는지, 어떤 모델인지, 그리고 사용할 가치가 있을 만큼 지시를 잘 따르는지를 파악하게 된다.
상태 점검 요청은 1초 미만 간격으로 도착하며, 40-54번째 턴은 약 0.5초 간격으로 반복되는데 이는 사람이 입력하기에는 너무 짧다. 당사는 Go-http-client/1.1 사용자 에이전트를 브라우저나 API 콘솔 앞의 사람이 아니라 애플리케이션 트래픽을 중계하는 Go 프로그램으로 해석한다. 이 추론은 낮은 수준의 확신으로 유지하며, 이는 해당 활동을 운영자에게 귀속하는 문제와 관련이 있다. 애플리케이션 트래픽이 이미 흐른 뒤에 프로빙이 재개되었는데, 당사는 이를 클라이언트가 엔드포인트를 계속 사용할 수 있는지 확인한 것으로 해석한다.
에이전트 애플리케이션 트래픽
애플리케이션 트래픽 단계에서 클라이언트는 실제 애플리케이션, 즉 중국어 Android 어시스턴트의 요청을 중계하였다. 10건의 요청이 동일한 에이전트 시스템 프롬프트를 담고 있었으며, 이는 기기 상에서 격리된 Alpine Linux PRoot 환경을 실행하는 어시스턴트를 위한 것으로 7개 항목의 도구 스키마를 포함한다. 첫 번째는 shell_execute로 해당 환경에서 /bin/sh -c를 통해 명령을 실행한다고 기술되어 있고, 이어서 파일 읽기, 파일 쓰기, 파일 편집, 브라우저 제어, 그리고 두 개의 영속 메모 도구가 뒤따른다. 모델 호출 사이에는 애플리케이션 자체의 관리용 요청이 섞여 있는데, 인터페이스 언어를 zh-Hans로 지정한 채 JSON을 출력해야 하는 대화 제목 생성기와 중국어로 된 짧은 사람의 턴이 그것이다.
해당 단계가 시작된 지 13분 후인 14:07:16Z에 한 요청이 KEY=value 형식의 유효한 벤더 API 키 6개를 담고 있었다. 검색 API 2개, 에이전트 메시징 API 1개, 리서치 API 1개, 모델 제공자 키 2개이다. 이 키들이 입력한 사람 본인의 것인지, 아니면 이전에 탈취된 자료를 무료 엔드포인트에 시험한 것인지는 수집 데이터만으로 판단할 수 없다. 어느 쪽이든 이 키들은 해당 엔드포인트의 소유자에게 전달되었다.
스캐너 가능성 배제
증거는 일반적인 스캐너와 부합하지 않는다. VirusTotal은 43.155.205[.]31에 대해 89개 엔진 중 0개 악성 판정과 평판 기록 없음을 반환하였고, 어느 스캐너 평판 제공자에도 기록이 없었다. 일반적인 대량 스캐닝은 다수의 센서에 일회성 프로브를 보내는 반면, 이 클라이언트는 내용이 변화하는 프롬프트를 담은 단일 장기 세션을 유지하였다. 동일한 증거는 연구 또는 측정 목적의 크롤러 가능성에도 반한다. 연구자라면 측정 대상 엔드포인트에 유효한 벤더 키와 실제 사용자 대화를 통과시키지 않기 때문이다.
이 주소가 다수의 하위 사용자를 중계하는 공유 프록시 풀인지, 아니면 한 사람이 단일 기기를 위해 운영하는 중계 지점인지는 증거로 결론이 나지 않는다. Go 클라이언트, 매일 반복되는 스크립트 상태 점검, 단일 업스트림 세션의 재사용은 두 해석 모두에 동일하게 부합한다.
양쪽 모두의 노출
엔드포인트 소유자는 클라이언트가 소비하는 추론 비용을 부담하고, 클라이언트는 자기 사용자들의 프롬프트, 자신의 시스템 프롬프트, 자격 증명을 엔드포인트 소유자가 누구든 그 손에 넘긴다. 또한 위의 도구 스키마는 Android 기기에서 셸 실행, 파일 쓰기, 브라우저 제어를 제공한다. 적대적인 백엔드는 자신이 선택한 도구 호출로 응답하여 이를 클라이언트 측에서 실행시킬 수 있다.
인증 없이 인터넷에서 도달 가능한 자체 호스팅 추론 엔드포인트는 이미 상태 점검을 받고 타인의 백엔드로 사용되고 있다고 가정해야 한다. 이번 사례에서는 당사가 관측한 최초 활동으로부터 5일 이내에 그 일이 벌어졌다. 해당 엔드포인트를 거친 모든 프롬프트는 유출된 것으로 취급해야 하며, 여기에는 이름조차 들어본 적 없는 애플리케이션의 시스템 프롬프트와 붙여넣어진 비밀 정보도 포함된다.
침해 지표
아래의 유일한 네트워크 지표는 디팡 처리하였으며, 경로는 관측된 그대로 기재하였다.
네트워크
| 지표 | 설명 |
|---|---|
43.155.205[.]31 | 인증 없는 추론 엔드포인트를 대상으로 상태 점검과 핑거프린팅을 수행한 뒤 에이전트 애플리케이션 트래픽을 중계한 클라이언트 |
호스트 아티팩트
| 지표 | 설명 |
|---|---|
Reply with exactly this token, nothing else: <8 alnum chars> | 엔드포인트를 검증하는 데 사용된 반향 정확도 프로브. 토큰은 요청마다 재생성됨(관측값 TKOLGN2R, TK3C9IAN, TKA63OEL, P2380OG9, P23WD39I, P2GBIOTB, ZQ7X) |
Go-http-client/1.1 POST /v1/chat/completions with no Authorization header | 수집된 280건의 프롬프트 전반에 걸친 중계 클라이언트의 요청 시그니처. 라이브러리 문자열만으로는 일반적인 값임 |
탐지
Sigma
자체 호스팅 추론 엔드포인트를 대상으로 한 모델 핑거프린팅 프롬프트 묶음(후보).
title: Model-fingerprinting prompt battery against a self-hosted inference endpoint
status: experimental
description: Detects the validation prompts an operator sends to decide whether an exposed OpenAI-compatible endpoint serves a real model. Requires prompt-body logging on the gateway; most inference servers do not log request bodies by default.
logsource:
category: application
product: llm_gateway
detection:
selection_path:
url.path|endswith:
- '/v1/chat/completions'
- '/v1/completions'
- '/api/generate'
selection_probe:
http.request.body.content|contains:
- 'Reply with exactly this token'
- 'Repeat this token exactly and nothing else'
- 'What AI model are you'
- 'What is your knowledge cutoff date'
- 'state your model family'
- '输出你的模型名称和参数规模'
condition: selection_path and selection_probe
falsepositives:
- Internal model-evaluation harnesses and CI smoke tests that verify a served model responds and identifies itself
level: medium
탐지 로직
- 관리 네트워크 외부에서 유입된 인증 없는 추론 요청(네트워크, 후보). 자체 호스팅 추론 포트의 /v1/chat/completions, /v1/completions, /api/generate 또는 /api/chat에 대한 HTTP POST 중, 엔지니어링 대역 외부에서 도착하면서 Authorization 또는 api-key 헤더가 없는 요청에 경보를 발생시킨다. 단일 출발지에서 2초 이내에 그러한 요청이 5건을 초과해 폭주하는 경우는 사용자 트래픽이 아니라 제3자의 자동화된 업스트림 상태 점검으로 취급한다.
- 자사 사용자만 처리해야 할 엔드포인트에 도착한 에이전트 시스템 프롬프트(행위 기반, 후보). 직접 운영하는 추론 게이트웨이에서, 클라이언트 주소가 등록된 자사 애플리케이션에 속하지 않으면서 셸, exec, 파일 쓰기 또는 브라우저 제어 항목을 포함하는 tools 또는 functions 배열이 담긴 10,000자 초과 요청 본문을 표시한다. 이는 미상의 주체가 자사 연산 자원을 자율 에이전트에 사용하고 있거나, 자사 에이전트 중 하나가 잘못된 백엔드를 바라보도록 재설정된 경우이다.
대응 조치
- 자체 호스팅 추론 서버는 루프백이나 사설 인터페이스에 바인딩하고 그 앞에 인증을 수행하는 리버스 프록시를 둔다. 높은 번호의 포트는 접근 통제가 아니다.
- 모든 추론 경로에 API 키 또는 mTLS를 요구하고, Authorization 헤더가 없는 요청은 모델 서버가 아니라 프록시에서 거부한다.
- /v1/chat/completions에 대한 인증 없는 POST와 단일 출발지에서 반복되는 동일한 최소 프롬프트에 경보를 설정한다. 후자는 프록시 풀이 포섭한 업스트림을 상태 점검하는 방식이다.
- 추론 엔드포인트가 인증 없이 인터넷에서 도달 가능한 상태였다면, 이를 거친 모든 프롬프트와 시스템 프롬프트를 유출된 것으로 취급하고 대화에 등장한 모든 자격 증명을 교체한다.
- 에이전트 프레임워크를 운영하는 팀의 경우, 모델 base URL을 직접 통제하는 제공자로 고정하고, 셸, 파일 쓰기, 브라우저 도구를 보유한 에이전트를 무료이거나 출처가 불분명한 OpenAI 호환 엔드포인트에 연결하지 않는다.
MITRE ATT&CK 매핑
| 전술 | 기법 | 관측 내용 |
|---|---|---|
| 정찰 | T1595 Active Scanning | 엔드포인트가 실제 모델을 제공하는지, 어떤 모델인지 시험하기 위해 스크립트 기반 생존 확인 프롬프트와 정확한 토큰 반향 묶음을 사용하였다. |
| 초기 침투 | T1190 Exploit Public-Facing Application | 인증이 없고 인터넷에서 도달 가능한 추론 API가 권한 없는 주체에 의해 곧바로 서비스로 사용되었다. |
| 자격 증명 접근 | T1552 Unsecured Credentials | 외부 벤더 API 키 6개가 엔드포인트를 통과하는 대화에 붙여넣어져, 이를 운영하는 주체에게 노출되었다. |
참고 자료
- CSA 연구 노트: LLMjacking의 진화, 공격 인프라가 된 탈취 AI 연산 자원
- LLMjacking: 공격자가 잘못 구성된 프록시를 악용해 유료 LLM 서비스 접근 권한을 탈취하는 방법
방법론 및 분석관 주석
본 보고서는 2026년 9월 13일부터 20일까지의 기간을 다루며, 센서 텔레메트리에서 읽어내고 공개 위협 인텔리전스 피드 및 보강 조회로 검증한 1개의 출발지 주소와 7건의 시각 기록 관측에 근거한다.
미해결 사항:
- 43.155.205[.]31이 다수의 하위 사용자를 처리하는 공유 프록시 풀인지, 아니면 한 사람이 단일 기기를 위해 운영하는 중계 지점인지.
- 붙여넣어진 벤더 API 키 6개가 입력한 사람 본인의 것인지, 아니면 이전에 탈취된 자료를 시험한 것인지.
- 엔드포인트가 어떻게 발견되었는지, 그리고 이를 열거한 주소가 이후 실제로 사용한 주소와 동일한지.
- 9월 13일 이전 이 클라이언트의 활동이 어떤 모습이었는지.
- 동일한 클라이언트가 다른 노출된 추론 엔드포인트도 사용하는지.
문의 또는 정정: contact@kinryu.sh.