이 페이지는 번역본입니다. 공식 원문은 영어판입니다. 영어로 읽기

litellm · mcp · cve-2026-42271 · kev · llm-abuse · honeypot-detection · sandbox-evasion

66초 만의 LiteLLM MCP 정찰: 허니팟 여부를 시험하는 스크립트 클라이언트

CVE-2026-42271은 LiteLLM의 MCP 테스트 엔드포인트에 존재하는 명령 주입 취약점이며(1.74.2부터 1.83.6까지, CVSS 8.7, 2026년 6월 8일 이후 CISA KEV 목록 등재), 9월 6일 한 클라이언트가 Kinryū Labs 디코이에서 LiteLLM의 MCP 도구 표면을 악용하였다. 66초 동안 스크립트화된 셸 명령 42건을 실행한 뒤, 해당 호스트가 허니팟인지 확인하는 점검 7건을 수행하고 이후 침묵하였다.

작성자 Davis Zheng·

CVE
CVE-2026-42271
CVSS
8.7

TLP:CLEAR. 공개 배포 승인. Kinryū Labs 허니팟 센서 네트워크에서 수집하였다. 아래 지표는 디팽 처리하였다.

핵심 요약

  • 42MCP 도구를 통해 밀어 넣은 셸 명령
  • 66 s첫 명령부터 마지막 명령까지
  • 7마지막 20초 동안 수행된 허니팟 점검
  • 19월 5일부터 12일까지 이 활동의 출처 수

CVE-2026-42271은 LiteLLM의 MCP 테스트 엔드포인트에 존재하는 명령 주입 취약점이며(1.74.2부터 1.83.6까지, CVSS 8.7, 2026년 6월 8일 이후 CISA KEV 목록 등재), 9월 6일 한 클라이언트가 Kinryū Labs의 LiteLLM 디코이에서 LiteLLM의 MCP 도구 표면을 악용하였다. 홍콩 VPS 주소에서 디코이의 MCP 도구 목록을 조회한 뒤, 66초 동안 해당 도구를 통해 셸 명령 42건을 밀어 넣었다. 나는 누구인가, 컨테이너 안인가, root의 SSH 키를 읽을 수 있는가, 여기는 어떤 네트워크인가를 확인하는 명령이었다. 마지막 20초는 호스트가 실제인지 확인하는 데 사용하였다. 마커 파일, 시각 읽기, /dev/urandom 인출, 시간을 측정한 sleep 세 건을 수행한 뒤 중단하였으며, 9월 12일까지 해당 출처에서 추가 활동은 없었다. 1.83.7 미만 LiteLLM을 운영하면서 4000 포트가 도달 가능하다면 업그레이드해야 한다. 탐지 절에는 요청 형태에 대한 규칙과 허니팟 시험에 대한 규칙이 각각 수록되어 있다.

요청은 /mcp의 tools/call로 향하였다. 권고문은 해당 결함을 /mcp-rest/test/* 엔드포인트에 있는 것으로 기술하지만 이 클라이언트는 그 엔드포인트를 건드리지 않았으므로, 본 보고서는 이 활동을 해당 CVE가 아니라 LiteLLM의 MCP 도구 표면 악용으로 기술한다.

핵심 판단

  • 단일 표적을 겨냥한 스크립트 실행이었다. 클라이언트는 66초 동안 도구 호출 42건을 전송하였으며, 버스트 내 명령 간격은 130에서 250 ms, 버스트 간 정지는 9에서 26초였고, 서로 다른 명령 37개를 사용하였다. 단일 주소에서 1회만 접근하였고, 9월 5일부터 12일 사이 이 활동의 유일한 출처였다. 신뢰도 중간.
  • 정찰 이후 클라이언트는 허니팟 점검 7건을 수행하고 중단하였다. 01:28:21과 01:28:41 사이에 stderr 라우팅, 셸 래퍼 처리, 오류 경로, 파일시스템 상태, 시각, 엔트로피, sleep 타이밍을 시험하였다. 마지막 명령은 sleep 8이었고, 9월 12일까지 해당 주소에서 추가 활동은 없었다. 신뢰도 중간.
  • 정찰은 호스트를 벗어날 경로를 찾고 있었다. root 계정의 개인키 디렉터리를 두 차례 조회하고, /proc/1/cgroup과 /proc/1/cmdline을 읽고, 네트워크 주소를 열거하였다. 개념 증명 확인에는 그중 어느 것도 필요하지 않다. 신뢰도 중간.
  • 프록시 키는 제시되지 않았다. 이 주소에서 온 /mcp 요청 중 프록시 키를 제시한 것은 없으며, 이는 Starlette Host 헤더 우회 CVE-2026-48710과 결합된 비인증 연쇄와 부합한다. 해당 요청이 그 우회를 타고 들어왔다는 것은 추론이다. 신뢰도 낮음.

타임라인

  • 01:24:44 UTC최초 접촉: TCP/4000의 /mcp에 대한 HTTP POST, Mozilla/5.0, MCP 도구 표면 열거.
  • 01:25:46 UTC동일한 클라이언트 프로필로 두 번째 열거 탐색.
  • 01:27:30 UTC클라이언트가 새로운 HTTP 클라이언트 지문과 함께 curl/8.20.0으로 전환하고 도구 표면을 다시 열거.
  • 01:27:35 UTC최초 명령 주입: command가 'id'인 bash 도구, 이어서 곧바로 /etc/hostname에 대한 read_file.
  • 01:27:44 UTC복합 정찰 한 줄 명령: hostname, uname -a, root 키 디렉터리 조회, cat /proc/1/cgroup.
  • 01:27:55 UTC두 번째 복합 명령: pwd, whoami, /proc/1/cgroup, ip a | grep inet, ls /.
  • 01:28:21 UTC디코이 탐지로 전환: stderr 리다이렉션, sh -c 및 bash -c 래퍼 처리, ls -la /etc/passwd.
  • 01:28:31 UTC오류 경로 및 상태 유지 시험: 존재하지 않는 경로와 파일, /tmp/marker_uniq_93817에 대한 touch 후 cat.
  • 01:28:32 UTC시각 및 엔트로피 시험: date +%s, head -c 50 /dev/urandom | base64.
  • 01:28:41 UTC타이밍 시험 sleep 0 / 5 / 8, 이후 세션 종료. 9월 12일까지 이 주소에서 추가 활동 없음.

세션 순서

01:27:35  id
01:27:44  hostname; uname -a | cut -c1-120; ls -la [root key directory] 2>&1 | head -5; cat /proc/1/cgroup 2>/dev/null | head -3
01:27:55  pwd; whoami; cat /proc/1/cgroup | head -2; ip a | grep inet | head -3; ls / | head -15
01:28:21  echo hi 1>&2
01:28:32  date +%s
01:28:32  head -c 50 /dev/urandom | base64
01:28:41  sleep 8

정찰은 root의 키와 컨테이너 경계를 곧바로 노렸다

클라이언트는 첫 3분 안에 서로 다른 두 개의 정체를 제시하였다. 01:24:44부터 Mozilla/5.0 사용자 에이전트로 도구 표면 열거 탐색 2건을 전송하였다. 3분이 채 지나지 않아 curl/8.20.0으로 바꾸었고, 그에 상응하여 HTTP 클라이언트 지문도 달라졌으며, tools/call을 통해 도구를 호출하기 시작하였다.

먼저 정체 확인용 명령인 id, hostname을 실행하고, 이어서 /etc/hostname에 대한 read_file을, 그다음 위 세션에 제시된 복합 한 줄 명령 두 건을 실행하였다.

스크립트는 root 계정의 개인키 디렉터리를 두 차례 조회하고 ip a | grep inet을 실행하였다. 개념 증명 확인에는 키 디렉터리 조회나 네트워크 열거가 필요하지 않으므로, 본 보고서는 이 정찰을 프록시 호스트를 벗어나기 위한 준비로 해석한다. /proc/1/cgroup과 /proc/1/cmdline 읽기는 셸이 컨테이너 내부에 있는지를 확인하는 동작이다.

01:28:21부터 클라이언트는 호스트에 대해 묻기를 멈추고 호스트를 시험하기 시작하였다

20초 동안 클라이언트는 자신이 실제 호스트와 통신하고 있는지 시험하였다. stderr가 자체 채널로 돌아오는지 확인하기 위해 echo hi 1>&2를 실행하였고, 셸 호출 처리를 확인하기 위해 sh -c와 bash -c 래퍼를 사용하였으며, 오류 경로의 충실도를 확인하기 위해 의도적으로 존재하지 않는 경로에 대해 ls와 cat을 실행하였다. 또한 호출 간에 파일시스템이 상태를 유지하는지 확인하기 위해 /tmp의 동일한 마커 파일에 대해 touch 후 cat을 수행하였고, 시각 진행 확인을 위해 date +%s, 엔트로피 확인을 위해 head -c 50 /dev/urandom | base64, 타이밍 충실도 확인을 위해 sleep 0, sleep 5, sleep 8을 실행하였다.

마지막 명령은 01:28:41의 sleep 8이었다. 9월 12일까지 이 주소에서 추가로 도착한 것은 없다. 중단한 이유는 알려지지 않았다. 이를 허니팟 시험에 이어 중단 결정이 있었던 것으로 해석하는 근거는 사건의 순서이며, 신뢰도는 중간이다.

LLM 프록시 엔드포인트를 신뢰하기 전에 허니팟인지 시험하는 운영자는 이 센서에서 새로운 존재가 아니다. keyHunter 보고서는 허니팟을 인식하도록 검증기를 구축한 운영자를 기술한다. 양자를 연결하는 지표는 없다.

귀속

타이밍이 한 가지는 확정한다. 이것은 스크립트였다. 66초 동안 호출 42건을 버스트로 발사하고, 버스트 내 명령 간격은 130에서 250 ms, 버스트 간 정지는 9에서 26초인 것은, 취약점을 악용하고 키와 컨테이너 경계를 찾고 호스트를 지문화한 뒤 빠져나가는 도구의 특징이다. 이는 표적형 운영자의 도구 모음이나 소진 회피 사전 필터를 갖춘 레드팀 프레임워크와 부합한다. 고정된 페이로드 하나를 반복 재생하고 되풀이해 돌아오는 상용 대량 악용과는 부합하지 않는다. 이 클라이언트는 명령 문자열 37개를 변형하였고, 1회만 접근하였으며, 9월 5일부터 12일 사이 이 활동의 유일한 출처였다. 충실도 점검 묶음은 허니팟 탐지 연구의 방식이기도 하므로 보안 연구 조사를 완전히 배제할 수는 없으나, 출처가 상용 홍콩 VPS 대역이고 클라이언트가 연구 주체임을 알리지 않으며 세션에서 root의 키 디렉터리를 조회하고 /etc/passwd를 읽었다는 점은 평판 있는 조사가 하지 않는 행위이다.

귀속은 여기서 더 나아가지 않는다. 해당 주소는 상용 호스팅인 AS140227(Hong Kong Communications International, 177.4.0[.]0/20)에 속한다. VirusTotal은 악성 판정 2건과 의심 판정 2건을 보여 주며 벤더 명명은 없고, 이 결함은 KEV에 등재되어 공개 개념 증명 코드가 존재하므로 역량은 주체에 대해 아무것도 말해 주지 않는다.

침해 지표

아래 네트워크 지표 하나는 디팽 처리하였다. 지문과 경로는 관측된 그대로 기재하였다.

네트워크

지표맥락
177.4.12[.]119월 5일부터 12일 사이 이 활동의 유일한 출처. 모든 요청이 TCP/4000의 /mcp로 향하였다. AS140227, 홍콩

호스트 아티팩트

지표맥락
/tmp/marker_uniq_<digits>허니팟 시험에서 기록한 뒤 다시 읽은 마커 파일. 이 세션에서 접미사는 93817이었으므로 패턴 단위로 헌팅할 것

행위

지표맥락
po11nn050000_6e4c6fcb1a9bcurl/8.20.0 명령 단계의 JA4H 방식 HTTP 클라이언트 지문
po11nn070000_39fa8e08ab4c초기 Mozilla/5.0 열거 단계의 JA4H 방식 HTTP 클라이언트 지문

탐지

Sigma

LiteLLM 프록시로 셸 명령을 전달하는 MCP tools/call (후보).

title: MCP tools/call Carrying A Shell Command To A LiteLLM Proxy
id: 5b0f6c1e-2f0a-4d0e-9a53-6b1d0f7a42c1
status: experimental
description: POST to a LiteLLM MCP endpoint whose JSON body invokes a tool with a command argument. Needs request-body logging at the reverse proxy; the body field name is a placeholder for whatever your proxy calls it. Any hit on LiteLLM below 1.83.7 should be treated as exploitation.
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-42271
logsource:
  category: webserver
detection:
  selection_request:
    cs-method: POST
    cs-uri-stem:
      - /mcp
      - /mcp-rest/test/connection
      - /mcp-rest/test/tools/list
  selection_call:
    request_body|contains: '"method": "tools/call"'
  selection_command:
    request_body|re: '"(command|args)"\s*:'
  condition: all of selection_*
falsepositives:
  - An MCP shell tool you expose on purpose to trusted clients
level: high

LLM 프록시 프로세스가 생성한 허니팟 충실도 점검 (후보).

title: Honeypot Fidelity Checks Spawned By An LLM Proxy Process
id: 0c9a7e52-8d1b-4a38-b0f4-3e5f2a9d7c10
status: experimental
description: A proxy process spawning the checks a client uses to decide whether the host is emulated. Seen immediately before the client abandoned the session. Works from ordinary process telemetry on the proxy host.
logsource:
  product: linux
  category: process_creation
detection:
  selection_parent:
    ParentImage|endswith:
      - /python
      - /python3
      - /litellm
  selection_checks:
    CommandLine|contains:
      - /dev/urandom
      - date +%s
      - /proc/1/cgroup
      - marker_uniq_
  condition: selection_parent and selection_checks
falsepositives:
  - Container entrypoint or health-check scripts that read /proc/1/cgroup
level: high

탐지 로직

  • 단일 출처에서 온 충실도 점검 묶음 (행위, 후보). 단일 출처에서 120초 이내에 /dev/urandom, ‘date +%s’, ‘^sleep [0-9]+$’, ‘echo .* 1>&2’, ’^(sh|bash) -c ’, 그리고 동일한 /tmp 경로에 대한 touch 후 cat에 해당하는 서로 다른 명령의 수를 집계한다. 범주가 3개 이상이면 클라이언트가 표적이 실제인지 판단하고 있다는 뜻이므로 전체 세션 캡처를 보존한다.
  • LiteLLM 기본 포트의 /mcp에 대한 비인증 POST (네트워크, 후보). 목적지 포트 4000, 메서드 POST, 경로 /mcp, 인증 헤더 없음. curl 단계 지문 po11nn050000_6e4c6fcb1a9b와 함께 사용한다.

대응 조치

  • LiteLLM을 1.83.7 이상으로 업그레이드한다. 해당 수정은 MCP 테스트 엔드포인트에 명령 허용 목록과 PROXY_ADMIN 역할 검사를 추가한다.
  • 즉시 업그레이드가 불가능하다면 리버스 프록시에서 POST /mcp-rest/test/connection과 POST /mcp-rest/test/tools/list를 차단하고, TCP/4000을 인터넷에 노출하지 않는다.
  • 동일 스택에서 Starlette Host 헤더 우회 CVE-2026-48710을 패치한다. 두 취약점이 연쇄되면 비인증 원격 코드 실행이 가능하다.
  • 프록시가 호출하도록 설정된 모든 MCP 서버를 목록화하고, 2차 주입 가능성을 위해 각 서버의 command와 args를 검토한다.
  • 프록시 프로세스 환경 또는 마운트된 자격 증명 파일에서 도달 가능한 모든 공급자 API 키, LITELLM_MASTER_KEY 값, 가상 키를 교체한다.
  • 호스트에서 /tmp/marker_uniq_를, 그리고 id, whoami, uname, getent 또는 root 계정 키 디렉터리 조회를 실행하는 프록시 프로세스의 자식 프로세스를 헌팅한다.

MITRE ATT&CK 매핑

전술기법관측 내용
초기 침투T1190 Exploit Public-Facing ApplicationTCP/4000에 노출된 LLM 프록시를 상대로 MCP tools/call 호출 42건을 수행하여 MCP 도구 표면을 악용하였다.
실행T1059.004 Command and Scripting Interpreter: Unix Shellsh -c 및 bash -c 래퍼를 포함한 셸 한 줄 명령으로 MCP bash 도구를 구동하였다.
탐색T1082 System Information Discoveryuname -a, cat /etc/os-release, uname -r, hostname -f, ls -la /, cat /proc/1/cmdline.
탐색T1033 System Owner/User Discoveryid, id -u, whoami, getent passwd root, cat /etc/passwd | head -3.
자격 증명 접근T1552.004 Unsecured Credentials: Private Keys첫 정찰 버스트에서 root 계정 개인키 디렉터리를 두 차례 조회하였다.
방어 회피T1497 Virtualization/Sandbox Evasion/proc/1/cgroup 컨테이너 확인, 이어서 마지막 20초의 점검 7건 묶음.
수집T1005 Data from Local System/etc/hostname에 대해 MCP read_file 도구를 호출하였다.

참고 자료

방법론 및 분석관 주석

본 보고서는 출처 주소 1개와 시각이 기록된 관측 10건에 근거하며, 센서 텔레메트리에서 읽어 내 공개 위협 인텔리전스 피드 및 보강 조회와 대조하였다. 대상 활동은 2026년 9월 6일의 활동과 9월 5일부터 12일까지의 피벗을 포괄한다. 이 활동은 탐색 단계에서 멈추었다. 세션이 끝나기 전까지 페이로드 인출, 지속성 확보, 외부 C2 시도는 없었다.

미해결 사항:

  • 177.4.12[.]11이 9월 6일 이전에 무엇을 하였는가.
  • 운영자가 중단 이후 어디로 갔는가.
  • 마커 접미사 93817은 도구에 고정된 값인가, 실행마다 생성되는 값인가.
  • 이 점검 묶음이 공개된 익스플로잇이나 허니팟 탐지 도구와 일치하는가.
  • 프록시 키가 필요했는가, 아니면 요청이 Host 헤더 우회 CVE-2026-48710을 타고 들어왔는가.

문의 또는 정정: [email protected].

How to cite
Kinryū Labs (2026). 66초 만의 LiteLLM MCP 정찰: 허니팟 여부를 시험하는 스크립트 클라이언트. https://kinryu.sh/ko/reports/litellm-mcp-scripted-honeypot-test/