TL;DR

Một developer vừa chia sẻ trên X chuyện suýt mất sạch tài sản số qua một buổi phỏng vấn "việc làm remote". Kịch bản: recruiter trên LinkedIn → gửi repo "coding test" 30 phút → chạy npm install → script ẩn bên trong quét Keychain, password Chrome, ví crypto rồi upload ra C2 server trong 56 giây. Đây không phải vụ lẻ — đây là Contagious Interview, chiến dịch được Microsoft, Palo Alto Unit42, ReversingLabs theo dõi từ 2022, quy cho nhóm state-sponsored Bắc Triều Tiên (alias Lazarus / Famous Chollima / Void Dokkaebi). Tính đến nay đã có 197+ npm package độc, 31.000+ lượt download.

Chuyện gì đã xảy ra

Nạn nhân nhận được DM từ một "recruiter" tự xưng đại diện cho một công ty blockchain hợp pháp. Họ offer vị trí part-time, gửi kèm một bài coding challenge React/Node.js hosted trên Bitbucket. Repo trông rất chỉn chu — có README sạch, cấu trúc project chuyên nghiệp, deadline 30 phút trước buổi call. Đúng bẫy tâm lý: áp lực thời gian + háo hức việc làm = ít khi đọc kỹ code.

May là victim này cẩn thận, chưa chạy vội mà dùng AI scan trước. Payload nằm trong server/controllers/userController.js dưới dạng mảng byte obfuscate, decode ra URL api.npoint.io/... rồi dùng new Function("require", "...") để nạp remote code với full quyền Node.js. URL đó chỉ sống đúng 24 giờ trước khi bị burn — attacker đốt hạ tầng cực nhanh để né forensics.

Tại sao chiêu này nguy hiểm

Supply-chain attack truyền thống dựa vào typosquat npm — bạn phải gõ sai tên package. Contagious Interview khác: victim tự nguyện clone và chạy code, dưới áp lực deadline, trong môi trường dev thật — nơi có SSH keys, wallet mnemonics, .env file và Keychain đang unlock. Không scanner nào phát hiện được vì repo là private Bitbucket riêng cho từng nạn nhân.

Microsoft Defender Experts ghi nhận biến thể mới còn tinh vi hơn: chỉ cần mở repo trong VS Code và bấm "Trust" ở prompt workspace trust, tasks.json sẽ tự động chạy payload — không cần npm install.

Technical facts

Chỉ sốCon số thực tế
Thời gian exfiltrate đầy đủ56 giây
Chrome password bị đánh cắp (1 case)634
Thời gian sống của C2 URL~24 giờ
Malicious npm package đã catalogue197+
Tổng lượt download package độc31.000+
Wave gần nhất (2026)35 npm package trong một đợt
Campaign bắt đầuTháng 12/2022

Chúng lấy cắp những gì

  • Mnemonic phrase và private key của ví crypto (MetaMask, Phantom, Trust Wallet…)
  • Toàn bộ macOS Keychain + Windows Credential Manager
  • Password đã lưu của Chrome, Edge, Brave, Firefox
  • Database của KeePass, 1Password
  • File .env, API token AWS/GCP/Azure
  • SSH private key, GPG signing key
  • Nội dung clipboard (qua module giám sát clipboard)

Các malware family liên quan

  • BeaverTail — JS stealer, nhúng trong npm package, stage đầu
  • InvisibleFerret — Python backdoor, remote command execution, stage sau
  • OtterCookie — JS modular backdoor (từ 9/2024), check VM, C2 qua socket.io
  • FlexibleFerret — biến thể Go/Python, C2 HTTP/TCP mã hoá, persistence qua RUN registry
  • Beaconing Agent — biến thể mới (10/2025), thu fingerprint host, chạy payload qua stdin

Cách tự bảo vệ

  1. Không bao giờ npm install hoặc mở repo lạ trên máy chính. Dùng GitHub Codespaces, disposable VM, hoặc Docker container.
  2. Tắt VS Code workspace trust auto-execute: security.workspace.trust.enabled: false.
  3. Đặt mặc định npm install --ignore-scripts.
  4. Trước khi chạy coding test từ recruiter, grep repo với các pattern đáng ngờ: new Function, eval, mảng byte base64 dài trong file controller.
  5. Ví crypto tài sản lớn phải lưu trên hardware wallet riêng, không cài MetaMask trên máy dev.
  6. Verify recruiter qua website công ty chính chủ. Nếu profile LinkedIn mới tạo, ít connection, hối thúc deadline — 99% scam.

Bối cảnh & điều sắp tới

Contagious Interview là campaign có tuổi đời gần 4 năm và đang mở rộng, không thu hẹp. MITRE đã gán ID chính thức G1052. Biến thể 2026 chuyển sang khai thác workspace trust của VS Code và tự phát tán kiểu worm — một repo nhiễm có thể lây cho các dev khác trong team. Dark Reading gọi đây là "npm package factory" vì attacker tạo package mới với tốc độ hàng chục package/tuần.

Nếu bạn là dev làm remote, đặc biệt trong mảng Web3/crypto/AI — hãy giả định mọi recruiter DM ngẫu nhiên đều hostile cho tới khi chứng minh được ngược lại. Một lần "Trust" là đủ để mất sạch.

Nguồn: Microsoft Security Blog, David Dodda firsthand account, ReversingLabs, MITRE ATT&CK G1052, Palo Alto Unit42.