핵심 요약
Akamai Hunt는 정상적인 대규모 언어 모델(LLM) API 엔드포인트 뒤에 숨으려는 새로운 멀웨어 변종을 발견했습니다.
이 멀웨어는 일반적인 스키마를 사용하는 대신 Base64로 인코딩된 것처럼 보이는 문자열을 전송해 명령 및 제어(C2) 연결을 설정합니다.
이것이 악용되면 공격자의 완전한 제어 및 데이터 유출로 이어질 수 있습니다.
이는 공격자들이 공격 방법론을 빠르게 발전시키고 있음을 보여주는 또 다른 예로, 기업이 이러한 최신 위협에 대비해야 할 필요성을 강조합니다.
서론
위협 환경은 엄청난 속도로 진화하고 있으며 공격자들은 빠르게 적응하고 있습니다. 대규모 언어 모델(LLM)이 기업 내에서 널리 사용됨에 따라 공격자들이 통신 패턴을 파악해 악성 트래픽을 대놓고 보이는 곳에 숨길 수 있게 되었습니다.
보안팀 직원들이 LLM을 사용해 알림을 조사하고, 요약하고, 다양한 지표의 상관관계를 파악함으로써 AI를 탐지 파이프라인에 빠르게 통합하고 있는 동시에 멀웨어 작성자들도 AI를 사용한 실험을 진행하고 있습니다. LameHug 및 PromptLock 같은 멀웨어를 통해 이미 증거가 확인되고 있습니다. 이는 텍스트 생성을 위해 설계된 LLM이 악의적인 목적으로 악용될 수 있음을 보여줍니다.
공격자들이 SesameOp 백도어에서 명령 및 제어(C2) 인프라에 OpenAI의 API를 사용하는 사례도 확인되었습니다. 이는 AI 세상에서 완전히 새로운 공격 표면이 등장했음을 잘 보여줍니다.
최근 Akamai Hunt팀은 악성 트래픽을 수많은 LLM API 요청 속에 심어 LLM 악용에 대한 새로운 접근 방식을 이용하는 새로운 멀웨어를 발견했습니다. 이 블로그 게시물에서 Hunt팀은 Hunt 고객에게 서비스를 제공하는 과정에서 발견한 새로운 위협의 예를 공유합니다.
엔드포인트 악용
멀웨어에서 새로운 LLM 사용법을 찾아내는 동안 한 파일이 저희의 관심을 끌었습니다. 이 파일은 이미 VirusTotal에서 악성인 것으로 분류되었으며 여러 YARA 룰과 일치했습니다. 조사를 시작하면서 LLM을 통한 또 다른 코드 생성 패턴과 피해자에 대한 코드 실행을 확인하게 될 것으로 예상했습니다.
이 멀웨어는 먼저 소켓을 사용해 IP 주소 39.97.57[.]244에 연결하려고 시도하지만 일단 실패하면 HTTP C2(1347790942-k1bok35vg3.ap-guangzhou.tencentscf[.]com/v1/chat/completions)로 폴백합니다.
API에 대한 첫 번째 HTTP 요청을 관찰한 후, 저희는 해당 요청이 이러한 종류의 요청에 필요한 헤더를 따르지 않는다는 사실에 놀랐습니다.
API 엔드포인트
리서치의 일환으로 LLM API 엔드포인트의 사용법, 특히 /v1/chat/completions를 찾아보았습니다.
OpenAI의 문서에서 볼 수 있듯이 이 엔드포인트는 '지정된 채팅 대화에 대한 모델 응답을 생성합니다'(그림 1 및 그림 2).
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-5",
"messages": [
{
"role": "developer",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'
{
"id": "chatcmpl-B9MBs8CjcvOU2jLn4n570S5qMJKcT",
"object": "chat.completion",
"created": 1741569952,
"model": "gpt-4.1-2025-04-14",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! How can I assist you today?",
"refusal": null,
"annotations": []
},
...
/v1/chat/completions 엔드포인트는 OpenAI에 의해 도입되었으며, OpenAI 호환 API를 제공하는 여러 공급업체와 게이트웨이(예: OpenRouter 및 Hugging Face)에 의해 빠르게 에뮬레이션되었습니다.
그러나 유사한 요청 스키마에도 불구하고 다른 벤더사의 공식 API는 서로 다른 네이티브 엔드포인트를 사용하거나 매개변수, 인증, 스트리밍 동작이 다를 수 있습니다.
요청 스키마
일반적으로 이 API를 사용할 때는 다음과 같은 필수 매개변수를 추가해야 합니다.
권한 부여: 요청을 인증하려면 '권한 확인: 베어러 YOUR_API_KEY' 형식의 베어러 토큰 헤더가 필요함
모델: 엔드포인트가 요청을 라우팅할 채팅 가능 모델(예: gpt-3.5-turbo 또는 Llama-4-Maverick-17B-128E-Instruct-FP8)을 선택하는 문자열 식별자
메시지: 모델이 다음 회신을 생성하는 데 사용할 대화 기록을 나타내는 역할 태그가 지정된 메시지 오브젝트 배열(역할 및 콘텐츠 포함)
앞서 언급했듯이, 저희는 이 엔드포인트가 실제로 악의적으로 사용되는 것을 이미 목격했습니다. LameHug가 그 예입니다. 멀웨어 작성자는 동일한 엔드포인트를 사용해 Hugging Face에서 LLM 모델에 접속한 후 특정 명령어를 요청하고 피해자에 대해 실행할 코드를 동적으로 생성했습니다(그림 3).
채팅 완료를 통한 위장
저희가 이 바이너리를 분석할 때 처음으로 알아낸 것은 해당 바이너리가 언급된 필드 중 어떤 것도 사용하지 않는다는 사실이었습니다. 대신 이 바이너리는 Base64로 인코딩된 것처럼 보이는 문자열을 보냅니다(그림 4).
이론적으로 이 API 뒤에는 LLM이 있을 수 있습니다. 즉, 공격자가 맞춤형 코드를 사용해 서버 측에서 프롬프트를 만들 수 있습니다. 그러나 이 경우 이 API 엔드포인트를 사용하는 이유는 위장하기 위해서이기도 합니다.
Akamai API Security 제품의 데이터를 관찰한 결과, 고객으로부터 151개의 고유한 엔드포인트를 확인했습니다. 이러한 엔드포인트의 모든 대화는 해당 스키마와 유사했습니다. 일부 API는 'messages' 대신 'query'를 사용하지만 모든 세션 내에 매우 명확한 유사점이 존재합니다.
이는 모든 사람이 /v1/chat/completions 엔드포인트를 자체적으로 개발할 수 있고 이 엔드포인트와 관련된 RFC(Request for Comments)가 없지만 개발자들이 사용하는 사실상의 표준이 여전히 존재한다는 것을 의미합니다.
추가 리서치
본문을 디코딩하고 0xBB로 XOR한 후, 저희는 피해자에 대해 수행된 잠재적 첫 번째 정찰 요청을 발견했습니다.
저희는 응답의 구문 분석 프로세스를 따라 멀웨어가 원래 API 스키마와 일치하지 않는 응답을 요청한다는 사실을 관찰했습니다. 이는 XOR 및 Base64를 사용해 수신된 데이터를 해독해 처리한 다음 응답에 제공된 명령을 따릅니다(그림 5).
C2 서버 1347790942-k1bok35vg3.ap-guangzhou.tencentscf[.]com은 Tencent에서 운영하는 클라우드 컴퓨팅 서비스인 Tencent Cloud의 서버리스 클라우드 기능(AWS Lambda 또는 Azure Functions와 유사)입니다. 공격자는 클라우드 기능을 C2 서버로 사용해 안정적이고 정상 트래픽과 구분하기 어려운 자동 확장 인프라를 실행할 수 있습니다.
AI 에이전트, 통합, 자동화 툴이 등장하면서 이러한 API 엔드포인트의 사용이 점차 보편화됨에 따라 공격자들이 보안팀 직원 및 네트워크 관리자에게 더 정상적인 것처럼 보이기 위해 이 특정 엔드포인트를 노출하기로 선택한 것이라고 추측됩니다.
이 멀웨어는 여러 가지 명령을 지원하므로 피해자에 대한 완전한 원격 제어 기능을 갖춘 원격 접속 트로이 목마(RAT)로 분류됩니다. Akamai는 이 멀웨어가 모두 동일한 엔드포인트와 통신하는지 확인하기 위해 분석을 실시했습니다(분석 정보는 부록 참조).
예를 들어, 그림 6은 $HunterInfo 명령의 아웃풋입니다. 이는 특정 원격 접속 툴의 설정 파일을 찾고 첫 번째 메시지가 전송되는 방식과 동일하게 /v1/chat/completions로 데이터를 유출합니다(XOR 및 Base64 사용).
이 멀웨어에는 0x88로 XOR되고 Base64로 인코딩된 세 개의 임베딩된 파일도 포함되어 있습니다.
모두 net_test.exe라는 이름의 .NET 파일입니다. 세 파일은 함께 피해자의 네트워크에서 SOCKS5 또는 HTTP를 사용해 작은 프록시 툴킷을 오케스트레이션합니다. 파일 중 두 개는 SOCKS5 및 HTTP 서버이고, 세 번째는 트래픽을 수신하고 전달할 수 있는 클라이언트입니다(그림 7).
추가 파일
저희는 이 멀웨어의 이전 변종을 발견했습니다(이 게시물의 IOC 섹션에서 해시 참조). 이전 변종의 경우 비슷한 명령을 가지고 있었고 여러 원격 접속 툴($HunterInfo)과 동일한 하드 코딩된 경로를 가지고 있었지만 C2 서버는 달랐습니다.
또한 VirusTotal에서 C2 서버와 관련된 RAR 파일을 발견했습니다. 이 RAR에는 .lnk 파일(个人简历.lnk, '이력서' 또는 'CV'로 번역됨)이 포함되어 있으며, ftp -s””:_/_/_/_/_/_/_/_/_를 실행합니다. 이 RAR의 경우 중첩된 디렉터리 안에 .doc 파일도 포함되어 있지만 해당 콘텐츠는 바이너리 코드입니다(그림 8).
'_' 파일은 문서를 세 개의 PE 파일로 구성하고 그러한 파일을 C:\Users\Public\Update에 복사합니다.
그리고 결국에는 다음을 호출합니다.
!call start /min C:\Users\Public\Update\svchost.exe -InstallLsp
C:\Users\Public\Update\360.%TIME:~4,1% >nul(그림 9)
10개의 서로 다른 .doc 파일(0–9.doc)이 있으며, 이는 일부 무작위 바이트를 제외하고 유사합니다. %TIME:~4,1%는 %H:%M:%S.%f 포맷에서 현재 분의 두 번째 숫자를 계산합니다. 해당 문서는 MZ 헤더를 건너뜁니다. 아마도 시그니처 스캔을 피하기 위해서인 것으로 보입니다. 스크립트는 현재 시간을 기준으로 문서 파일에 헤더를 구성하고 이를 C:\Users\Public\Update\360.<minute>에 복사합니다.
svchost.exe
이 파일은 사실 Sangfor Technologies의 검증되고 서명된 파일인 'SangforPromote.exe'입니다. 인수 -InstallLsp 및 DLL을 지정하면 정상적인 파일이 DLL을 로딩하고 해당 내보내기로 포인터를 설정합니다(LoadLibrary 사용)(그림 10).
360 DLL
360이라는 DLL은 읽기, 쓰기, 실행(RWX) 권한으로 메모리를 할당하고 'sc'를 읽은 다음 실행합니다.
sc
로딩된 코드는 sc를 분석하며 LoadLibrary 및 GetProcAddress를 사용해 함수를 확인합니다. 여기에는 HTTP 요청을 전송하는 하드 코딩된 두 개의 목적지가 있으며, 이는 저희가 분석한 멀웨어의 C2 주소와 일치합니다.
https://1347790942-k1bok35vg3.ap-guangzhou.tencentscf[.]com
39.97.57[.]244
또한 해당 코드는 이전 샘플과 마찬가지로 Base64와 XOR로 데이터를 디코딩해 툴세트 간의 연결을 만듭니다. 저희는 이 흐름으로 인해 최종 RAT가 피해자의 파일 시스템으로 다운로드된다고 생각합니다(그림 11).
Akamai Hunt 보호 및 방어
Akamai Hunt 고객은 이러한 아티팩트를 연중무휴 24시간 지속적으로 모니터링함으로써 관련 공격을 방어할 수 있습니다(그림 12).
Hunt의 적응형 세그멘테이션 기능은 활성 위협이 탐지되기 전에도 기업이 노출을 줄이고 리스크를 차단하는 데 도움이 됩니다. 적응형 세그멘테이션은 정상적인 통신 흐름과 자산 행동을 분석함으로써 AI 엔드포인트에 대한 불필요한 아웃바운드 접속을 제한하고, 개발 및 프로덕션 환경을 격리하고, 잠재적인 측면 이동 경로를 최소화하는 정책을 안내할 수 있습니다.
이 기능은 지속적인 가시성을 새로운 LLM 기반 위협에 대한 선제적 안정성으로 전환해 탐지 범위를 넘어 Hunt의 보호 역량을 확장합니다.
결론
공격자는 LLM 서비스의 보편성과 급속한 발전을 악용해 /v1/chat/completions 엔드포인트를 통해 유출과 C2를 라우팅하려는 전략적 결정을 내립니다. 이 접근 방식은 기존 클라우드 인프라를 활용해 정상적인 기업 트래픽에 자연스럽게 침투하는 통신 채널을 구축하므로 높은 잠재적 ROI를 제공합니다.
이 기법이 현대 환경에 널리 퍼진 다음과 같은 세 가지 트렌드에 맞아떨어지면서 위험이 생겨납니다. 이 세 가지 트렌드로 인해 표면적 검사에서 정상으로 보이는 안정적이고 은밀한 C2 경로가 공격자에게 제공될 수 있습니다.
광범위하고 종종 검사되지 않는 클라우드 API에 대한 아웃바운드 HTTPS
머신 생성 트래픽(AI 에이전트, 앱, 통합)에 대한 허용 범위 증가
공격자가 사용할 수 있는 안정적이고 수명이 긴 엔드포인트를 제공하는 클라우드 호스팅의 간편한 가용성
보안팀 직원들이 LLM의 작동 방식과 LLM이 유발하는 위협에 대해 현장에서 학습하고 있는 것이 현실입니다. 트래픽이 충분히 정상적인 것으로 보이면 적절한 보호 조치 없이 통과할 가능성이 있습니다. 때로는 대놓고 보이는 곳에 숨어 있는 것이 가장 쉬운 방법일 수도 있습니다.
정상적인 LLM 서비스로 향하는 트래픽 내부에 악성 페이로드를 숨김으로써 점점 더 흔해지고 있는 네트워크 패턴에 편승해 통신이 탐지되거나 조사될 가능성이 낮아지게 됩니다. 많은 기업이 AI 툴과 자동화를 도입함에 따라 LLM 엔드포인트로 향하는 트래픽이 일반적인 사례로 전환되고 있으며, 이러한 상황 속에서 공격자들은 기회를 찾고 있습니다.
IOC
IOC |
유형 |
|---|---|
93cf0d545a872c393c053031570bc5eaebfa1aa6a0860fd0b08b679b8ce52fd2 - RAT |
해시 |
10c444262994c05930394388e6112ddd98b83118661868bccd83b1fa61160a62 - 1.rar |
해시 |
91c43e7ddd98af63d6b1b130e997b909100f3eaf71e30511858cca4348b509db - _ |
해시 |
9f119d05403b1e079893fb77f6b8b2a9682d1df7ced31a189e7490924ccfb170 - 个人简历.lnk |
해시 |
b7dcf661844e6f3e94eb140a79787be6dad77c09ab0b97cf41a62afd07219190 - 이전 변종, 2025년 5월 |
해시 |
2e395436e97eaad9a087825d22005b6afc55044abf458604a5118c2ac9bde42a - 이전 변종, 2025년 9월 |
해시 |
67ea3ea3c58a57dbbdac48d4ce3d546816f715eaf32bec33a64a63c91541e697 - net_test.exe(클라이언트) |
해시 |
195c283703ee7df7c7ef17c85b0fdf88de22348bb0755daf5f0c3ed319c8d88a - net_test.exe(SOCKS5 서버) |
해시 |
e513d12abd03a4e07788dd85888d187cb6ca6e69a59f22f00853cae0a0b34712 - net_test.exe(HTTP 서버) |
해시 |
1347790942-k1bok35vg3.ap-guangzhou.tencentscf[.]com/v1/chat/completions |
URL |
39.97.57[.]244 |
IP |
C:\Users\Public\Update |
디렉터리 |
부록
명령 |
설명 |
|---|---|
$ActiveDos |
현재 디렉터리를 반환합니다. |
$AddUser |
새로운 로컬 사용자를 만들어 관리자 그룹에 추가합니다. |
$ExecuteCommand |
명령어를 실행합니다. |
$FileDelete |
파일을 삭제합니다. |
$FileDownLoad \ $BigFileDownLoad |
피해자의 머신에서 파일을 다운로드합니다. |
$FileExist |
파일이 있는지 여부를 반환합니다. |
$FileUpload \ $BigFileUpload |
피해자의 파일 시스템에 파일을 씁니다. |
$Get_LocalDisk |
피해자의 드라이브를 가져옵니다. |
$GetFile |
파일 데이터를 가져옵니다(크기, 타임스탬프). |
$GetFolder |
특정 디렉터리의 폴더를 나열합니다. |
$GetFolderAndFile |
폴더를 나열하고 파일을 가져옵니다. |
$GetProcess |
프로세스를 나열합니다. |
$GetThreadPermissionsInfo |
멀웨어 프로세스의 정보를 스레드로 만듭니다. |
$HunterInfo |
360 Secure Browser, SunLogin, ToDesk, NetSarang 및 Chrome의 데이터를 탈취합니다. |
$KillProcess |
지정된 PID로 프로세스를 종료합니다. |
$MessageBox |
제공된 문자열이 있는 메시지 상자를 표시합니다. |
$Netstat |
활성 연결을 확인하기 위해 netstat를 수행합니다. |
$OffLine |
프로세스를 종료합니다. |
$Online |
피해자의 초기 데이터를 다시 전송합니다(그림 4). |
$PE64Loader |
explorer.exe를 생성하고 여기에 셸코드 로더를 삽입합니다. |
$PEMemoryLoadOnSelf |
버퍼에서 코드를 로딩합니다. 이 멀웨어는 'JuicyPotato' 또는 'PwDump'와 같이 수신된 여러 인수를 확인하고 이 이름으로 환경 변수를 설정하므로 이를 '모듈' 또는 플러그인으로 사용할 수 있다고 판단됩니다. |
$Persistence |
C2로부터 DLL을 수신합니다.
예약된 작업을 생성할 수도 있습니다. |
$ProgressSpawn |
C:\Users\Public 아래에서 페이로드를 만들거나 검증하고 인수에 따라 ShellExecute, -InstallLsp 또는 인메모리 로딩과 같은 다양한 방법을 통해 실행합니다. |
$RegManage |
구축되지 않은 것으로 보입니다. |
$ScreenShot |
스크린샷을 찍습니다. |
$ScreenSpy |
피해자가 TightVNC를 가지고 있다는 가정 하에 원격 제어를 활성화하기 위해 또는 공격의 이전/향후 단계를 위해 TightVNC 레지스트리 키를 변경합니다. |
태그