SOC Prime Bias: 크리티컬

19 1월 2026 19:11

GlassWorm, Mac으로 진출: 신선한 인프라, 새로운 트릭

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon 팔로우
GlassWorm, Mac으로 진출: 신선한 인프라, 새로운 트릭
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

GlassWorm 뒤의 위협 행위자는 Windows 중심 활동에서 macOS로 피벗하여 Solana 블록체인 기반 C2 포인터를 통해 암호화된 JavaScript 페이로드를 가져오는 악성 VS Code 확장 프로그램을 배포하고 있습니다. 이 파동은 하드웨어 지갑 트로이 목마화(trojanization)를 추가함으로써 브라우저, 개발자 툴링, macOS 키체인 전체에 걸쳐 자격 증명 도용을 계속하면서 기능을 확장합니다. 인프라에는 과거 GlassWorm 작전에서 재사용된 Solana 지갑 주소와 IP가 포함되어 있어 운영 도구와 호스팅의 지속성을 시사합니다. 연구자들은 확장 프로그램이 제거되기 전까지 5만 회 이상의 다운로드가 있었음을 관찰하여 개발자 환경에 대한 의미 있는 노출을 나타냅니다.

조사

Koi Security는 Open VSX 마켓에서 세 개의 악성 VS Code 확장을 식별하고 이들의 명령 및 제어 워크플로우를 Solana 지갑 및 이전에 GlassWorm에 연결된 IP 주소와 연결했습니다. 임플란트는 15분의 실행 지연 시간을 포함하며 이후 AES-256-CBC JavaScript 페이로드를 해독하여 실행합니다. macOS에서는 LaunchAgents를 통해 지속성이 수립됩니다. 수집 대상은 브라우저 지갑 및 데스크탑 지갑 데이터, 개발자 액세스 토큰, SSH 키, 및 macOS 키체인 자료를 포함합니다. 맬웨어는 /tmp/ijewf/ 하에 도난 데이터를 배치한 후 /p2p와 유사한 서버 경로로 추출합니다. 또한 Ledger Live와 Trezor Suite와 같은 합법적 하드웨어 지갑 동반 앱을 트로이 목마화된 유사체로 교체하려 시도하여 고가치 비밀 및 거래를 포착합니다.

완화

개발자 툴링에 대한 제어를 강화하여 확장 허용 목록 및 보안 검토를 VS Code 확장에 대해 요구하십시오. 특히 오픈 마켓 출처의 것들에 대해 유의하십시오. 지연된 실행 패턴 및 LaunchAgents의 의심스러운 생성 또는 수정을 감지하는 런타임 감지를 배포합니다. Solana 기반 C2 조회와 관련된 의심스러운 아웃바운드 활동을 모니터링하고 차단하며 확인된 재사용된 IP에 대한 비정상적 연결에 대한 네트워크 감지를 추가하십시오. 개발자 및 클라우드 계정에는 다요소 인증(MFA)을 요구하며 하드웨어 지갑의 무결성 검사를 구현하십시오(발행자 확인, 공증/서명 검증, 통제된 소프트웨어 업데이트 경로).

대응

새로운 또는 수정된 LaunchAgents, 키체인 저장소에 대한 비정상적인 액세스, Solana 참조 C2 엔드포인트에서의 검색 시도를 경고로 트리거합니다. 악성 VS Code 확장을 격리하고 제거한 다음 관련된 LaunchAgent 지속성을 제거하십시오. 서 /tmp/ijewf/에서을 대상으로 한 포렌식을 수행하여 자격 증명 스테이징 범위를 확인하고 어떤 데이터가 수집되었는지 확인하십시오. 하드웨어 지갑 애플리케이션(Ledger Live, Trezor Suite)의 무결성을 검증하고 변조가 의심될 경우 신뢰할 수 있는 소스에서 다시 설치하십시오. 영향을 받은 자격 증명을 재설정하고 SSH 키 및 개발자 토큰을 교체하고 세션을 무효화하며 동일한 확장 ID, 파일 경로 및 지속성 아티팩트에 대해 엔드포인트 전반에 걸쳐 검색을 확장하십시오.

"graph TB %% Class Definitions classDef action fill:#99ccff classDef technique fill:#ffcc99 classDef operator fill:#ff9900 classDef tool fill:#cccccc %% Nodes action_initial_access["<b>Action</b> – Initial Access"] class action_initial_access action technique_vs_code_ext["<b>Technique</b> – T1176.002: Malicious VS Code IDE Extension<br/><b>Description</b>: Adversary delivers a malicious extension for Visual Studio Code that executes code on the victim system."] class technique_vs_code_ext technique technique_delay["<b>Technique</b> – T1497.003: Execution Delay<br/><b>Description</b>: Malware waits for a period (e.g., 15 minutes) before executing its payload to evade analysis."] class technique_delay technique technique_decrypt["<b>Technique</b> – T1027.009 / T1027.004: Decrypt AESu2011256u2011CBC Payload<br/><b>Description</b>: Encrypted payload is decrypted inu2011memory using AESu2011CBC with a 256u2011bit key."] class technique_decrypt technique technique_c2_retrieve["<b>Technique</b> – T1573.001: Retrieve Endpoint from Solana Blockchain<br/><b>Description</b>: C2 server address is stored on a public blockchain and fetched by the malware."] class technique_c2_retrieve technique technique_c2_fetch["<b>Technique</b> – T1048.003: Unencrypted Protocol Data Transfer<br/><b>Description</b>: Malware contacts the C2 endpoint using an unencrypted protocol (e.g., HTTP)."] class technique_c2_fetch technique technique_persistence_agent["<b>Technique</b> – T1543.001: Install LaunchAgent<br/><b>Description</b>: A LaunchAgent plist is placed in the useru2019s LaunchAgents directory for persistence."] class technique_persistence_agent technique technique_persistence_daemon["<b>Technique</b> – T1543.004: Install LaunchDaemon<br/><b>Description</b>: A LaunchDaemon plist is placed in the system LaunchDaemons directory for persistence."] class technique_persistence_daemon technique technique_modify_plist["<b>Technique</b> – T1647: Modify PLIST File<br/><b>Description</b>: Attacker edits the plist to alter launch behavior or add malicious commands."] class technique_modify_plist technique technique_dump_keychain["<b>Technique</b> – T1555.001 / T1555.002: Dump Keychain<br/><b>Description</b>: Credential material from macOS Keychain is extracted."] class technique_dump_keychain technique technique_steal_keys["<b>Technique</b> – T1552.001 / T1552.004: Steal Private Keys and Tokens<br/><b>Description</b>: Private cryptocurrency keys and authentication tokens are harvested."] class technique_steal_keys technique technique_stage_data["<b>Technique</b> – T1074: Data Staged<br/><b>Description</b>: Collected files are copied to /tmp/ijewf for later exfiltration."] class technique_stage_data technique technique_archive["<b>Technique</b> – T1560.001 / T1560.003: Archive Collected Data<br/><b>Description</b>: Data is compressed into an archive format (e.g., zip)."] class technique_archive technique technique_exfil["<b>Technique</b> – T1048.003: Exfiltration Over Unencrypted Nonu2011C2 Channel<br/><b>Description</b>: Staged archive is sent out via an unencrypted channel not tied to the primary C2."] class technique_exfil technique technique_priv_esc["<b>Technique</b> – T1548.006: TCC Manipulation<br/><b>Description</b>: macOS Transparency, Consent, and Control database is modified to gain higher privileges."] class technique_priv_esc technique technique_impact["<b>Technique</b> – T1496.002: Replace Ledger Live / Trezor Suite<br/><b>Description</b>: Legitimate cryptocurrency wallet applications are swapped with trojanized versions to capture user assets."] class technique_impact technique %% Connections action_initial_access –>|uses| technique_vs_code_ext technique_vs_code_ext –>|triggers| technique_delay technique_delay –>|leads to| technique_decrypt technique_decrypt –>|establishes| technique_c2_retrieve technique_c2_retrieve –>|contacts| technique_c2_fetch technique_c2_fetch –>|installs| technique_persistence_agent technique_c2_fetch –>|installs| technique_persistence_daemon technique_persistence_agent –>|modifies| technique_modify_plist technique_persistence_daemon –>|modifies| technique_modify_plist technique_modify_plist –>|enables| technique_dump_keychain technique_dump_keychain –>|enables| technique_steal_keys technique_steal_keys –>|stores in| technique_stage_data technique_stage_data –>|archives| technique_archive technique_archive –>|exfiltrates via| technique_exfil technique_exfil –>|facilitates| technique_priv_esc technique_priv_esc –>|enables| technique_impact "

공격 흐름

시뮬레이션 실행

프리리퀴짓: 원격 측정 및 기준선 사전 비행 검사가 통과해야 합니다.

합리적 설명: 이 섹션은 탐지 규칙을 발동하도록 설계된 적수 기술(TTP)의 정확한 실행을 세부적으로 설명합니다. 명령 및 내러티브는 식별된 TTP를 직접 반영해야 하며 탐지 논리에 의해 예상되는 정확한 원격 측정을 생성하는 것을 목표로 합니다. 추상적이거나 관련 없는 예는 오진을 초래할 수 있습니다.

  • 공격 내러티브 및 명령:
    이미 낮은 권한의 macOS 사용자 계정을 탈취한 공격자는 키 체인에 저장된 서비스 계정 비밀번호를 수집하려고 합니다. 별도의 바이너리를 드롭하지 않기 위해 공격자는 AppleScript를 통해 내장된 보안 도구를 호출하는 한 줄의 스크립트를 작성합니다 셸 스크립트를 실행하십시오. 스크립트는 사용자의 세션에서 직접 실행되어 Sigma 규칙이 일치하는 정확한 명령줄을 가진 프로세스 생성 이벤트를 발생시킵니다.

    # 테스트 키체인 항목 생성 (시연용; 실제 공격자는 기존 항목을 대상으로 함)
    security add-generic-password -a attacker -s pass_users_for_script -w SuperSecret123
    
    # 암호를 읽는 AppleScript 실행
    osascript -e 'do shell script "security find-generic-password -s '''pass_users_for_script''' -w"'
  • 회귀 테스트 스크립트:

    #!/usr/bin/env bash
    set -euo pipefail
    
    # 1단계: 대상 키체인 항목이 존재하는지 확인 (멱등성)
    if ! security find-generic-password -s pass_users_for_script -w >/dev/null 2>&1; then
        security add-generic-password -a attacker -s pass_users_for_script -w SuperSecret123
    fi
    
    # 2단계: 탐지 규칙을 발동시키는 AppleScript 실행
    echo "[+] 키체인 항목을 읽기 위한 AppleScript 실행 중..."
    osascript -e 'do shell script "security find-generic-password -s '''pass_users_for_script''' -w"'
  • 정리 명령:

    # 테스트 키체인 항목을 제거하여 시스템을 깨끗하게 유지
    security delete-generic-password -s pass_users_for_script
    echo "[+] 정리 완료: 테스트 키체인 항목 제거됨."