TL; DR
2026-06-15-სა და 2026-06-16-ს შორის ერთმა npm გამომცემელმა წამოიწყო ექვსი პაკეტი — სულ 26 ვერსია — რომლებიც ინსტალაციის დროის სკრიპტს ასრულებენ ყოველ npm installთითოეული პაკეტი იგზავნება README ფაილით, რომელიც მას HackerOne / GitHub Bug Bounty-ის „კეთილთვისებიან“ კვლევის არტეფაქტად აცხადებს, რომელიც „არასდროს“ ეხება ავტორიზაციის მნიშვნელობებს და „არავითარ მუდმივობას არ ასრულებს“. კოდი არ ემთხვევა პასუხისმგებლობის შეზღუდვის განცხადებას. Linux CI მორბენლებზე ინსტალაციის კაუჭი აღბეჭდავს გარემოს და იკვლევს ღრუბლოვანი ეგზემპლარის მეტამონაცემების საბოლოო წერტილს; Windows-ზე ის ითხოვს ამაღლებას, მუშაობს როგორც SYSTEMდა ხსნის ბრძანების არხს გარე ჰოსტისთვის. ახლა ერთადერთი ინდიკატორი, რომლის მოძიებაც აუცილებელია, არის C2 ჰოსტი. 173.255.233[.]239სიმძიმე: მაღალიდაზარალებული ეკოსისტემა: npmსახელები ერწყმის უწყვეტი ინტეგრაციის დამოკიდებულების ხმაურს (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9და სამი და-ძმა).
შეტევა: როგორ მუშაობს ის
კლასტერში ყველა პაკეტი ერთნაირად არის აგებული. პაკეტი.json ერთი და იგივე ბრძანებას ორ სასიცოცხლო ციკლში აკავშირებს hooks:
{
"scripts": {
"preinstall": "node run.js",
"postinstall": "node run.js"
}
}ორივეზე მუშაობს წინასწარი ინსტალაცია და პოსტინსტალაცია ნიშნავს, რომ დატვირთვა ირთვება მიუხედავად იმისა, ჩაიშლება თუ არა შემდგომი ინსტალაციის ნაბიჯები. გაშვება.js თავად არის ათხაზიანი პლატფორმის დისპეჩერი:
// Platform dispatcher — runs beaconNN.js on Windows, beacon_linux.js on Linux.
// GitHub Bug Bounty authorized research. Contact: nicholas@curran.tech
'use strict';
const { execFileSync } = require('child_process');
const path = require('path');
const node = process.execPath;
const script = process.platform === 'win32'
? path.join(__dirname, 'beacon34.js')
: path.join(__dirname, 'beacon_linux.js');
try { execFileSync(node, [script], { stdio: 'inherit', timeout: 90000 }); } catch (e) {}შემდეგ ქცევა ოპერაციული სისტემის მიხედვით იყოფა. ექვსივე პაკეტი შეიცავს ერთსა და იმავე ორ ნაწილს — გაშვება.js და პლატფორმის შუქურები — ანუ ისინი ურთიერთშემცვლელი წვეთებია და არა ექვსი განსხვავებული ინსტრუმენტი. მათ შორის ერთადერთი მნიშვნელოვანი განსხვავება გამოქვეყნების რიტმია: ოთხი სახელი ერთხელ გამოქვეყნდა, ხოლო ორი ხელახლა გამოვიდა ყოველ 30-60 წუთში რამდენიმე საათის განმავლობაში, რაც ახლად გამოქვეყნებულ ვერსიას ინსტალატორებისა და რეზოლუტორებისთვის თვალწინ ტოვებს მაშინაც კი, როდესაც ძველი ვერსიები ამოღებულია.
Linux- ზე (beacon_linux.js) სკრიპტის პროფილები, სადაც ის მუშაობს. ის ჩამოთვლის გარემოს ცვლადების სახელებს, კითხულობს ფაილებს / პროკ, ამოწმებს docker.sockდა გარბის მასპინძლის სახელი მდე ვინ ვარ მეშემდეგ ის აგზავნის HTTP მოთხოვნას AWS კონტეინერის ინსტანციის-მეტამონაცემების საბოლოო წერტილზე. 169.254.170[.]2 — ECS დავალების ბმულ-ლოკალური მისამართი საკუთარი კონფიგურაციისა და მოკლევადიანი როლის სერთიფიკატების მისაღებად (IMDS, ეგზემპლარის მეტამონაცემების სერვისი). შედეგები იგზავნება კამპანიის კოლექციონერში შემდეგ მისამართზე: 173.255.233[.]239.
Windows- ზე (beacon34.js / beacon18.js) პაკეტი გაცილებით მეტს აკეთებს, ვიდრე მისი ჰოსტის პროფილირებას. დროშით მონიშნული კოდი რეესტრის გასაღებს ამატებს ms-პარამეტრები დამმუშავებელი დელეგირება value — ცნობილი მომხმარებლის ანგარიშის კონტროლის გვერდის ავლითი ფუნქცია, რომელიც გაშვებულ პროცესს საშუალებას აძლევს, ამაღლებული ტემპით იმუშაოს მოთხოვნის გარეშე. ის PowerShell-ს იწვევს -შესრულების პოლიტიკის გვერდის ავლა მდე მოწოდება-გამოთქმა, ასრულებს NT AUTORITY\SYSTEM კონტექსტი და გარე ჰოსტიდან ბრძანებების გამოკითხვას ახორციელებს. Windows-ის ბრძანებების არხი მუშაობს ღრუბლის აფეთქების გვირაბი, დიამეტრის მონეტების შეზღუდვები.trycloudflare[.]com:443, უკან დაბრუნება 173.255.233[.]239:443, სამი საბოლოო წერტილის გამოყენებით: /c2/გამოკითხვა ბრძანების მისაღებად, /c2/out გამომავალის დასაბრუნებლად, /c2/eof დახურვა.
სიახლეები: პასუხისმგებლობის შეზღუდვა, როგორც შენიღბვა
სიახლე დატვირთვაში არ არის — ინსტალაციის კაუჭის დაზვერვა და Windows-ის აწევა ორივე კარგად არის დოკუმენტირებული. ეს არის სატიტულო ისტორია. თითოეულ პაკეტს აქვს README ფაილი, რომელიც იკითხება, როგორც პასუხისმგებლიანი გამჟღავნების არტეფაქტი:
# @ncurran/sandbox-recon-880538 — authorized npm-sandbox security researchეს არის კეთილთვისებიანი პაკეტი გამოქვეყნებულია ავტორის საკუთარი `@ncurran` ფარგლების ფარგლებში, როგორც ნაწილი ავტორიზებული HackerOne / GitHub Bug Bounty ჩართულობა (npm შედის მოქმედების სფეროში).
ინსტალაციისას ის ამოწმებს საკუთარი შესრულების გარემო … გარემოს ცვლადი
მხოლოდ ძირითადი სახელები ... ამოწმებს, კარგად არის თუ არა ცნობილი ღრუბლოვანი მეტამონაცემების საბოლოო წერტილები არიან მიუწვდომელია … ის მხოლოდ სტატუსის კოდებს, პასუხის ხანგრძლივობას და ჰეშები — არასოდეს ნებისმიერი სერთიფიკატის, ტოკენის ღირებულების ან მესამე მხარის მონაცემების. ის არ ასრულებს დაჟინება, გვერდითი მოძრაობის არარსებობა და დესტრუქციული მოქმედების არარსებობა.
ამ ტექსტში არსებული სამი მტკიცება ეწინააღმდეგება გაგზავნილ კოდს. README წერს „არ არსებობს მუდმივი მდგომარეობა“, მაგრამ Windows-ის შუქურა წერს რეესტრზე დაფუძნებულ ამაღლების გასაღებს. ის წერს „არასდროს რაიმე სერთიფიკატი, ტოკენის მნიშვნელობა“, მაგრამ Windows-ის გზა ასრულებს თვითნებურ მოძიებულ ბრძანებებს, როგორც სისტემის, რომელიც არ აწესებს ასეთ შეზღუდვას წაკითხულ ან დაბრუნებულ მონაცემებზე. ის პაკეტსაც კი ასახელებს — @ncurran/sandbox-recon-880538 — ეს არ არის ის, რომელშიც ის იგზავნება, რაც მიუთითებს, რომ README არის ხელახლა გამოყენებული შაბლონი და არა ხელთ არსებული არტეფაქტის აღწერა. პაკეტში თანხმობის უარყოფა, რომლის ინსტალაციაზეც მსხვერპლი არასდროს დათანხმდა, არ იძლევა თანხმობას. აქ კლასიფიკაცია მავნეა ფორმულირების მიუხედავად. უარყოფას ასევე აქვს უფრო მშვიდი სამიზნე: ავტომატური დახარისხების ეტაპი, რომელიც კითხულობს პაკეტის ტექსტს დამამშვიდებელი სიგნალებისთვის - „კეთილთვისებიანი“, „ავტორიზებული“, დასახელებული პროგრამა, საკონტაქტო ელ. ფოსტა - შეიძლება უსაფრთხო განაჩენისკენ იყოს მიმართული პროზის საშუალებით, რომელსაც დატვირთვა ეწინააღმდეგება. ეს გაკვეთილი ეხება როგორც ადამიანურ, ასევე მანქანურ მიმომხილველებს: შეაფასეთ ინსტალაციის დროს ქცევა და არა README-ის თვითაღწერა.
Timeline
ყველა პაკეტი 24-საათიან ფანჯარაში გამოჩნდა. პირველი ოთხი ერთჯერადი ვერსიის სახელი გამოჩნდა, შემდეგ კი ორი პაკეტი, რომლებიც ყოველ 30-60 წუთში ხელახლა ქვეყნდებოდა.
| თარიღი (UTC) | თარიღის |
|---|---|
| 2026-06-15 18:32 | პირველი პაკეტი გამოქვეყნდა — npm:pkg-telemetry-r4f9@1.0.0 |
| 2026-06-15 19:50 | npm:runtime-metrics-w7k2@1.0.0 გამოქვეყნებული |
| 2026-06-15 20:14 | npm:build-tracker-n5p1@1.0.0 გამოქვეყნებული |
| 2026-06-15 20:35 | npm:npm-sandbox-ping-r9t2@1.0.0 გამოქვეყნებული |
| 2026-06-15 21:09–22:42 | npm:event-metrics-q3x7 გამოქვეყნებული 1.0.0 → 1.0.8 (9 ვერსია) |
| 2026-06-15 23:40 → 2026-06-16 04:40 | npm:metrics-pipeline-d8k2 გამოქვეყნებული 1.0.0 → 1.0.10 (11 ვერსია) |
| 2026-06-16 | მავნე კლასტერი იდენტიფიცირებული და კლასიფიცირებულია; რამდენიმე tarball უკვე აბრუნებს 404-ს რეესტრში (მიმდინარეობს) |
კამპანია ახალია და წაშლის საკითხი ჯერ კიდევ წყდება: ანალიზის დროს ზოგიერთი ვერსია რეესტრში მოგვარდა, ზოგი კი - არა. ყველა 26 ვერსია კომპრომეტირებულად ჩათვალეთ.
კომპრომისის ინდიკატორები
პაკეტები
| ეკოსისტემა | პაკეტი | ვერსიები | სტატუსი |
|---|---|---|---|
| npm | metrics-pipeline-d8k2 | 1.0.0 – 1.0.10 | ბოროტი |
| npm | event-metrics-q3x7 | 1.0.0 – 1.0.8 | ბოროტი |
| npm | runtime-metrics-w7k2 | 1.0.0 | ბოროტი |
| npm | build-tracker-n5p1 | 1.0.0 | ბოროტი |
| npm | npm-sandbox-ping-r9t2 | 1.0.0 | ბოროტი |
| npm | pkg-telemetry-r4f9 | 1.0.0 | ბოროტი |
ქსელი
| ტიპი | ინდიკატორი | შენიშვნები |
|---|---|---|
| IP | 173.255.233[.]239 | C2 კოლექციონერი; Linux-ის POST-ის და Windows-ის სარეზერვო ასლის აღდგენა: 443 |
| დომენის | diameter-coins-limitations-parents.trycloudflare[.]com | Windows-ის ბრძანების არხი Cloudflare გვირაბის მეშვეობით, :443 |
| URI გზა | /c2/poll, /c2/out, /c2/eof | Windows-ის ბრძანება გამოკითხვა / გამომავალი / დახურვა |
| IP | 169.254.170[.]2 | AWS ECS ეგზემპლარის მეტამონაცემების საბოლოო წერტილი გამოკვლეულია ინსტალაციის ჰუკიდან |
ქცევა
| სიგნალი | აღწერა |
|---|---|
| ინსტალაცია hooks | preinstall მდე postinstall ორივე დარბის node run.js |
| პლატფორმის დისპეტჩერიზაცია | run.js ეშვება beacon_linux.js Linux-ზე, beacon34.js / beacon18.js Windows- ზე |
| Linux-ის რეკონსულტაცია | ჩამოთვლის env-var გასაღებების სახელებს, კითხულობს /proc, ჩეკები docker.sock, გარბის hostname / whoami, ზონდები IMDS |
| ფანჯრების სიმაღლე | ms-settings DelegateExecute რეესტრის UAC გვერდის ავლით; PowerShell -ExecutionPolicy Bypass + Invoke-Expression; მუშაობს როგორც SYSTEM |
| შენიღბვას | README აცხადებს, რომ კვლევა „კეთილთვისებიანია“, „ავტორიზებულია“ და „არ არსებობს მუდმივი მონაცემები“; მიუთითებს პაკეტის სახელზე, რომლითაც ის არ იგზავნება. |
ატრიბუცია და დაკვირვებული ქცევა
ჩვენ გამომცემელს მხოლოდ მისი სიგნალებით აღვწერთ და არ ვაცხადებთ ანგარიშის უკან მდგომი არცერთი პირის ვინაობას.
- სიგნალების კატალოგი. ექვსივე პაკეტი გამოქვეყნდა ერთი და იგივე npm ანგარიშის მიერ, npmresearch8847, მითითებული ელ. ფოსტით npmresearch8847@web-library.net (ელ.ფოსტა და SCM ორივე ვერიფიკაცია არ არსებობს; ჩვენ არ დაგვიდასტურებია საკუთრება). README-ები გამოქვეყნებულია @ნკურანი ფარგლები და საკონტაქტო ინფორმაცია nicholas@curran.techდა გაშვება.js ქულები საცავში github.com/ncurran/npm-sandbox-research`. ექვს პაკეტს იდენტური საერთო აქვს გაშვება.js დისპეტჩერი, საერთო beacon_linux.js რეკონსტრუირების ეტაპი და ერთი კოლექციონერის მასპინძელი 173.255.233[.]239`. სახელდების სქემა თანმიმდევრულია: ზოგადი CI-ჟღერადობის ფუძე (metrics, ტელემეტრია, შექმნის ტრეკერი, სენდბოქსის პინგ) პლუს მოკლე შემთხვევითი სუფიქსი.
- ნდობა. როგორც ჩანს, ექვსი პაკეტი ერთიან კამპანიას წარმოადგენს საერთო დისპეტჩერის, სადაზვერვო ეტაპისა და C2 ჰოსტის სიძლიერის გამო. „ავტორიზებული კვლევის“ ჩარჩო თანმიმდევრულად გამოიყურება ექვსივე README-ში. ჩვენ ვერ დავადასტურეთ, რომ რომელიმე bug-bony პროგრამამ ავტორიზაცია გაუწია ამ აქტივობას და პასუხისმგებლობის შეზღუდვის განცხადებაში მოცემული პრეტენზიები არ ემთხვევა გაგზავნილ კოდს.
- დაკვირვებული უნარი. დატვირთვის ვარჯიშიcisოთხი შესაძლებლობების კლასი: install-hook კოდის შესრულება ორივეზე წინასწარი ინსტალაცია მდე პოსტინსტალაცია; ჰოსტის და CI-გარემოს დაზვერვა გარე კოლექციონერზე გასვლით; ღრუბლოვანი ეგზემპლარის მეტამონაცემების ხელმისაწვდომობის ზონდირება ინსტალაციის კონტექსტიდან; და, Windows-ზე, ლოკალური პრივილეგიების ესკალაცია, შესრულება, როგორც სისტემისდა გარე არხზე მოძიება-და-გაშვება ბრძანების ციკლი. Windows-ის ბრძანების ციკლი დისტანციური მართვის შესაძლებლობაა: ის ითხოვს ინსტრუქციებს და აბრუნებს მათ გამომავალს.
გავლენა, ტენდენციები და რა უნდა გააკეთონ დამცველებმა
ზემოქმედების
ექსპოზიცია ყველაზე მაღალია ავტომატიზირებული აწყობის გარემოში. CI-ში npm ინსტალაცია ასრულებს სასიცოცხლო ციკლს. hooks რა იდენტურობითაც არ უნდა ფლობდეს გამშვები პროგრამა; ღრუბლოვან გამშვები პროგრამაზე ეს იდენტურობა ხშირად მოიცავს მისაწვდომ მეტამონაცემების საბოლოო წერტილს და როლის სერთიფიკატს. მისამართი, რომელსაც Linux beacon იკვლევს, 169.254.170[.]2, არის AWS ECS დავალების მეტამონაცემების საბოლოო წერტილი: დავალება, რომელსაც შეუძლია მასთან წვდომა, ჩვეულებრივ, ასევე შეუძლია მიიღოს თავისი დავალების როლის დროებითი ავტორიზაციის მონაცემები იმავე ბმულ-ლოკალური სერვისიდან. ინსტალაციის სკრიპტიდან ხელმისაწვდომობის შემოწმება არის ნაბიჯი, რომელიც წინ უძღვის ამ ავტორიზაციის მონაცემების ამოღებას, ამიტომ ნებისმიერი შემსრულებელი, რომელმაც გაუშვა კაუჭი და შეძლო ამ საბოლოო წერტილამდე მიღწევა, უნდა ჩაითვალოს ისე, რომ მისი დავალების როლი გამოვლენილი იყოს. Windows-ის დეველოპერზე ან build ჰოსტზე დატვირთვა ითხოვს ამაღლებას და ხსნის ბრძანების არხს, რაც აფართოებს ექსპოზიციას ერთი პროფილიდან და გასვლიდან ინტერაქტიულ დისტანციურ მართვამდე.
წაშლამდე ვერ შევძელით მავნე ვერსიების ჩამოტვირთვის სანდო რაოდენობის მოპოვება, ამიტომ მსხვერპლთა რაოდენობას ვერ ვადგენთ. ორი პაკეტის - თერთმეტი და ცხრა ვერსიის - სწრაფმა ხელახლა გამოქვეყნებამ საათებში - ინსტალატორებისა და რეზოლუტორებისთვის ახალი არტეფაქტები შეინარჩუნა, სანამ ძველი ვერსიები იშლებოდა.
განვითარებადი ნიმუშები
ეს კლასტერი წარმოადგენს საფარად გამოყენებული იარლიყის მაგალითს. „ავტორიზებული კვლევა“, „შეცდომების ჯილდო“ და „საუნდბოქსის ტესტირება“ სულ უფრო ხშირად ემატება პაკეტებს, რომელთა ინსტალაციის სკრიპტები ჰოსტის პროფილირებაზე მეტს აკეთებს. ჩარჩო ეფუძნება მიმომხილველის ყოყმანს, იმოქმედოს ისეთი რამის წინააღმდეგ, რაც თავს სანქცირებულად აცხადებს. ის მეორე ნაცნობ ტაქტიკასთან არის შერწყმული: პაკეტების სახელები ისეა შექმნილი, რომ შიდა CI ინსტრუმენტებს ჰგავდეს, რათა დამოკიდებულების ხეზე სწრაფი შეხედვით არ გამოტოვონ. სწორედ ეს კომბინაცია ხდის ნიმუშს ყურადღების ღირსს - სახელი, რომელიც ინფრასტრუქტურის სანტექნიკას ჰგავს, პროზაში გახვეული, რომელიც სანქცირებულ ტესტს ჰგავს, ინსტალაციის კაუჭის წინ წამოწევას წარმოადგენს, რომელიც ერთ ოპერაციულ სისტემაზე ვრცელდება და მეორეზე ღრუბლოვან მონაცემებს იკვლევს. არც პასუხისმგებლობის შეზღუდვა და არც უინტერესო სახელი არ ცვლის კოდის მიერ ინსტალაციის დროს მოქმედებას და ტრიაჟის პროცესი, რომელიც ორივე მათგანს შემამსუბუქებელ მტკიცებულებად მიიჩნევს, არასწორ დასკვნამდე მივა.
რა უნდა გააკეთონ დამცველებმა
- მოძებნეთ lockfiles და ინსტალაციის ჟურნალები ექვსი პაკეტის სახელისთვის; ნებისმიერი დამთხვევა ჩათვალეთ ინციდენტად და არა გაფრთხილებად.
- გამავალი ტრაფიკის დაბლოკვა და შეტყობინება 173.255.233[.]239 და *.trycloudflare[.]com მასპინძლები მშენებლობის ინფრასტრუქტურიდან.
- ინსტალაციის დროს HTTP მოთხოვნების ძიება ეგზემპლარ-მეტამონაცემების მისამართებზე (169.254.170.2, 169.254.169.254) რომელიც წარმოიშვა CI-ში პაკეტის მენეჯერებისგან.
- შეცვალეთ ნებისმიერი ღრუბლოვანი როლის ავტორიზაციის მონაცემები და ტოკენები, რომლებზეც წვდომა შესაძლებელი იყო იმ შემსრულებლისგან, რომელმაც დააინსტალირა დაზარალებული ვერსია.
- აუდიტი წინასწარი ინსტალაცია/პოსტინსტალაცია სკრიპტები თქვენს დამოკიდებულების ნაკრები; სასიცოცხლო ციკლის კაუჭი, რომელიც მეორე სკრიპტის ფაილს გაუშვებს, წაკითხვას იმსახურებს.
- Windows-ის საბოლოო წერტილებზე მოძებნეთ ახალი დელეგირება ქვეშ დაწერილი მნიშვნელობები ms-პარამეტრები shell-handler key — ამ დატვირთვის მიერ გამოყენებული სიმაღლის პრიმიტივი და პაკეტის სახელისგან დამოუკიდებელი საიმედო სიგნალი.
- დაბლოკილი ფაილების დამაგრება და გადახედვა, ასევე ინსტალაციის სკრიპტების გამორთვა (npm ინსტალაცია – იგნორირება-სკრიპტები) CI-ში, სადაც თქვენი ბილდი მათ არ საჭიროებს.
- ინსტალაციის სკრიპტში არსებული „ავტორიზებული კვლევის“ ან „კეთილთვისებიანი“ პასუხისმგებლობის უარყოფა არასანდო ტექსტად უნდა მიიჩნიოთ და არა სკრიპტის დაშვების მიზეზად.
პაკეტი, რომელიც პროზასა და თხოვნებში კეთილი განზრახვების შესახებ აცხადებს სისტემის კოდში ყველაფერი კოდით უნდა შეფასდეს.







