이 페이지는 번역본입니다. 공식 원문은 영어판입니다. 영어로 읽기
threat-actor · litellm · agentic-ai · credential-theft · china-nexus
keyHunter: 자체 도구 모음을 유출한 LLM 프록시 키 탈취 작전
중국어를 사용하는 공격자가 FOFA로 노출된 AI 프록시 패널을 훑고, 허니팟을 인식하도록 만들어진 단위 테스트를 갖춘 코드로 이를 검증한 뒤 API 키를 내보낸다. 이 공격자의 에이전트는 자체 호스트의 파일 경로 283개, 스캔 결과, WeChat 대화 기록, 그리고 New-API Stripe 웹훅 우회를 포함해 2026년 CVE 6건의 이름을 딴 익스플로잇 파일이 담긴 결과 디렉터리를 당사 허니팟 중 하나에 전송했다.
작성자 Davis Zheng·
TLP:CLEAR. 공개 배포가 승인되었다. 이하 내용의 거의 전부는 공격자의 에이전트가 당사 허니팟 중 하나에 전송한 출력에서 복원한, 공격자 자신의 자료이다. 지표는 디팽 처리했으며, 이는 공격자 주소를 실수로 클릭하거나 이름 조회(DNS 해석)되지 않는 형태로 표기했다는 뜻이다. 스캔 대상, 공격자가 직접 지목한 제3자 호스트 한 곳, 그리고 이들의 FOFA API 키 전문은 공개하지 않는다.
핵심 요약
- 27,173FOFA로 훑은 후보 호스트
- 194모델 목록을 응답한 호스트
- 17내보낸 API 키
- 6파일명 기준 2026년 CVE
중국어를 사용하는 공격자가 단 하나의 표적, 즉 살아 있는 키를 뒤에 둔 노출된 AI 프록시 패널을 찾기 위해 8개국 27,173개 호스트를 훑었다. AI 프록시 패널은 하나의 제공사 키 묶음을 공유할 수 있도록 각 팀이 자사 애플리케이션과 유료 모델 제공사 사이에 두는 소프트웨어로, LiteLLM, One-API와 그 포크인 New-API, Sub2API, Chat2API 등이 여기에 해당한다. 이런 패널을 암호 없이 인터넷에 열어두면 그 뒤에 있는 모든 것을 낯선 사람이 소비할 수 있다. 공격자는 인터넷 전역을 지속적으로 스캔한 결과를 검색하는 엔진이자 Shodan의 중국 측 대응물인 FOFA로 이들을 찾아내고, 어느 패널이 아직 응답하는지 확인한 뒤 키를 내보낸다.
이 수치들은 당사가 추정한 값이 아니라 공격자의 결과 파일에서 그대로 옮긴 공격자 자신의 수치이다. 27,173개 호스트 가운데 194개가 모델 목록을 응답했고, 17개의 키가 이들의 내보내기 파일에 도달했다. 미국 대상 실행이 가장 명확한 단일 사례이다. 대상 10,447건 투입, 모델 목록 응답 64건 산출, 적중률 0.61%이며, 그 이유는 공격자 자신의 에이전트가 설명할 수 있었다. 공개적으로 노출되어 있으면서 실제로 호출 가능한 LiteLLM은 드물고, 스캐너의 URL 구성 버그가 살아 있는 호스트를 죽은 것으로 표시하고 있었다.
- 이는 중국에 기반을 두고 중국어로 수행되며 중국 인프라만 사용하는 작전이다. 복원된 모든 파일 타임스탬프가
+0800이고, 전 과정의 작업 언어가 중국어이며, 세 대의 호스트는 Alibaba Cloud, Tencent Cloud, 그리고 Huawei Cloud의 스캐닝 VM이다. 높은 신뢰도. - 도구는 범용 상품이 아니라 자체 제작되었고 단위 테스트를 갖추었다.
litellm_verifier.py에는 테스트 파일 세 개가 함께 있고, 백업 디렉터리에는SHA256SUMS가 있으며, 작업은 번호를 붙인 라운드 단위로 정리되어 있다. 자격 증명 스캐닝에서 이런 수준의 엔지니어링 규율은 흔하지 않다. 높은 신뢰도. 공격자 자신의 파일 목록에 근거한다. - 이들은 대응 기만 기능을 내장했고, 그것이 작동한다. 이들의 검증기는
/v1/models목록 응답을 성공으로 집계하지 않고, 모델마다 실제 chat completion을 요구하며, 응답이 주장하는 제공사와 부합하는지 점수를 매긴다. 한 차례 실행에서는 테스트한 모델 항목 41개 중 20개를honeypot_or_unusable로 분류했다. 높은 신뢰도. - 익스플로잇 키트는 전부 n-day이다. 이들의 결과 파일명은 LiteLLM, Sub2API, New-API를 대상으로 한 2026년 권고 6건과 대응되며, 그중 하나는 CISA Known Exploited Vulnerabilities 목록에 올라 있다. 독자적인 취약점 연구를 시사하는 정황은 없다. 제품과 기법에 대해서는 높은 신뢰도, 6건 중 4건의 구체적 CVE에 대해서는 중간 신뢰도이며, 이들은 관측이 아니라 파일명에서 추정한 것이다.
- 대회라는 설정은 결과 디렉터리와 마주하는 순간 유지되지 않는다. 이들은 자신의 에이전트에게 범위가 기본 자격 증명뿐이라고 말하지만, 해당 디렉터리의 파일명은 원격 코드 실행, SQL 인젝션, 템플릿 인젝션, 서버 사이드 요청 위조, 토큰 유출, 할당량 초과, 그리고 Stripe 웹훅 우회를 가리킨다. 당사가 확보한 것은 파일 목록이지 파일 내용이 아니므로 의도는 열린 문제로 남지만, 어느 해석을 택하든 공격자가 그 도구를 만들어 실행했다는 사실은 달라지지 않는다. 산출물에 대해서는 높은 신뢰도, 의도에 관한 어느 해석이 옳은지에 대해서는 중간 신뢰도.
명칭에 대하여
당사는 이를 공격자 자신의 프로젝트 디렉터리인 /root/keyHunter-skill/에서 따와 keyHunter로 추적한다.
이들이 운용하는 에이전트 프레임워크의 이름은 Hermes이며, Hermes는 Nous Research가 공개한 실존 오픈소스 프로젝트이다. 행위자를 그 이름으로 부르면 누군가가 그 도구로 한 일에 대해 정당한 도구를 탓하는 셈이 되므로, 그렇게 하지 않는다. 같은 호스트에 있는 두 번째 에이전트 프레임워크인 OpenClaw도 마찬가지다. 둘 다 공격자가 설치해 타인의 인프라를 향해 돌린 평범한 소프트웨어다.
공격자
공격자는 모두 중국 클라우드에 있는 세 대의 호스트에서 작업하며, 역할은 그 사이에 나뉘어 있다. Alibaba Cloud(AS37963)의 39.98.82[.]200은 에이전트 게이트웨이를 운용하며 당사가 관측한 정찰 활동의 대부분을 수행했다. Tencent Cloud(AS45090)의 101.43.41[.]72는 중계 노드로, 포트 8087에서 OpenAI 호환 엔드포인트를 제공하며 에이전트가 모델 용량을 얻기 위해 호출한다. 두 노드는 JA4H 핑거프린트 po11nn070000_ebbca96fac43를 공유하는데, 이는 클라이언트가 HTTP 요청을 구성하는 방식을 기술하며 주소가 바뀌어도 유지된다. 여기에 맞춤 제작된 Hermes-Agent/0.18.0과 Hermes-Panel/1.0 사용자 에이전트, 그리고 공유된 단일 대화 세션 식별자가 더해진다. 이를 종합하면 두 노드는 한 공격자 아래에 놓인다. 이 핑거프린트는 단일 캡처에서만 나온 산물이 아니며, 8월 16일부터 20일까지의 활동 전반에서 동일한 FOFA 기반 스윕과 함께 반복 관측된다.
스캐닝은 또 다른 곳에서 이루어진다. 공격자는 Alibaba 호스트에서 로컬 포워딩을 통해 Huawei Cloud VM에 접속한다.
ssh -o ServerAliveInterval=20 -i /root/.ssh/hw_vm_key -p 8888 developer@127.0.0.1 \
'cd /home/developer && /home/developer/.venv-us30/bin/python litellm_scan_us_30d_optimized.py'
이 시스템은 가동 4일 9시간 경과 상태였고, RAM 7.5 GB와 4코어를 갖추었으며 스캔 워커를 실행한다. 요란한 트래픽을 발생시키는 스캐닝을 에이전트 프런트엔드에서 분리한 것은 의도적인 선택이며, hw_vm_key라는 이름은 공격자가 이를 Huawei 시스템으로 인식하고 있음을 보여준다.
통제는 WeChat을 통해 이루어진다. 게이트웨이 서비스는 스스로를 “Hermes Agent Gateway, Messaging Platform Integration”이라고 기술하며, 공격자는 WeChat 대화 스레드에서 대화하는 방식으로 에이전트에 작업을 지시한다. 에이전트의 장기 기억은 바로 그 대화다. 자신이 무슨 작업을 하고 있었는지 떠올리기 위해 자기 대화 기록을 검색한다. 두 번째 프레임워크도 같은 양상을 보이며, openclaw-weixin이라는 이름의 세션이 있다. 소비자용 메시징 앱은 값싼 통제 채널이 된다. 트래픽이 기본적으로 암호화되고 다른 모든 WeChat 사용자와 함께 Tencent로 흘러가므로, 명령 제어 비커닝을 겨냥해 조정된 탐지에는 걸리지 않는다.
이 모든 것의 배후에 있는 추론 엔진은 중계를 통해 접근하는 상용 코딩 어시스턴트 github_copilot/gpt-5.6-sol이다. 이들의 설정에는 다른 여러 제공사의 선택적 키도 연결되어 있다. 공격 코드는 자체 제작 Python이지만, 그 아래의 추론 모델, 에이전트 프레임워크, WeChat 통제 채널은 모두 기성 소비자 제품이다.
파이프라인
이들의 마스터 스킬은 작전 전체를 한 줄로 기술한다. “FOFA + keyHunter + 맞춤 검증 스크립트를 사용해 공개적으로 노출된 AI API 프록시 패널(LiteLLM, Sub2API, New-API, One-API)을 발견, 스캔, 검증, 보관한다.”
FOFA search, per country
-> dedupe and normalise targets
-> light HTTP fingerprint
-> /v1/models listing
-> real chat completion per model
-> honeypot classification
-> weak-credential panel login, key extraction
-> export keys and accounts, archive
발견 단계는 국가별로 반복되는 단일 FOFA 질의다.
(title="LiteLLM" || body="LiteLLM") && country="{cc}" && org!="AMAZON-AES"
의미 있는 절은 AWS 제외 구문이다. 공격자는 단 한 대의 호스트도 들여다보기 전에 모든 스윕에서 Amazon을 걸러낸다. 타인의 스캔 데이터 위에 구축된 파이프라인을 상대로는, 경계에서 Shodan과 Censys 대역을 차단해도 얻는 것이 없다.
국가별로 별도의 스크립트를 보유한다. 미국용 litellm_scan_hw.py, litellm_scan_gb_hw.py, litellm_scan_it_hw.py, 자체 가상환경을 갖춘 litellm_scan_us_30d_optimized.py, 그리고 호주, 브라질, 캐나다, 프랑스, 인도, 네덜란드, 싱가포르를 다루는 keyHunter-skill/ 하위의 추가 스크립트 묶음이 있다. 결과 파일은 14개국분이 존재한다. 동시 실행 수는 경량 워커 48개, 심층 워커 12개이며, FOFA의 429 응답에 대한 레이트 리밋 백오프와 프로토콜, 호스트, 포트를 키로 하는 엔드포인트 중복 제거를 갖추고 있다.
FOFA API 키는 스캐너 소스에 하드코딩되어 있으며, 그래서 당사가 이를 확보하게 되었다. 스캐너는 hamal.cc[.]cd의 비공식 FOFA 미러를 대상으로 동작하고 로컬 Squid 프록시를 통해 나간다.
실제 스윕 결과
| 국가 | FOFA 대상 | 모델 목록 응답 | 적중률 |
|---|---|---|---|
| 미국 | 10,447 | 64 | 0.61% |
| 중국 | 6,329 | 83 | 1.31% |
| 한국 | 1,772 | 10 | 0.56% |
| 영국 | 1,422 | 18 | 1.27% |
| 이탈리아 | 1,130 | 9 | 0.80% |
| 호주, 인도, 브라질 | 6,073 | 10, 이 중 4건 검증 | 0.16% |
캡처된 한 차례 실행에서는 FOFA 원본 행 2,255건, 중복 제거 후 고유 엔드포인트 1,130건, 모델 목록을 응답한 사이트 9곳, 검증에 성공한 8곳이 나왔고, 요청 수준에서는 모델 성공 41건 대 실패 8건이었다.
이들이 수집한 FOFA 타이틀 집계는 노출된 모집단의 모습을 보여준다. LiteLLM API - Swagger UI는 7,630건을 반환한다. OmniRoute는 171건, SillyTavern은 170건, LiteLLM Dashboard는 156건, Claude Code Hub는 131건, Aivar AI Gateway는 11건이다. 노출 표면의 대부분이 단일 제품이며, 그 제품의 노출 인스턴스 대부분은 자동 생성된 API 문서 페이지다.
당사는 최종 단계의 산출량을 절대적으로는 낮다고 평가한다. litellm_extracted_keys.json에는 인스턴스 43건과 모델 23개에 걸친 추출 키 3건이 기록되어 있다. exported_keys.json에는 17건이 담겨 있다. 수만 개 호스트를 훑어 키 17개를 얻은 셈인데, 이는 투입 대비 빈약한 회수이거나, 에이전트가 대신 수행하므로 그 투입이 애초에 값싸다는 논거가 된다.
대응 기만: 이들은 허니팟을 사냥한다
엔지니어링 수준이 가장 잘 드러나는 파일은 litellm_verifier.py 하나다.
크기는 10킬로바이트이고 단위 테스트 스위트를 갖추고 있다. 패널이 광고하는 모든 모델에 실제 최소 chat completion을 전송하며, 유효한 OpenAI 형태의 choices/message/content 응답이나 완료 표시가 있는 정상 스트리밍 응답일 때만 성공으로 기록한다. 이들 자신의 규칙은 이들 자신의 표현으로 이렇다. /models만 성공한 것은 결코 성공으로 집계하지 않는다. 테스트 이름이 그 규칙을 담고 있으며, 그중 하나는 test_models_listing_alone_is_not_success다. 누군가가 훔친 키에 대해 자신의 도구가 자신들을 속이지 않도록 회귀 테스트를 작성한 것이다.
한 차례 실행의 판정 집계는 다음과 같다.
verdict_counts: honeypot_or_unusable 20 · trusted_pass 5 · unavailable 16
formatted_false_success_model_hits 29
non_chinese_evidence_count 13
total_questions 205
formatted_false_success는 정형화되었거나 그대로 되돌려주는 응답을 뜻하며, 이는 조악한 디코이가 응답하는 방식이다. non_chinese_evidence는 모델이 스스로 주장하는 제공사처럼 행동하는지를 점수화한다. 이들은 다섯 문항으로 된 심문, 즉 蜜罐五题测试도 실행하며, 캡처된 기간에는 이를 사용해 AWS 런던 대역의 한 호스트를 허니팟으로 표시했다. 해당 주소는 타인의 센서이며 이를 공개하면 그 센서가 노출되어 무력화되므로 당사는 공개하지 않는다.
훔친 추론을 사는 쪽은 이제 엔드포인트가 함정일 수 있다고 가정하고 이를 시험한다. 이들을 잡아내는 역검증은 같은 시험을 뒤집어 수행하는 것이다. API 파라미터를 무시하고 게이트웨이에 실제로 어떤 모델을 구동하는지 증명하라고 요구하는 클라이언트는 상품을 검수하고 있는 것이다.
익스플로잇 무기고: 전부 n-day
이들의 익스플로잇 결과 파일 내용은 당사에 전달되지 않았다. 파일명은 전달되었고, 그 표적은 공개 권고가 존재하는 오픈소스 제품이므로, 익스플로잇은 권고에서 역추적할 수 있다.
| 공격자 호스트의 결과 파일 | CVE | 취약점 | 근거 |
|---|---|---|---|
litellm_host_header_bypass_results.json (568 KB) | CVE-2026-49468 | Host 헤더 인젝션을 통한 LiteLLM 인증 우회, CVSS 9.8, 1.84.0 이전. 인증을 라우팅으로부터 어긋나게 만들어 인증 없이 /key/generate와 /user/new를 사용할 수 있게 한다 | 교차 확인: 동일한 관리 평면 호출이 당사 센서에 도달했고, CVE-2026-49468-Scanner 사용자 에이전트를 제시했다 |
litellm_sqli_apikey_results.json (517 KB), litellm_sqli_models.json | CVE-2026-42208 | 인증 경로에서 발생하는 LiteLLM 사전 인증 SQL 인젝션 | 교차 확인: 키 값으로 ' OR '1'='1을 19회 전송했다 |
litellm_rce_exploit.json, litellm_mcp_rce_results.json | CVE-2026-42271 | LiteLLM 명령 인젝션 및 원격 코드 실행, CVSS 8.7, CISA Known Exploited Vulnerabilities 목록 등재, 1.74.2부터 1.83.6까지, MCP 인젝션 경로 포함 | 파일명과 제품으로부터 추정 |
sub2api_cve_exploit.json 및 이후 단계 3건 | CVE-2026-27812 | 신뢰된 Host 및 Forwarded 헤더를 통한 Sub2API 비밀번호 재설정 오염으로 계정 탈취에 이른다. 실제 공격에 악용됨, 0.1.85 이전 | 추정 |
newapi_stripe_bypass_results.json, newapi_stripe_exploited.json, newapi_quota_overflow_results.json | CVE-2026-41432 | 빈 시크릿을 통한 New-API Stripe 웹훅 서명 우회로, 결제 없이 무제한 할당량을 얻는다, 0.12.10 이전 | 추정 |
newapi_user_token_leak_results.json, oneapi_user_token_leak_results.json, newapi_ssrf_bypass_results.json | CVE-2026-30886 | 비디오 프록시 엔드포인트의 New-API 안전하지 않은 직접 객체 참조 및 인증 우회로, 다른 사용자의 콘텐츠가 노출되고 공격자가 피해자의 자격 증명을 상위 제공사에 소비할 수 있게 된다 | 추정 |
litellm_ssti_prompts_results.json | 단일 권고 없음 | 프롬프트 및 템플릿 엔드포인트를 대상으로 한 Jinja2 서버 사이드 템플릿 인젝션 | 추정 |
어떤 파일의 내용도 당사에 전달되지 않았으며, 모든 행은 파일명에 근거한다. 이 중 두 건은 당사 센서에 해당 기법이 도달하는 것을 독자적으로 관측했는데, Host 헤더 우회와 인증 SQLi이며, 이는 파일이 아니라 기법을 교차 확인해 준다. 나머지 네 건은 파일명과 해당 제품의 알려진 권고에 근거하며, 그렇게 표기했다.
여섯 건 전반의 양상은 동일하다. 모든 권고가 2026년의 것이고, 여러 건은 같은 분기의 것이며, 독자적 연구는 전혀 없다. keyHunter는 오픈소스 LLM 프록시 생태계에서 최근 공개된 고위험 결함을 공개 직후에 산업화한다. 그것은 짧은 기간이며, 개발자 한 명이 설치한 뒤 그대로 방치되는 경우가 많은 종류의 소프트웨어에서 일어난다.
의도: 대회 서사와 결과 디렉터리
공격자는 이것을 자신의 에이전트에게 대회 출품작이라고 설명한다. 복원된 대화 전반에서 어휘가 일관된다. 比赛项目(대회 프로젝트), 评委(심사위원), 答辩材料(구두 발표 자료), contest-kit 디렉터리, 그리고 第一轮과 第二轮, 즉 1라운드와 2라운드로 정리된 작업이 그것이다.
범위에 대해 질문을 받자 공격자는 표적이 기본 자격 증명이라는 점을 분명히 밝힌다. 원문은 다음과 같다.
llm 的主要就是那几个默认密码为主流,用自己的 sk 那种没办法抓到啊
LLM 쪽은 주로 그 몇 개 기본 비밀번호가 대세이고, 자기
sk-*키를 쓰는 쪽은 잡을 방법이 없다.
에이전트는 이에 동의하며, 인증 시도가 세 가지 경우, 즉 인증 없음, sk-test, sk-1234에 국한된다고 확인한다. 마지막 값은 LiteLLM 자체 퀵스타트 문서가 사용하는 키다.
그리고 /root/keyHunter-skill/results/가 있다. 그 목록에는 원격 코드 실행, SQL 인젝션, 템플릿 인젝션, 서버 사이드 요청 위조, Sub2API 대상 세션 하이재킹, 자격 증명 스프레이, 사용자 토큰 유출, 할당량 초과에 해당하는 파일들이 있고, Stripe 웹훅 우회에 해당하는 파일이 두 개 있으며 그중 하나는 newapi_stripe_exploited.json이다. 당사는 파일명과 일부 파일의 크기를 확보했고, Stripe 우회 결과는 2.4 MB에 이르지만 그 내용은 전달되지 않았다. 방어할 수 있는 진술은 공격자가 New-API를 대상으로 무제한 할당량 결제 우회 도구를 만들어 실행했다는 것, 그리고 CVE-2026-41432가 바로 그런 종류의 실재하는 취약점이라는 것이다. 그 2.4 MB의 기록이 완료된 부정 충전인지 시도에 불과한지는 당사가 확인할 수 없다. 파일명의 _exploited는 공격자가 붙인 표현이며, 당사는 그 기록을 읽지 않았다.
당사는 두 해석을 모두 열어둔다. 대회는 진짜이고, 익스플로잇은 로그를 남기는 에이전트와는 논의하지 않는 별개의 작업 갈래일 수 있다. 아니면 대회가 탈취 작전의 위장일 수 있다. 당사는 이 구분이 방어자에게는 무의미하다고 평가한다. 어느 해석에서든 역량과 노출된 패널에 대한 위험은 동일하다.
운용 기법의 빈틈: 공격자 자신의 에이전트가 도구를 감사했다
복원된 대화에서 가장 유용한 대목은 코드 리뷰다. 공격자가 에이전트에게 스캔 적중률이 왜 이렇게 낮은지 물었고, 에이전트는 스캐너를 한 줄씩 검토했다.
에이전트의 답변을, 방어자가 활용할 수 있는 수준으로 압축하면 이렇다. 스캐너는 이미 프로토콜을 포함하고 있는 경우가 많은 FOFA host 필드 앞에 프로토콜을 덧붙여 https://https://<target> 형태의 URL을 만들어 냈고, 그래서 살아 있는 호스트가 죽은 것으로 기록되고 있었다. 스레드 풀은 완료 순서가 아니라 생성 순서로 결과를 수집하므로, 느린 요청 하나가 그 뒤의 모든 것을 막는다. 4코어 시스템에서 CONCURRENCY=200은 스스로 타임아웃을 만들어 낸다. IP 단위 중복 제거는 같은 주소의 다른 유효 포트를 버린다. temperature를 고정하면 호환성 오류를 실패로 오독한다.
허니팟 탐지에 대해서는 에이전트가 직설적이었다. 주로 응답이 동일한지, 또는 5자 미만으로 짧은지로 판단하는데, 이는 정상 모델을 걸러내면서 잘 만든 디코이는 놓친다. 그리고 공격자가 중국어가 아닌 응답자를 식별해 달라고 요청했음에도, 코드에는 언어 탐지 로직이 전혀 없었다.
에이전트는 이들의 보안 위생도 지적했다. 스크립트에 하드코딩된 FOFA 키, 실제 사용자가 /home/developer인데도 /root 기준으로 작성된 절대 경로, 모든 실패 원인을 삼켜버리는 except: pass, 국가별로 별도 복사된 스크립트, 그리고 접근 통제나 마스킹 없이 대상과 인증 수단을 담고 있는 결과 파일이 그것이다.
마지막 지점은 이 깔때기를 다시 보게 한다. 미국의 적중률 0.61%는 알려진 버그가 있는 스캐너를 통해 측정한 노출도이므로, 실제 LiteLLM 노출 비율은 공격자 자신의 결과가 보여주는 수치보다 높다. 그리고 이들에게는 이제 그 버그를 계속 고쳐 줄 에이전트가 있다.
수익화 인프라
같은 호스트는 이들 자신의 New-API 인스턴스도 운용한다. Docker의 calciumion/new-api:latest로 포트 8901에 공개되어 있고, 데이터는 스캔 결과 옆에 바인드 마운트되어 있다. 그 주변에 newapi_watchdog.py, 채널 백업 파일, 그리고 전체를 묶어 압축한 사본이 놓여 있다.
New-API는 집계 패널이다. 상위 제공사 키를 다수 받아, 자체 사용자 계정과 할당량을 갖춘 하나의 API로 제공한다. 키 수집 파이프라인 옆에 이것을 세워둔 목적은 명백하다. 수집한 키는 패널의 채널이 되고, 패널은 판매할 수 있는 접근 권한이 된다. 당사는 재판매를 관측하지 않았고 이를 주장하지도 않는다. 다만 그에 필요한 설비가 설치되어 가동 중이다.
sub2api와 new-api 템플릿으로 구축된 유사한 무료 라우터가 이미 수백 개 유통되고 있으며, keyHunter는 그 생태계 안의 한 작전이다.
클러스터 연관성
클라이언트 핑거프린팅은 이 두 호스트를 같은 표면을 노리는 느슨한 집합과 연결한다. CVE 스캔과 키 발급을 수행하는 대만 호스트, 동일한 SQL 인젝션을 던지는 홍콩 호스트, 그리고 한 단계 더 떨어진 곳에 LLM 패널 사냥꾼과 Ray 대시보드 익스플로잇 행위자가 있으며, 이들의 단일 일자 집중 활동은 6일 간격인 8월 15일과 21일에 있었다. 일부 겹침은 범용 클라이언트 스택에서 발생하므로, 이는 한 사람이 한 키보드를 두드린 것이 아니라 도구와 활동 무대를 공유하는 양상으로 읽힌다. LLM 프록시 사냥 도구를 공유하는 중국 연계 커뮤니티로 취급하면 된다. 어떤 지표도 이를 이름이 알려진 APT와 연결하지 않으므로, 당사는 이를 활동 클러스터로 추적한다.
침해 지표
네트워크 및 인프라, 디팽 표기:
| 지표 | 역할 |
|---|---|
39.98.82[.]200 | 에이전트 게이트웨이, 정찰, SQL 인젝션 (Alibaba Cloud, AS37963, CN) |
101.43.41[.]72 | 포트 8087의 중계 엔드포인트, 위임된 서브에이전트 워커 (Tencent Cloud, AS45090, CN) |
hamal.cc[.]cd | 스캐너가 질의하는 비공식 FOFA 미러 |
cae332848db5… | litellm_scan_hw.py에 하드코딩된 공격자 자신의 FOFA API 키. 여기서는 축약했으며, 전체 값은 공개하지 않고 FOFA에 보고하기 위해 보관하고 있다 |
클라이언트 핑거프린트 및 사용자 에이전트:
po11nn070000_ebbca96fac43_00000000 shared across both nodes
Hermes-Agent/0.18.0
Hermes-Panel/1.0
Mozilla/5.0 (CVE-2026-49468-Scanner)
호스트 산출물. 아래는 공격자 시스템상의 경로이며, 유사 호스트나 두 번째 배포를 헌팅하는 데 유용하다.
/home/developer/litellm_verifier.py real-chat verifier and honeypot classifier
/home/developer/test_litellm_verifier.py unit tests
/home/developer/litellm_endpoint.py endpoint normalise and dedupe
/home/developer/litellm_scan_hw.py FOFA scanner, US, AWS excluded
/home/developer/litellm_scan_gb_hw.py
/home/developer/litellm_scan_it_hw.py
/home/developer/litellm_scan_us_30d_optimized.py
/home/developer/contest-kit/keyHunter-skill/
/home/developer/backups/litellm_verifier_round2_<ts>/SHA256SUMS
/root/keyHunter-skill/results/
/root/keyHunter-skill/{honeypot_test.py, verify_country_models.py, add_to_panel.py, report.py}
/root/.ssh/hw_vm_key key to the scanning VM, developer@127.0.0.1:8888
/opt/hermes-simple-panel/app.py config panel, port 9120
/root/new-api.tar.gz, /root/newapi_watchdog.py
스킬 및 프로젝트 이름으로, 단일 문자열 피벗으로는 가장 강력하다.
keyhunter / keyHunter
contest-kit
ai-proxy-panel-audit
fofa-panel-recon
delegation-orchestration
행위 기반:
FOFA: (title="LiteLLM" || body="LiteLLM") && country="XX" && org!="AMAZON-AES"
auth: no credential, then sk-test, then sk-1234
SQLi: ' OR '1'='1 in the API key field
verify: a real chat completion per advertised model; a /models listing alone is rejected
verdict strings: honeypot_or_unusable, trusted_pass, unavailable,
formatted_false_success, non_chinese_evidence
services on actor infra: new-api :8901, config panel :9120, agent gateway
탐지
인터넷에서 접근 가능한 LLM 프록시를 운영한다면, 이 전체 순서는 게이트웨이 자체 로그에서 확인할 수 있다. 대부분의 SIEM 플랫폼이 가져올 수 있는 벤더 중립 규칙 형식인 Sigma로 표현하면 다음과 같다.
title: AI proxy panel enumeration consistent with keyHunter
id: 2c6f9a41-8e07-4b53-9f1a-7d0c4b62ae35
status: experimental
description: >
The keyHunter discovery and verification sequence against an exposed LLM
proxy: an unauthenticated model listing followed by per-model chat
completions from the same source, or one of the cluster's user agents.
references:
- https://kinryu.sh/reports/keyhunter-llm-proxy-key-harvesting/
logsource:
category: webserver
detection:
model_listing:
cs-uri-stem|endswith:
- '/v1/models'
- '/models'
admin_paths:
cs-uri-stem|startswith:
- '/key/'
- '/user/'
- '/organization/'
cluster_agents:
c-useragent|contains:
- 'Hermes-Agent'
- 'Hermes-Panel'
- 'CVE-2026-49468-Scanner'
admin_allowlist:
c-ip|cidr: '10.0.0.0/8' # replace with your own admin range
condition: (((model_listing or admin_paths) and not admin_allowlist) or cluster_agents)
falsepositives:
- Client libraries that legitimately call /v1/models on startup from allow-listed ranges
level: high
웹 접근 로그는 Authorization 헤더를 기록하지 않으므로, 기본 자격 증명 시도와 인젝션 시도는 프록시 자체의 요청 로깅에서 포착해야 한다. 문자열 그대로의 sk-1234와 sk-test, 자격 증명 부재, 그리고 키 필드의 ' OR '1'='1이 대상이다.
규칙 엔진이 필요하지 않은 행위 기반 헌팅 세 가지:
- 하나의 출처가 모델 목록을 조회한 뒤 각 모델에 짧은 chat completion을 정확히 한 번씩 차례로 보내는 패턴을 찾는다. 그 검증 스윕이 이 작전의 서명이며 위장하기 어렵다.
- API 파라미터를 무시하고 모델에게 실제 정체를 밝히라고 요구하는 프롬프트에 경보를 설정한다. 이는 훔친 접근 권한을 신뢰하기 전에 구매자가 수행하는 확인이다.
- 패널의 채널 목록과 사용자 테이블을 주기적으로 비교한다. 키 추출과 계정 내보내기는 패널이 정상 동작하는 상태를 그대로 남기므로, 다른 무엇도 알려주지 않는다.
대응 방안
인터넷에 노출된 LLM 프록시는 노출된 시점부터 침해된 것으로 취급한다. keyHunter는 하루에 한 국가를 훑고, 공개된 CVE를 공개 후 몇 주 안에 활용한다.
- LiteLLM, One-API, New-API, Sub2API 및 유사 제품은 인증을 수행하는 리버스 프록시 뒤나 사설망에 둔다. 이들 가운데 인터넷 노출을 견딜 수 있는 기본값을 제공하는 것은 없다.
- 최신 버전으로 패치한다. 위의 권고 여섯 건 중 LiteLLM RCE는 CISA Known Exploited Vulnerabilities 목록에 있고, Sub2API 계정 탈취는 실제 공격에서의 악용이 확인되었다.
- 마스터 키를 변경한다.
sk-1234는 LiteLLM 자체 퀵스타트에 나오는 값이며, 이 공격자가 시도해 보는 단 세 개의 자격 증명 중 하나다. /openapi.json과/docs를 제한한다. 익명 클라이언트가 관리용 API 표면을 다운로드할 수 있어서는 안 된다.- 모든 가상 키에 예산 상한과 범위를 설정해, 추출되더라도 재판매할 가치가 없는 것만 얻게 한다.
- New-API를 통해 Stripe 결제를 받는다면, 웹훅 서명 시크릿이 실제로 설정되어 있는지 확인한다. 빈 시크릿이 CVE-2026-41432의 전부다.
- 노출된 적이 없었다고 증명할 수 없는 패널에 한 번이라도 들어간 상위 제공사 키는 모두 교체한다.
MITRE ATT&CK 매핑
| 전술 | 기법 |
|---|---|
| 정찰 | T1596.005 Search Open Technical Databases: Scan Databases (FOFA, 국가별, AWS 제외); T1595.002 Active Scanning: Vulnerability Scanning (경량 및 심층 HTTP 프로빙) |
| 자원 개발 | T1583.003 Acquire Infrastructure: Virtual Private Server (Alibaba, Tencent, Huawei); T1588.002 Obtain Capabilities: Tool (Hermes Agent, OpenClaw, FOFA 구독, 추론 엔진으로서의 github_copilot/gpt-5.6-sol) |
| 초기 접근 | T1190 Exploit Public-Facing Application (LiteLLM, Sub2API, New-API를 대상으로 한 Host 헤더 인증 우회, 사전 인증 SQL 인젝션, 명령 인젝션, SSTI, SSRF) |
| 방어 회피 | T1480 Execution Guardrails (허니팟 분류, non_chinese_evidence 점수화, org!="AMAZON-AES" 필터링) |
| 자격 증명 접근 | T1078.001 Valid Accounts: Default Accounts (자격 증명 없음, sk-test, sk-1234); T1552.001 Unsecured Credentials: Credentials In Files (exported_keys.json으로의 키 추출) |
| 탐색 | T1518 Software Discovery (모델 목록 조회 및 모델별 검증); T1087 Account Discovery (관리 평면 대상 사용자 열거) |
| 수집 | T1213 Data from Information Repositories (계정 내보내기, 정규화, 보관) |
| 명령 및 제어 | T1102 Web Service (작업 지시 채널로 사용된 WeChat 스레드) |
| 영향 | T1657 Financial Theft (Stripe 웹훅 우회, 할당량 초과); T1496 Resource Hijacking (수집한 추론의 재판매 설비) |
방법론 및 분석관 주석
위 내용의 거의 전부는 2026년 8월 16일부터 20일 사이에 공격자 자신의 에이전트가 당사 허니팟 중 하나에 전송한 출력이다. 개별 파일 경로 283개, 서비스 및 컨테이너 목록, 스캔 결과 요약, 그리고 에이전트가 자신의 WeChat 기억을 검색한 내역이 포함된다.
따라서 당사가 확보한 것은 이들의 실제 시스템의 일부이며, 그 에이전트가 우연히 열거한 범위로 한정된다. 어떤 파일의 내용도 전달되지 않았고, 당사는 공격자 자신의 디렉터리 목록에서 나온 파일명, 크기, 타임스탬프만 보유한다. 스캔 산출량과 판정 집계는 이들의 도구가 보고한 공격자 자신의 수치이며, 당사는 그 어느 것도 독자적으로 검증하지 않았다. 이들의 에이전트가 스캐너에서 실제 버그를 찾아냈으므로, 적중률은 노출도의 측정값이 아니라 하한으로 읽어야 한다.
중국어 대화는 번역한 것이다. 기술 문자열, 경로, 식별자는 이 보고서와 번역본 모두에서 원문 그대로 두었다.
이 자료가 뒷받침하는 범위에는 네 가지 한계가 있다. 귀속은 전 과정에서 중국어를 사용하는, 중국 기반 인프라상의 활동 클러스터 수준에서 멈추며, 이름이 알려진 그룹과의 연결은 없고 당사도 제시하지 않는다. 의도는 대회 출품작과 탈취 작전 사이에서 실제로 모호하다. 어떤 익스플로잇 파일의 내용도 전달되지 않았으므로 여섯 건의 CVE 매핑은 모두 파일명에 근거하며, 그중 두 건은 해당 기법이 당사 센서에 도달하는 것을 독자적으로 관측했고 이는 파일이 아니라 기법을 교차 확인해 준다. 훔친 키가 이후 실제로 소비되었는지는 알 수 없다. 공격자의 출력은 추출 3건, 내보내기 17건이라는 집계만 제공하며, 추적할 수 있는 키 값은 제공하지 않는다.
이들의 스캐너가 접촉한 제3자 주소는 공개하지 않으며, 이들이 스스로 허니팟으로 표시한 호스트도 포함된다. 그것은 타인의 연구에 속한다. 이들의 FOFA API 키는 여기서 축약했다.
전체 지표 집합과 기반 캡처는 연구자에게 요청 시 제공한다. contact@kinryu.sh.