SOC Prime Bias: 치명적

26 May 2026 16:01 UTC

Void Dokkaebi, Cython으로 컴파일된 InvisibleFerret 악성 코드 사용

Author Photo
SOC Prime Team linkedin icon 팔로우
Void Dokkaebi, Cython으로 컴파일된 InvisibleFerret 악성 코드 사용
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

북한과 연계된 위협 행위자인 Void Dokkaebi는 Cython으로 컴파일하여 네이티브 .pyd and .so 바이너리를 사용하여 InvisibleFerret 악성코드를 강화했습니다. 이 변화는 자격 증명 도용, 키로깅, 클립보드 캡처, 암호화폐 지갑 탈취 등 핵심 기능을 유지하면서 파이썬 스크립트만을 중점으로 하는 탐지를 피할 수 있게 합니다. BeaverTail은 여러 단계를 거쳐 컴파일된 모듈을 로드하고 실행하는 다중 단계 로더 역할을 합니다. 이 캠페인은 지갑 자격 증명, 서명 키 또는 기타 고가치 비밀을 보유할 수 있는 소프트웨어 개발자와 암호화폐 사용자들을 대상으로 합니다.

조사

연구자들은 전체 감염 체인을 분석하고 읽을 수 있는 파이썬 스크립트에서 Cython으로 컴파일된 확장 모듈로 분명히 이동하는 것을 발견했습니다. 그들은 또한 Base64 인코딩, XOR 암호화 및 문자열 조작을 포함한 여러 혼란화 방법을 문서화했습니다. 조사 중 그들은 하드 코딩된 IP 주소, 포트 및 파일 이름을 추출하고, 임시 파이썬 .mod 스크립트가 악성 바이너리를 로드하는 데 사용되는 것을 관찰했습니다. 문자열 분석을 통해 환경 구축 흔적과 브라우저 기반 암호화폐 지갑 확장에 대한 참조 또한 드러났습니다.

완화

방어자는 스크립트에 초점을 맞춘 탐지를 넘어 의심스러운 .pyd and .so 파일이 비정상적인 위치에 나타나는 것과 임시 .mod 로더 스크립트를 모니터링해야 합니다. 추가적인 탐지 기회로는 관찰된 파일 이름, ip-api.com에 대한 아웃바운드 요청 및 암호화폐 지갑 확장을 포함한 다운로드가 있습니다. 실행 후 임시 로더 스크립트를 제거하거나 분리하는 것도 지속성 기회를 줄이는 데 도움이 될 수 있습니다.

응답

관련 지표가 탐지되면 감염된 엔드포인트를 즉시 격리하고, 식별된 명령 및 제어 IP 주소에 대한 아웃바운드 트래픽을 차단하고, 나열된 바이너리 및 예약된 작업 아티팩트를 추적해야 합니다. 조사자들은 복구된 .mod 스크립트를 분석하여 내장된 페이로드를 추출하고 실행 체인을 더 잘 이해해야 합니다. 노출된 암호화폐 자격 증명, 지갑 비밀 및 서명 키는 지체 없이 교체해야 합니다.

공격 흐름

우리는 여전히 이 부분을 업데이트 중입니다. 알림을 받으려면 가입하세요

알림 등록

시뮬레이션 실행

전제 조건: 텔레메트리 및 기준선 프리플라이트 점검이 통과해야 합니다.

근거: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적 기법(TTP)의 정확한 실행을 설명합니다. 명령어 및 설명은 식별된 TTP를 직접 반영해야 하며 탐지 로직이 기대하는 바로 그 텔레메트리를 생성해야 합니다. 추상적이거나 관련 없는 예시는 오진으로 이어질 것입니다.

  • 공격 내러티브 및 명령어:
    공격자는 자격증명을 수집하고 C2 통신을 구현하는 Cython으로 컴파일된 모듈 세트(mod.pyd, pad.pyd, brw.pyd)를 획득했습니다. 지속성을 확보하기 위해 공격자는 이러한 모듈을 현재 사용자의 VS Code 구성 디렉토리(%USERPROFILE%.vscode)에 복사합니다. VS Code는 주기적으로 이 폴더를 스캔하여 확장을 검색하고, 이로 인해 악성 파이썬 스크립트에 의해 악성 모듈이 로드됩니다. 복사 작업은 Sigma 규칙과 일치하는 Sysmon FileCreate 이벤트를 생성합니다.

  • 회귀 테스트 스크립트:

    # -------------------------------------------------
    # InvisibleFerret Cython 모듈 드롭 시뮬레이션
    # -------------------------------------------------
    $vscodePath = "$env:USERPROFILE.vscode"
    # 대상 폴더가 존재하는지 확인
    if (-not (Test-Path -Path $vscodePath)) {
        New-Item -ItemType Directory -Path $vscodePath | Out-Null
    }
    
    # 시뮬레이션된 악성 바이너리 (임의의 쓰레기 콘텐츠)
    $modules = @("mod.pyd","pad.pyd","brw.pyd")
    foreach ($mod in $modules) {
        $dest = Join-Path -Path $vscodePath -ChildPath $mod
        # 컴파일된 확장을 가장하도록 1 KB의 임의 바이트 작성
        $bytes = New-Object byte[] 1024
        (New-Object System.Random).NextBytes($bytes)
        [System.IO.File]::WriteAllBytes($dest, $bytes)
        Write-Host "Created $dest"
    }
  • 정리 명령어:

    # -------------------------------------------------
    # 시뮬레이션된 악성 파일 정리
    # -------------------------------------------------
    $vscodePath = "$env:USERPROFILE.vscode"
    $modules = @("mod.pyd","pad.pyd","brw.pyd")
    foreach ($mod in $modules) {
        $file = Join-Path -Path $vscodePath -ChildPath $mod
        if (Test-Path $file) {
            Remove-Item -Path $file -Force
            Write-Host "Removed $file"
        }
    }