실패한 국가 지원 공격의 해부: PinpinRAT 분석
실패한 국가 지원 공격의 해부: PinpinRAT 분석
A 가짜 채용 면접을 통해 개발자를 겨냥한 정교한 피싱 캠페인이 발견되었습니다. 이 공격은 다단계 드로퍼를 사용하여 PinpinRAT이라 불리는 원격 접속 트로이목마(RAT)를 설치합니다. 공격자는 벤처 캐피털리스트로 위장하여 개발자가 악성 저장소를 클론하고 빌드 명령을 실행하도록 유도하는 가짜 면접 사기 수법을 활용하며, 이는 표준 백신 탐지를 우회하는 일련의 난독화된 페이로드를 트리거합니다.
공격 벡터: 사회 공학적 기법
공격은 매우 정교한 사회 공학적 노력으로 시작됩니다. 공격자는 폐업했거나 가짜인 벤처 캐피털 회사(예: "Lua Ventures")의 대표인 것처럼 위장한 허위 페르소나를 사용하여 이메일과 LinkedIn을 통해 개발자에게 접근합니다.
신뢰를 구축하기 위해 공격자는 다음과 같은 방법을 사용합니다:
- 인상적이지만 모호한 경력을 가진 그럴듯한 LinkedIn 프로필을 사용합니다.
- 자문 작업의 필요성을 정당화하기 위해 초기 단계 기업들의 이름을 언급합니다.
- 대상과 실제 음성 통화를 진행하며, 억양이나 카메라 사용의 불일치를 설명하기 위해 종종 "여행 중"이라는 핑계를 댑니다.
- crates.io에 게시된 패키지와 같은 공개 기여도를 기반으로 개발자를 타겟팅합니다.
PinpinRAT 드로퍼의 기술적 분석
악성 페이로드는 "Ticket Harbor"라는 이름의 페리 티켓 예매 애플리케이션을 테마로 한 TypeScript 저장소를 통해 전달됩니다. 감염 체인은 조용하고 은밀하게 설계되었으며, 여러 단계의 난독화를 활용합니다:
1. 초기 실행
개발자가 typecheck 또는 build 명령을 실행할 때 함정이 작동합니다. 프로세스는 다음 순서를 따릅니다:
- Postinstall Hooks: 네 개의 별도
postinstall훅이patch-package를 실행합니다. 이 중 하나의 훅은 패치 파일에git update-index --skip-worktree를 실행하여 수정된 파일이git status에 나타나지 않도록 합니다. - Payload Injection:
typescript+5.9.2.patch라는 이름의 파일이typescript.js와_tsc.js에 자가 실행되는 XOR-복호화된 base64 블롭을 주입합니다. 이 스텁(stub)은 악성코드 탐지를 우회하기 위해eval()사용을 피합니다.
2. 2단계 로딩
초기 스텁은 이미지 파일(operators/3.png)에 추가된 숨겨진 데이터 조각을 읽습니다. 이 데이터에는 커스텀 wAsm 청크에 포함된 작은 임베디드 WebAssembly (WASM) 스텁이 들어 있습니다. 그 후 WASM 스텁은 1.68 MB 크기의 난독화된 2단계 페이로드를 실은 분리된, 조용한 Node.js 프로세스를 생성합니다.
3. 지속성 및 정리
악성코드는 탐지를 피하기 위해 세 가지 단계의 정리 작업을 수행합니다:
git skip-worktree트릭을 사용하여 패치를 숨깁니다.- 드로퍼는 첫 실행 이후 자신의 주입된 라인을 삭제하기 위해 패치 파일을 다시 작성합니다.
- 2단계 임시 디렉토리는 실행 시 스스로 삭제됩니다.
PinpinRAT 기능
PinpinRAT은 기능이 완전한 원격 접속 트로이목마입니다. 키 교환을 위해 RSA-2048을 사용하고 세션 암호화를 위해 AES-256-CBC를 사용하여 모든 트래픽이 HMAC-SHA256 무결성 태그와 함께 암호화됨을 보장합니다.
시작 시, RAT은 다음과 같은 호스트 핑거프린트를 수집합니다:
- 기본 및 모든 네트워크 인터페이스 IP 주アドレス
- 사용자 이름, 호스트 이름, OS 상세 정보 (release, platform, architecture)
- 프로세스 PID 및 전체
process.argv - Node.js 버전
공격자는 감염된 호스트에 다음과 다음 명령을 내릴 수 있습니다:
env: 모든 환경 변수를 탈취합니다.upload: 임의의 파일을 읽고 탈취합니다.download: 공격자가 제공한 바이트를 임의의 경로에 씁니다.spawn: 쉘 확장(shell expansion)을 기능으로 하는 임의의 프로세스를 실행합니다.ls,cd,pwd,cp,mv: 전체 파일 시스템 조작.dns: 호스트를 임의의 이름에 대한 리졸버로 사용합니다 (잠재적으로 DNS 터널링을 위해).dismantle: 악성코드 자체를 제거합니다.
침해 지표 (IoCs)
시스템이 감염된 것으로 의심되는 경우, 다음 지표를 확인해야 합니다:
- C2 Server:
89.124.107.161:80 - Windows Scheduled Task:
PinpinWrappedJs - macOS Process Masquerade:
com.apple.WebKit.Networking - Environment Variables:
NODT_PAYLOAD_PATH,NODT_PAYLOAD_ARGS - PNG Chunk Guard:
WASMPACK(wAsm) - Anchor Strings:
12ff4b51,ticket-harbor-tsc-shim-anchor(found intypescript.js) - Artifact Directories:
- macOS:
~/Library/Caches/runtime-cache/.cache-<randomhex>/ - Linux:
/tmp/.cache-<randomhex>/ - Windows:
%TEMP%\.cache-<randomhex>\
- macOS:
전문가 분석 및 완화 조치
커뮤니티 논의에 따르면 이 공격 패턴은 LinkedIn을 통해 개발자를 타겟팅하고 채용용 면접 사기를 사용하는 것으로 알려진 Lazarus Group과 매우 유사합니다.
이러한 위험을 완화하기 위해 개발자는 다음과 같은 보안 실무를 권장합니다:
- 일회성 환경 사용: 채용 면접이나 외부 소스에서 가져온 신뢰할 수 없는 코드를 개인용 또는 회사용 머신에서 실행하지 마십시오. 일회성 폐기 가능한 가상 머신(VM) 또는 샌드박스 컨테이너를 사용하십시오.
- 제한된 런타임 사용: 악성한
postinstall훅이 실행되는 것을 방지하기 위해 Deno의 네트워크 차단/화이트리스트 기능이나 Bun의--ignore-scripts플래그를 활용하십시오. - 공급망 보안 도구 사용: 공급망 보안 분야에서 발전이 있는
pnpm과 같은 패키지 매니저를 사용하십시오. - LLM 생성 콘텐츠에 대한 경계: 공격자들이 이제 매우 설설득력 있고 전문적인 어조의 피싱 이메일과 LinkedIn 프로필을 생성하기 위해 LLM을 사용하고 있다는 점을 인에지하십시오.