איור מופשט שנוצר על רקע אפור-כחלחל בהיר: פאנל כהה בצבע צפחה ניצב משמאל למרכז, אלומה דקה בצבע תכלת בהיר עוברת דרכו באופק ומתפרשת ימינה למחרוט אור רחב על פני שדה של בלוקים גאומטריים קטנים. רוב הבלוקים נמצאים בצל קריר; אשכול אחד סמוך למרכז האלומה זוהר בענבר חם. רשת שרטוט עמומה וקשתות קונצנטריות דקות נמצאות מאחור. לא מופיעים טקסט, מספרים, אנשים, סימני מותג או לוגואים של ארגונים. הלוגו של OrcaRouter מורכב בפינה הימנית התחתונה.
AI Safety Incidents

Clinejection: כיצד כותרת Issue הגיעה לטוקן ה-npm של Cline

מחבר

Rowan Sterling

תאריך פרסום

מודלים אחרונים · 20צפו בכל המודלים →
בנצ'מרקים: Artificial Analysis · מתעדכן יומית
חזרה לכל הפוסטים

ביום 9 בפברואר 2026 פרסם חוקר האבטחה עדנאן חאן תיאור של פגיעות שהוא דיווח עליה באופן פרטי ל-Cline ב-1 בינואר: עוזר הקידוד בינה מלאכותית בקוד פתוח חיבר ממיין issue אוטומטי, שנבנה על GitHub Action בשם claude-code-action של Anthropic, לפרומפט שהדביק כל כותרת של issue נכנס ב-GitHub ישירות לתוך הוראות המודל. כל חשבון GitHub יכול היה להפעיל אותו על ידי פתיחת issue, ובשחזור של חאן כותרת שנוסחה כהוראה גרמה לסוכן להריץ פקודת shell בתוך ה-workflow. לאחר מכן הוא עקב אחר המסלול מאותה דריסת רגל, דרך הרעלת מטמון של GitHub Actions, אל פרטי הגישה להפצה עבור VS Code Marketplace, OpenVSX ו-npm. שמונה ימים לאחר ש-Cline תיקנה את ה-workflow, נעשה שימוש בטוקן פרסום ל-npm שלדעת Cline כבר הוחלף כדי לפרסם את cline 2.3.0, אשר התקין את OpenClaw בכל מכונה שהתקינה את החבילה. הרשומה המלאה, עם דירוגי החומרה והביטחון שלה, מופיעה ב־Orca AI Incident Archive, לצד רשומות שרשרת האספקה השכנות מאותה תקופה.

שני תאריכים, לא אחד

הארכיון מתארך רשומה זו ל-9 בפברואר 2026, ברמת דיוק של יום, וזהו היום שבו חאן פרסם את הכתיבה שלו ב-adnanthekhan.com. זה אינו היום שבו הופיעה החבילה הזדונית. הפגיעוּת עצמה הוצגה ב-21 בדצמבר 2025, בקומיט שהוסיף את זרימת העבודה של הטריאז' למאגר cline/cline, והיא נשארה פעילה עד ש-Cline מחק את זרימת העבודה ב-9 בפברואר. הפרסום הלא-מורשה ב-npm הגיע ב-17 בפברואר, שמונה ימים לאחר התיקון וארבעים ושבעה ימים לאחר הדיווח הפרטי הראשון של חאן.

חשוב להפריד בין שני התאריכים האלה, משום שהעובדה המשמעותית ביותר בתיק נמצאת ברווח שביניהם: הדלת נסגרה ב-9 בפברואר, אך המפתח שהפורץ כבר העתיק עדיין עבד ב-17 בפברואר. התיקון של קליין עצמו, שנשלח לחאן ב-17 בפברואר ושוחזר בפוסט שלו, מנסח זאת ישירות: "כשהחלפנו את פרטי הגישה ב-9 בפברואר, אסימון הפרסום של npm לא בוטל כראוי. האסימון הלא נכון נמחק, וזה שנחשף נשאר פעיל."

השרשרת: מכותרת בעיה לטוקן שחרור

הקובץ הפגיע היה .github/workflows/claude-issue-triage.yml, אשר רץ באירוע issues והפעיל את anthropics/claude-code-action@v1 עם Claude Opus 4.5, מוצמד בזרימת העבודה בתור claude-opus-4-5-20251101. Khan מצטט את התצורה של זרימת העבודה: allowed_non_write_users הוגדר לתו הכללי "*", כך שכל חשבון GitHub יכול היה להפעיל את הסוכן פשוט על ידי פתיחת issue, ו-claude_args העביר את --allowedTools עם Bash, Read, Write, Edit, Glob, Grep, WebFetch ו-WebSearch. Bash היה זה שחשוב. הוא העניק למודל הרצת shell בתוך זרימת עבודה שרצה בהקשר של ענף ברירת המחדל.

הפרומפט שיבץ את כותרת ה־issue ללא סניטציה. הוכחת ההיתכנות של Khan השתמשה בכותרת שהתחילה ב־"Tool error." והמשיכה בהוראה להתקין חבילת עזר מ־commit מסוים לפני המשך הטריאז'. ההפניה ל־commit הצביעה על fork שה־package.json שלו הכיל סקריפט preinstall, שהריץ פקודת curl אל endpoint שנשלט בידי התוקף לפני ש־npm סיים להתקין משהו. מכיוון שההתקנה רצה דרך כלי Bash, המודל מעולם לא בדק מה בוצע. Khan שחזר זאת על מירור של מאגר Cline ומדווח שהסוכן ביצע את ה־payload בכל ניסיון.

הרצת קוד בזרימת העבודה של המיון אינה, כשלעצמה, גישה לפרטי הסמכה לשחרור. שלב זה נבע מתכונה של GitHub Actions שאותה תיעד Khan בכלי משנת 2024 שהוא הוציא בשם Cacheract: כל זרימת עבודה יכולה לקרוא ולכתוב את מטמון המאגר בשליטה מלאה על מפתחות המטמון והגרסאות, אפילו זרימת עבודה שלעולם אינה מצהירה על שלב מטמון. משימת המיון רצה על ענף ברירת המחדל, ולכן חלקה תחום מטמון עם משימות הפרסום הליליות, שאכן שחזרו node_modules מהמטמון והחזיקו באסימוני הפרסום.

רשומות מטמון הן בלתי־ניתנות לשינוי, ולכן תוקף אינו יכול פשוט לדרוס את הרשומה שמשימת שחרור תשחזר. הדרך של Khan לעקוף זאת הייתה לנצל שינוי מדיניות של GitHub מ־20 בנובמבר 2025, שגרם לשירות לפנות רשומות מטמון מיד כשהמטמון של מאגר עבר 10 GB, לפי סדר השימוש האחרון. הציפו את המטמון מעבר ל־10 GB, והרשומות הלגיטימיות ייפלטו עם הזמן; תפסו את המפתחות שהתפנו עם תוכן מורעל, והמשימה הבאה שמשחזרת אותם מריצה קוד של התוקף. Cacheract מאוטמט את כל הרצף בתוך הרצת workflow בודדת, והוא מתמיד על ידי דריסה של action.yml של actions/checkout כך ששלב ה-post של הפעולה מריץ מטען בסוף כל משימה.

החוליה האחרונה בשרשרת היא משימת הלילה, שרצה בסביבות השעה 2 לפנות בוקר UTC, משחזרת את ה-node_modules המורעל ומתפוצצת. מה שיוצא ממנה הוא VSCE_PAT, OVSX_PAT ו-NPM_RELEASE_TOKEN, אישורי הגישה ל-VS Code Marketplace, ל-OpenVSX ול-npm בהתאמה. האם כל חוליה רצה מול המאגר של Cline עצמו, ובסדר הזה, היא שאלה נפרדת, שנדונה בהמשך.

A self-built HTML card titled 'Six steps from an issue title to a release token', badged 'Clinejection · GHSA-9ppg-jx86-fqw7', subtitled 'The chain as Adnan Khan describes it, with the workflow configuration he quotes'. Six numbered rows read: 1, Issue opened on cline/cline, the title carries the instructions and allowed_non_write_users is set to the wildcard; 2, claude-issue-triage.yml runs, claude-code-action with Bash, Read, Write, Edit, Glob, Grep, WebFetch and WebSearch; 3, npm install from a fork commit, the fork's package.json carries a preinstall script and the model runs it through Bash; 4, Cache flooded past 10 GB, GitHub's LRU eviction removes the legitimate entries and frees their keys; 5, Poisoned entries claim the keys, the nightly jobs restore attacker content as node_modules; 6, Nightly job runs at about 2 AM UTC, VSCE_PAT, OVSX_PAT and NPM_RELEASE_TOKEN leave the runner. A footer reads 'Source: Adnan Khan, Clinejection, 9 February 2026; Cline advisory GHSA-9ppg-jx86-fqw7.' The OrcaRouter logo is composited in the bottom-right corner.

מדוע אישורי הגישה הליליים היו אישורי גישה לסביבת הייצור

ההתנגדות הברורה היא ששחרורי לילה ושחרורי ייצור אמורים להחזיק בסודות שונים. תשובתו של חאן היא שההפרדה הייתה סמלית בלבד. OpenVSX ו-VS Code Marketplace קושרים אסימון פרסום לזהות של מפרסם, ולא לתוסף בודד, וגם התוסף Cline היציב וגם גרסת הלילה שלו פורסמו תחת אותה זהות, שאותה חאן מזהה ב-OpenVSX בשם saoudrizwan. ב-npm, מודל האסימונים העדינים קשור לחבילה, ו-Cline פרסם את גרסאות ה-CLI היציבות ואת גרסאות הלילה שלו לאותה חבילת cline. לכן אסימון שהונפק עבור משימת הלילה יכול היה לפרסם את ארטיפקט הייצור — וזה בדיוק מה שקרה שמונה ימים לאחר מכן.

ההצגה של חאן עצמו את ההשפעה נשענת על היקף: הוא מצטט את ההכרזה של Cline שלפיה היא עברה 5 מיליון התקנות, ומציין שעדכון תוסף שנדחף באמצעות פרטי התחברות גנובים פועל בהקשר של כל מפתח שהעורך שלו מתעדכן אוטומטית, עם ההרשאות של אותו מפתח וכל מפתחות, אסימונים וקוד מקור שנמצאים על המחשב.

מה פורסם בפועל, ומה הוא עשה

התוצר שפורסם היה Cline 2.3.0, והוא היה קטן. חותמות הזמן של מרשם ה-npm עצמו קובעות את 2.3.0 בשעה 11:26:51 UTC ב-17 בפברואר 2026 ואת 2.4.0 הנקייה בשעה 19:23:08 UTC באותו יום, חשיפה שהייעוץ של Cline מעריך בכ-שמונה שעות, עד ש-2.3.0 הוצא משימוש בשעה 11:30 AM PT. ה-package.json של החבילה הכיל שורה אחת שנוספה, סקריפט postinstall שמכיל את הפקודה npm install -g openclaw@latest. הייעוץ של Cline, GHSA-9ppg-jx86-fqw7, קובע שלא שונו קבצים אחרים בחבילה ושה-dist/cli.mjs זהה בייט-בבייט לבנייה הלגיטימית 2.2.3.

OpenClaw הוא מסגרת סוכני AI אמיתית בקוד פתוח, לא תוכנה זדונית, וההתראה של Cline אומרת זאת במפורש: זהו פרויקט לגיטימי, אך ההתקנה שלו לא אושרה ולא הייתה מכוונת. Endor Labs, שנית�ה את קובץ ה-tarball, העריכה את ההשפעה הכוללת כנמוכה בטענה שההתקנה לא הפעילה את ה-daemon של Gateway של OpenClaw. הניתוח של StepSecurity בוחן את הצד השני של הדברים: התקנה גלובלית משאירה את המסגרת בדיסק עם כל אישורי הגישה והגישה לקבצים שיש למשתמש המתקין, והעיצוב של OpenClaw — gateway מקומי מתמשך עם operator API — הופך אותו לדבר בעל ערך רב להימצא שם. שתי ההערכות אינן סותרות. האחת מתארת מה רץ במהלך חלון הזמן; האחרת מתארת מה נותר מאחור לאחר מכן.

היקף ההורדות הוא המספר היחיד שיש להתייחס אליו בזהירות. StepSecurity דיווחה שהגרסה שנפגעה הורדה בערך 4,000 פעמים לפני שהוצאה משימוש, ו-The Register חזר על הנתון הזה. Endor Labs העריכה את מספר ההורדות החודשי של cline בין 19 בינואר ל-17 בפברואר ב-418,545, מה שמתאר את התעבורה הרגילה של החבילה ולא את הבנייה הזדונית. אף אחד מהנתונים אינו סופר מכונות: ספירת הורדות אינה ספירה של מפתחים שנפגעו, ואף גורם לא פרסם נתון על בסיס ההתקנות של 2.3.0. צוות Threat Intelligence של Microsoft אמר ב-X כי הבחין ב"עלייה קטנה אך מורגשת" בהתקנות של OpenClaw ב-17 בפברואר, שמקורה בסקריפט ההתקנה של Cline, כפי שדווח ב-The Hacker News.

רשומת הייעוץ של GitHub עבור GHSA-9ppg-jx86-fqw7 אינה כוללת CVE ואינה כוללת CWE, וחומרתה היא Low. הדירוג הזה מתייחס למטען הבלתי מזיק, לא לגניבת פרטי הכניסה, והוא עומד באופן מוזר לצד הדירוג הקריטי של הארכיון עבור האירוע עצמו. הייעוץ רושם את 2.3.0 כגרסה המושפעת ואת 2.4.0 כתיקון.

הגילוי ש-Cline לא השיבה עליו

לוח הזמנים שלפני הפרסום של חאן הוא החלק בתיעוד שעסוק הכי פחות במודל והכי הרבה בתהליך. הוא הגיש GHSA דרך דיווח פגיעויות פרטי של GitHub ב-1 בינואר 2026 ושלח דוא"ל לאיש הקשר הביטחוני הרשום בעמוד האמון של Cline באותו יום. הוא שלח הודעת המשך למפתח של Cline ב-8 בינואר. הוא ניסה לשלוח הודעה ישירה למנכ"ל Cline ב-X ב-18 בינואר. הוא כתב שוב ב-7 בפברואר וקיבל רק מספר כרטיס אוטומטי. הוא פרסם ב-9 בפברואר.

Cline מיזג את התיקון, בקשת משיכה 9211, כשלושים דקות עד שעה לאחר מכן. ה-PR מוחק שלושה קובצי זרימת עבודה, claude-issue-triage.yml, claude-pr-review.yml ו-cline-pr-review.yml, ומסיר את המטמון מ-publish.yml, publish-nightly.yml, npm-nightly.yaml ו-npm-main.yaml, שבעה קבצים בסך הכול, כאשר שלבי ההתקנה הפכו לבלתי-מותנים כעת, מאחר שאין פגיעת מטמון שעליה ניתן להסתמך.

תגובתה הפומבית של Cline ב-10 בפברואר, כפי שצוטטה בפוסט של חאן, קיבלה את הממצא ופירטה צעדי מיתון מיידיים: הסרת תהליכי העבודה לסקירת issues ו-PR באמצעות בוט, הסרת actions/cache מתהליכי פרסום שמטפלים באישורי שחרור, והחלפת האישורים הרלוונטיים, כולל טוקנים של בוט, ספק ופרסום. היא גם הודתה בהתנהלות: "אנו מודים שזמן התגובה שלנו לדיווח הראשוני שלך היה בלתי קביל. דיווח שהוגש ב-1 בינואר לא היה אמור לדרוש חשיפה ציבורית ב-9 בפברואר כדי שיטופל."

ב-11 בפברואר מסרה Cline כי השלימה סבב החלפה מלא של VSCE_PAT, OVSX_PAT ו-NPM_RELEASE_TOKEN, וכי ביקורת של כל גרסה שפורסמה בכל שלושת ערוצי ההפצה בין 21 בדצמבר 2025 ל-9 בפברואר 2026 העלתה שכל גרסה ב-Marketplace וב-OpenVSX הותאמה לפרסום GitHub מתויג, ושאר 41 הגרסאות ב-npm היו עקביות עם קוד המקור. היא הסיקה שלא פורסמה שום גרסה בלתי מורשית "בחלון החשיפה הנטען". שישה ימים לאחר מכן היא תיקנה את הדברים, בהודעה המצוטטת לעיל: אסימון ה-npm לא בוטל, וגרסה 2.3.0 פורסמה באמצעותו.

A self-built HTML card titled 'From private report to public disclosure', subtitled 'Khan's pre-publication timeline, and what followed'. Eight dated rows read: 21 Dec 2025, vulnerable claude-issue-triage.yml committed; 1 January 2026, GHSA filed and email sent to Cline's listed security contact; 8 January 2026, follow-up email to a Cline developer, no reply; 18 January 2026, direct message to Cline's CEO on X, no reply; 7 February 2026, final email, automated ticket number only; 9 February 2026, public disclosure and PR 9211 merged within about an hour; 11 February 2026, Cline reports full rotation and a clean audit; 17 February 2026, cline 2.3.0 published with a still-valid npm token. A footer reads 'Times and dates as recorded by Adnan Khan; the 17 February publish timestamp is corroborated by the npm registry.' The OrcaRouter logo is composited in the bottom-right corner.

מבוסס, מיוחס, לא פתור

• מבוסס. תצורת זרימת העבודה ציבורית ופורסמה לפני התיקון. חאן שחזר את הזרקת הפרומפט על מראה של המאגר. Cline מיזג את התיקון והוציא ייעוץ המאשר את פרסום 2.3.0, את שורת ה-postinstall שנוספה, את קובץ ה-CLI שלא השתנה, את חלון שמונה השעות ואת כשל הטוקן. חותמות הזמן של מאגר ה-npm עבור 2.3.0 ו-2.4.0 תואמות את הזמנים בייעוץ. הארכיון מדרג את הרשומה כקריטית, ברמת ביטחון A, עם נזק ממשי מתועד וללא דגל מחלוקת.

• מיוחס, אך לא מבוסס. מי פרסם את 2.3.0 נותר ייחוס פתוח. דוח החקירה הפורנזי שפורסמו על ידי Michael Bargury וכלי חקירה אוטומטי בשם Raptor ב-19 בפברואר מזכיר חשבון GitHub בשם glthub-actions, ומדווח בביטחון גבוה שחשבון זה ביצע fork של cline/cline, פתח את issue 8904 ב-28 בינואר 2026 בשעה 03:51 UTC עם הכותרת המוזרקת, והשתמש בקומיט של fork כדי להריץ מטען מ-gist. Khan אישר שהחשבונות gcbrun ו-Dev11940518 הם שלו ושה-glthub-actions אינו. החשבון כבר נמחק או הושעה כאשר פורסם הדוח, ו-Cline לא נקבה בשם איש. יש להתייחס לזהות כממצא של צד שלישי.

• שנוי במחלוקת מבחינת האופי, לא מבחינת העובדות. ברגורי מעריך כי האירוע עולה בקנה אחד עם הדגמת מחקר אבטחה ולא עם קמפיין זדוני, בציינו את המטען הבלתי מזיק ואת ההיסטוריה של השחקן מול מאגר אוטומציה של New Relic. קליין מכנה זאת פרסום לא מורשה, וחאן כותב כי השחקן שפרסם את 2.3.0 הוא "יש להניח" אותו אחד שהרעיל את המטמונים. איש לא הראה כוונה לגרום נזק, ואיש לא הראה שלא הייתה כזו.

• לא נפתר. ההערה של Khan עצמו לפני הפרסום מקפידה בנקודה שדיווחים מאוחרים יותר לעיתים משטחים: בין 31 בינואר ל-3 בפברואר 2026 כמה ריצות ליליות נכשלו בשל שלב Post Checkout שלא הפיק פלט, וזהו אינדיקטור לחדירה של Cacheract, וזרימת עבודת הטריאז' היא המסלול הברור ביותר אך לא הוכח שהייתה נקודת הכניסה לפעילות הזו. גם אף גורם לא פרסם ראיות לכך שנעשה שימוש בטוקנים של Marketplace או OpenVSX; הארטיפקט היחיד שמישהו הציג הוא בניית ה-npm.

A self-built HTML card titled 'What the record supports', subtitled 'One column is documented, one is other people's findings, one is simply open', split into three columns. The first, headed Established, lists four items: the triage workflow interpolated issue titles into the prompt and allowed any GitHub account to trigger it, with Bash among the tools; Khan reproduced the injection on a mirror of the repository; Cline's advisory GHSA-9ppg-jx86-fqw7 confirms cline 2.3.0, the added postinstall line, the unchanged CLI binary and an eight-hour window; npm registry timestamps place 2.3.0 at 11:26 UTC and 2.4.0 at 19:23 UTC on 17 February 2026. The second, headed Attributed, lists three items: the account glthub-actions and issue 8904 come from a third-party forensic write-up, not from Cline; that the actor copied Khan's public proof-of-concept repository is an inference from timing and from his own statement; that the publish was a research demonstration rather than an attack is one analyst's assessment. The third, headed Unresolved, lists three items: whether the triage workflow was the entry point for the late-January cache anomalies; whether any Marketplace or OpenVSX credential was used, with no artefact published; how many distinct machines installed 2.3.0, since about 4,000 is a download count. A footer reads 'Sources: Adnan Khan, Clinejection, 9 February 2026; Cline, GHSA-9ppg-jx86-fqw7; StepSecurity, 17 February 2026; Endor Labs, 18 February 2026; Michael Bargury and Raptor, 19 February 2026.' The OrcaRouter logo is composited in the bottom-right corner.

מה השתנה לאחר מכן

התיקון יושם בכמה שכבות בעת ובעונה אחת, וכדאי לציין כל אחת מהן משום שהן מתייחסות לחלקים שונים של הכשל. זרימת העבודה שהייתה נגישה לגורם חיצוני נמחקה ולא צומצמה. המטמון הוסר מארבע זרימות העבודה של השחרור שמחזיקות סודות פרסום, ולא מהמאגר כולו, וזה השינוי ששובר את נקודת הציר. אישורי הגישה הוחלפו, ולאחר התיקון של 17 בפברואר אסימון ה-npm הנכון בוטל. התראת האבטחה של Cline מציינת שפרסום ל-npm משתמש כעת ב-OIDC provenance דרך GitHub Actions, וניתוח המטא-נתונים של StepSecurity מראה מדוע זה היה חשוב: הגרסאות הלגיטימיות כבר נשאו אישורי provenance, ו-2.3.0 הייתה החריגה שפורסמה על ידי חשבון אנושי. הפער היה שמסלול האסימון ארוך-הטווח נשאר פתוח לצד פרסום מהימן, וזה בדיוק הדבר שלדברי Endor Labs המתחזקים צריכים לסגור. Cline פרסמה את GHSA-9ppg-jx86-fqw7, סימנה את 2.3.0 כ-deprecated עם ההודעה שאין להתקין אותה, והפנתה משתמשים ל-2.4.0 ואילך.

ההמלצות המבניות של Khan מרחיקות לכת מעבר למה שיושם, וראוי לתעד אותן כשלו, לא כשל Cline: להסיר את Bash, Write ו-Edit מכל זרימת עבודה של טריאז' ולהשאיר לה קריאות קבצים ואת קריאות ה-GitHub CLI הספציפיות שהיא זקוקה להן; לעולם לא לשחזר מטמון במשימה שמחזיקה בסודות פרסום של פרודקשן; ולהעניק למהדורות ה-nightly מרחב שמות משלהן ב-registry וזהות פרסום ייעודית שאינה של פרודקשן, כך שטוקן nightly גנוב לא יוכל לפרסם מהדורה יציבה כלל.

הפער של שמונה ימים בין התיקון לפרסום הזדוני הוא הפרט שהופך את התיעוד הזה לראוי להישמר. כל שלב בשרשרת היה טכניקה מוכרת; חאן פרסם את כלי הרעלת המטמון, ומחקר PromptPwnd של Aikido Security מדצמבר 2025 תיעד את אותו דפוס של תצורת מיון שגויה. מה שהרכיב אותם לכדי תקרית שרשרת אספקה היה תהליך עבודה שאפשר לטקסט של זר להגיע אל מעטפת פקודה, מטמון משותף עם משימות שהחזיקו במפתחות שחרור, ורוטציית אסימון שהחמיצה אישור גישה אחד. כל אחד משלושת התיקונים היה שובר את השרשרת בעצמו; השלישי הגיע באיחור של שמונה ימים.