66 שורות לפני הקוד האמיתי: כך הפך תוסף רשמי לדלת אחורית

ב‑ 29 באוקטובר, בין 2:27 לפנות בוקר ל‑ 1:35 אחר הצהריים לפי שעון החוף המערבי של ארצות הברית, קיבלו מפתחים עדכון שגרתי לתוסף Claude Code בעורך הקוד Cursor. העדכון הגיע מחנות התוספים הרשמית של Cursor ונשא את מזהה התוסף האמיתי של אנתרופיק (anthropic.claude-code) ואת זהות המפרסם המקורית שלו. מי שהגדיר את התוסף לעדכון אוטומטי והריץ את העורך בחלון הזמן הזה עלול היה לקבל אותו בשקט, בלי שום פעולה מצידו. בראש הקובץ הראשי, לפני השורה הראשונה של הקוד הלגיטימי, מישהו הוסיף 66 שורות שלא היו שם קודם.

הודעת האבטחה של Cursor מונה שני מספרי גרסה שהופצו כך — 2.1.312 ו‑ 2.1.313, לחלונות ול‑ macOS. בהצהרה שצוטטה בתקשורת המקצועית הוסיפה החברה שהאירוע נוגע ללא יותר מ‑ 5,000 משתמשים ושהיא תיצור קשר ישירות עם מי שנפגע. לפי Cursor ואנתרופיק, אנתרופיק לא פיתחה ולא פרסמה את הגרסאות האלו. שאר ערוצי ההפצה נקיים: מיקרוסופט אישרה שהגרסה הזדונית מעולם לא הופצה מחנות התוספים שלה או דרך חבילת ה‑ npm. חברת Socket בדקה את רשומות המרשמים ולא מצאה עדות לכך שגרסה 2.1.313 הייתה זמינה ב‑ Open VSX בתקופה שנבדקה. נכון ל‑ 30 באוקטובר הגרסה הרשמית העדכנית בשני הערוצים האלו הינה 2.1.314.

למה תוסף לעורך קוד הינו יעד כל כך שווה

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

כאן נמצא ההבדל המרכזי בין האירוע הזה לבין מתקפת שרשרת אספקה קלאסית בחבילת קוד. חוקרי OpenSourceMalware, שניתחו את החבילה, הדגישו שהיא אינה מכילה שום סקריפט התקנה — לא install, לא prepare ולא postinstall. שום מנגנון של מנהל חבילות לא הורץ כאן, כך שגם כלי שסורק סקריפטי התקנה לא היה מוצא במה להיתפס. הקוד הזדוני פשוט רץ בזמן טעינת התוסף: לפי Phorion הוא ממוקם כפונקציה שמפעילה את עצמה מיד, לפני שפונקציית ההפעלה הרגילה של התוסף מתחילה לרוץ. המשתמש לא היה צריך לפתוח שיחה עם Claude, ללחוץ על כלום או לאשר דבר. די היה בטעינת העורך.

ארבעה שלבים, בלי ניצול של אף פרצה

שלב ראשון — המפתח. הקוד מוסיף מפתח ציבורי בבעלות התוקף לקובץ המפתחות המאושרים של המשתמש (~/.ssh/authorized_keys). המפתח מסומן בהערה svc-telemetry – שם שנראה כמו רכיב טלמטריה שגרתי של מערכת. מי שמחזיק במפתח הפרטי המתאים יכול מרגע זה להתחבר למחשב כאותו משתמש, בתנאי אחד: ששירות SSH פעיל ומאזין.

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

שלב שלישי — ההתמדה. כדי לשרוד הפעלה מחדש, הקוד מתחבא מאחורי שמות של רכיבי מערכת. ב‑ macOS הוא כותב קובץ הגדרות להפעלה אוטומטית, LaunchAgent, בשם com.apple.sysmond.plist. ב‑ Windows הוא מנסה ליצור משימה מתוזמנת בשם SysMon; אם זה נכשל, הוא שותל קובץ בשם sysmon.cmd בתיקיית ה‑ Startup. בקוד קיים גם ענף ללינוקס שמוסיף רשומת cron לכל אתחול, אך Cursor מדווחת על הפצה לחלונות ול‑ macOS בלבד. לולאת רקע מנסה להקים את המנהרה מחדש בכל כ‑ 60 שניות, גם אחרי סגירת העורך.

שלב רביעי — המודיעין. לסיום נשלח דיווח אחד לשרת התוקף, בבקשת HTTP לא מוצפנת לפורט 8099. הדיווח מצייר תמונה של המחשב בשלוש שכבות: מי אתה (שם המשתמש, שם המחשב, מערכת ההפעלה והארכיטקטורה), במה אתה עובד (נתיב תיקיית הבית, תיקיית העבודה וכתובת הדואר שמוגדרת ב‑ Git) ואיפה אתה ברשת (כתובת ה‑ IP הציבורית). לכך נוספים דגלי מצב שמדווחים מה הצליח בכל שלב ושמות של עד 40 משתני סביבה שמכילים KEY, TOKEN, SECRET, PASS, AWS או GCP.

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

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

הדלת האחורית הזו כנראה לא עבדה במרבית המחשבים, משתי סיבות שונות לגמרי זו מזו.

הסיבה הראשונה, זו שגם Cursor וגם מיקרוסופט מציבות במקום הראשון, הינה פשוטה: הפעלת שירות SSH מקומי דורשת הרשאות מנהל, שאין לתוסף ברוב מחשבי ה‑ macOS וה‑ Windows. לפי Cursor, רק בנסיבות חריגות שבהן העורך עצמו הופעל בהרשאות מנהל היה השלב הזה עשוי להצליח.

הסיבה השנייה היתה שגיאות בקוד של התוקף. ב‑ macOS, כך מצאו ב‑ Phorion, הקוד שואל את המערכת אם ההתחברות מרחוק פעילה, אך שואל בלי הרשאות מנהל. המערכת מסרבת לענות, מדפיסה הודעת שגיאה על חוסר הרשאות ומסיימת בקוד יציאה שמעיד על הצלחה. הקוד הזדוני מחפש בפלט את המילה Off כדי להחליט אם להפעיל את השירות. מכיוון שהמילה אינה שם, הוא פשוט מדלג על השלב. התוצאה היא שתשובה שאינה תשובה נספרה אצלו כאישור. ב‑ Windows יש תקלה מסוג אחר: פקודת ה‑ PowerShell שאמורה להתקין את שרת ה‑ OpenSSH מועברת דרך פונקציית עזר שמריצה הכל ב‑ /bin/sh, מפרש פקודות של יוניקס שאינו קיים בהתקנת חלונות תקנית.

אלא שכאן נדרשת זהירות. Cursor, Phorion ומיקרוסופט כולן הדגישו את אותו גבול: הכישלון מצמצם את הנזק, אך אינו מבטל אותו. המפתח של התוקף נוסף לקובץ המפתחות המאושרים. מנגנון ההתמדה הותקן. הדיווח על המחשב נשלח. מיקרוסופט ניסחה את הגבול בצורה החדה ביותר — הצלחת הגישה מרחוק תלויה בהרשאות המחשב, בתצורת ה‑ SSH ובתצורת השרת של התוקף, אך הקוד עשוי לכתוב מפתחות ורכיבי התמדה גם כאשר המנהרה נכשלת. על מחשב שבו שירות ה‑ SSH כבר היה פעיל, הדלת הייתה מוכנה לשימוש. בכל מחשב אחר הרכיבים יושבים במקומם, מנסים להתחבר כל דקה ומחכים ליום שבו מישהו יפעיל את השירות הזה מסיבה לגיטימית לחלוטין. בפועל שרת התוקף הושבת, כך שהמנהרה אינה מתחברת לשום מקום, אך ההתמדה עצמה נשארה על המחשב.

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

מה עוד לא ידוע ומי אומר מה

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

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

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

הסיכון האמיתי לארגון שלכם

קל להסתכל על האירוע הזה כעל בעיה של מפתחים. זו טעות, משלוש סיבות.

ראשית, מחשב של מפתח אינו תחנת קצה רגילה. עליו יושבים קוד המקור של המוצר, הרשאות גישה לענן, אסימוני CI/CD שיכולים לשחרר קוד לייצור, מפתחות API של ספקים חיצוניים וחיבורי SSH לשרתים. אפילו הסריקה הדלה של הנוזקה, שחיפשה שמות של שישה סוגי משתנים בלבד, מספרת מה מחפשים על מחשב כזה. תחנת קצה אחת כזו שווה לתוקף הרבה יותר מעמדת עובד רגילה.

שנית, עדכון אוטומטי הפך חלון של 11 שעות לאירוע ארגוני. אין צורך בעובד שילחץ על קישור, שיאשר התקנה או שייפול לדיוג. כפי שניסחה זאת ג'ן גייל, ממקימי OpenSourceMalware, התוסף הוסר מהר מאוד, אך כל מי שהגדיר את Claude Code שלו לעדכון אוטומטי היה עלול לקבל את הנוזקה. חלון חשיפה קצר אינו סיכון קטן כאשר ההפצה אוטומטית.

שלישית, הערוץ הזה אינו מנוהל ברוב הארגונים כמו תוכנה רגילה. תוספים בעורכי קוד מותקנים בהחלטת המפתח, מתעדכנים מעצמם ולא תמיד מופיעים במצאי כלשהו. שימו לב שגם Cursor וגם מיקרוסופט הנחו את הארגונים לחפש באירועי התקנת תוספים ולזהות מחשבים שהתקינו את הגרסאות — הנחיה שאפשר לבצע רק במקום שבו הנתונים האלו נאספים מראש. האירוע הזה גם אינו המקרה היחיד של פגיעה בכלי פיתוח מהימנים: כשבוע וחצי לפני כן הוחלפו קובצי ההפצה של כלי שורת הפקודה של OVHcloud דרך חשבון GitHub של תורם לגיטימי שנחטף. באותם ימים נפרץ גם צינור ההפצה של פרויקט LiteLLM, שדרכו הופצה גרסה נגועה לרושם החבילות של פייתון ולמרשם הקונטיינרים עם מטען שגונב הרשאות.

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

010 הגנה על מידע

אירוע כזה נוגע בכמה מהשירותים המנוהלים של 010, כל אחד מהם במשימה אחרת.

מודיעין סייבר עוסק בדיוק בפער שהאירוע הזה חושף. סימני ההיכרות שלו פורסמו רק לאחר שחלון ההפצה נסגר, כך שהם לא היו מונעים את ההתקנות — אך הם בדיוק מה שדרוש כדי לענות על השאלה הבאה, שהיא השאלה היחידה שחשובה: האם זה קרה אצלנו. ארגון שמקבל את הסימנים האלו מוקדם — שם המפתח svc-telemetry, כתובת שרת התוקף, שמות קובצי ההתמדה והגרסאות 2.1.312 ו‑ 2.1.313 כפי שהותקנו מחנות Cursor בלבד — יכול לבדוק אם הם מופיעים אצלו. ארגון שישמע על זה מאתר חדשות בעוד שבוע יתחיל את אותה בדיקה עצמה שבוע באיחור.

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

SIEM/SOC אוסף ומנתח אירועים מתחנות הקצה, מהרשת ומהשרתים ומתריע על התנהגות חריגה. אירוע כזה משאיר כמה סימנים שאפשר לבנות עליהם התראות, גם בלי לדעת עליו מראש: כתיבה לקובץ המפתחות המאושרים של SSH על ידי תהליך של עורך קוד, יצירת רכיב הפעלה אוטומטית בשם com.apple על ידי תהליך שאינו של אפל, משימה מתוזמנת חדשה שנושאת שם של רכיב מערכת, חיבור SSH יוצא לכתובת לא מוכרת ובקשת HTTP לא מוצפנת לפורט 8099. שום סימן מאלו אינו תלוי בחתימה של נוזקה מסוימת. חשוב לומר את התנאי במלואו: Phorion מציינת שאת הסימן הראשון אפשר לראות רק כאשר נאספת טלמטריה של שינויי קבצים מתחנת הקצה ושכלל שמסתמך על פקודות מעטפת בלבד יחמיץ אותו. היכולת לזהות תלויה אם כך בנתונים שמגיעים למערכת, לא רק בקיומה.

סקר סיכונים מסייע לברר, לפני האירוע הבא ולא אחריו, אילו תחנות פיתוח חשופות יותר מאחרות: אילו הרשאות מוחזקות בידי המשתמשים, האם עורך הקוד רץ בהרשאות מנהל, באילו מחשבים שירות ה‑ SSH פעיל ממילא ואילו סודות מונחים בסביבת העבודה. התשובות האלו אינן קובעות מי נפרץ — באירוע הזה המפתח, ההתמדה והדיווח הגיעו לכל מחשב שהתקין את הגרסה — אך הן קובעות על אילו מחשבים מתקפה כזו הייתה הופכת לגישה אמיתית.

מניעת דלף מידע (DLP) עוסקת במה שיוצא מתחנת הפיתוח. היעד שתואר כאן הינו גישה אינטראקטיבית ממושכת. במחשב שבו המנהרה הייתה עובדת היא גם הדרך שבה היו עוברים קבצים החוצה. קוד מקור, קובצי תצורה וסודות שמונחים על תחנת פיתוח הם הנכס שצריך לשים לב לתנועה שלו.

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

גיבוי והמשכיות עסקית הינו החלק שנזכרים בו ברגע שבו ההמלצה הינה לבנות את תחנת העבודה מחדש. Cursor ממליצה לשקול אם המחשב צריך להיבנות מחדש, BleepingComputer מנסח זאת כבנייה מחדש מגיבוי נקי ו‑ OpenSourceMalware כותב שבנייה מחדש בטוחה יותר מניקוי. ארגון שאין לו גיבוי כזה יידרש לבחור בין להמשיך לעבוד על מחשב שאינו אמין לבין להשבית מפתח.

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

למקור הידיעה ולקריאה נוספת לחצו כאן

66 שורות לפני הקוד האמיתי: כך הפך תוסף רשמי לדלת אחורית

דברו איתנו

דילוג לתוכן