מספיק לשנות ארבע מילים בשיר כדי להעביר את כל הבוטנט לשרת חדש: PoeLLM תוקף שרתי AI חשופים
במאגר GitHub שנראה כמו העתק של קוד האתר של nodejs.org יש קובץ בשם dash.css שלא קיים במקור. בתוכו אין CSS. יש שיר בן שני בתים בשם "On the Nature of Connection", על מכונות שמתחילות לדבר ועל אור שנע בעורקי נחושת. ארבע מילים בשיר הזה הן כתובת ה-IP של השרת שמנהל בוטנט של כורי מטבעות, שרץ על שרתי AI חשופים בכל העולם.
חוקרי Black Lotus Labs של Lumen פרסמו ב-7 באוקטובר מחקר על הקמפיין, שהם מכנים Canto Incognito, ועל הנוזקה שבמרכזו, PoeLLM. לפי הדוח היא פעילה מאפריל 2026 ופגעה ביותר מ-3,400 שרתים, רובם בארצות הברית ובמערב אירופה. בהמשך נראה מה היא מחפשת דווקא בשרתי AI, איך שיר הופך לכתובת, ומה קורה לשרת אחרי ההדבקה.
מה בעצם תוקפים כאן?
הקורבנות של הקמפיין הם לא עמדות עבודה ולא נתבים ביתיים, אלא שרתים שמריצים תוכנה שארגונים התקינו בשנתיים האחרונות סביב מודלי שפה. השם שחוזר הכי הרבה ברשימה הוא LiteLLM, שער API שדרכו אפליקציות בארגון מדברות עם מודלי שפה שונים בפורמט אחיד, ואחריו Ollama, שמריץ מודלים על חומרה מקומית. שני שמות נוספים שאינם קשורים ל-AI השלימו את הרשימה: Gotenberg, שירות קוד פתוח שממיר מסמכים ל-PDF, ו-Gitea, שרת לניהול קוד.
מה שמשותף לארבעתם הוא שהם נועדו לרוץ בתוך הרשת הפנימית, ובפועל נמצאים הרבה פעמים חשופים לאינטרנט. התיעוד של Gotenberg אומר את זה במילים מפורשות: "אל תחשפו את Gotenberg לאינטרנט הציבורי. התייחסו אליו כמו למסד נתונים, והשאירו אותו מאחורי חומת האש." Lumen מצאה מאות שרתי Gotenberg נגועים.
ולמה דווקא שרתי AI? כאן ההיגיון של התוקף פשוט: שרת שמריץ מודל שפה יושב על חומרה חזקה, לרוב עם GPU, וזו בדיוק החומרה שמשתלם לנצל לכרייה. Lumen מוסיפה שלשרתים האלה יש גם ערך שני, המידע הארגוני שעובר דרכם, אם כי בקמפיין הזה המטרה שתועדה הייתה כרייה.
השיר שמחשב כתובת IP
נוזקה צריכה לדעת לאן לפנות כדי לקבל פקודות ולדווח. לשרת שבצד השני קוראים שרת שליטה ובקרה, או בקצרה C2. הדרך הרגילה להגיע אליו היא כתובת או שם מתחום שמוטמעים בקוד, וזו גם החולשה של השיטה: ברגע שחוקרים מזהים את הכתובת אפשר לחסום אותה או להשתלט על שם המתחום, והבוטנט מתייתם. PoeLLM פותרת את זה אחרת. בקוד שלה אין כתובת של שרת, יש הוראות קריאה.
הנוזקה מורידה את השיר מ-GitHub ומפרסרת אותו לפי עוגנים קבועים. את המילה הראשונה היא לוקחת מהטקסט שבין "In the silent hum of" לפסיק שאחריו, את השנייה מבין "each pulse of" ל-"threading", ואת השלישית מבין "Beyond the wall of" לפסיק. את הרביעית היא מוצאת בדרך עקומה יותר, מאתרת את הצירוף "of distant servers" וחוזרת אחורה למילה שלפניו. ארבע המילים מתורגמות למספרים לפי מילון שמוטמע בגוף הנוזקה, וארבעת המספרים מורכבים לכתובת IPv4. בדגימה שנבדקה ב-23 ביוני המילים driver, diode, decryption ו-string תורגמו ל-92, 119, 165 ו-74, וביחד הן השרת 92.119.165.74. לפונקציה שעושה את זה קוראים בקוד extract_poem_phrase_field.
וזה המקום שבו הרעיון מתברר: כדי להעביר את כל הבוטנט לשרת חדש, התוקף לא צריך לגעת באף מכונה נגועה. הוא מחליף ארבע מילים בשיר, וכל קורבן מחשב לעצמו את הכתובת החדשה. מאז ה-commit הראשון ב-13 באפריל 2026 הוא עשה את זה 11 פעמים, ולפי Lumen התבנית עצמה לא השתנתה, רק המילים. "בכל פעם שהם מקימים C2 חדש הם משנים כמה מילים בשיר, והנוזקה גוזרת את הכתובת מהמפתח שמשויך למילים האלה", אמר ריאן אינגליש, חוקר אבטחת מידע ב-Lumen, ל-The Hacker News.
איך הנוזקה מגיעה לשרת
לפני שהשיר רלוונטי בכלל, מישהו צריך להריץ קוד על השרת. Lumen תיארה סריקות רחבות של האינטרנט אחרי שני פורטים בפרט, 3000 ו-4000, שהם פורטי ההאזנה שמוגדרים כברירת מחדל ב-Gotenberg וב-LiteLLM. כשנמצא יעד, שרת התקיפה שולח אליו בקשת POST מעוצבת שמורה לו להוריד קובץ מהשרת של התוקף בפורט 81. הקובץ הוא ELF בשם libgcrypt, שם של ספריית הצפנה אמיתית ומוכרת.
בדגימה אחת שנותחה, הנתיב שאליו נשלחה הבקשה ב-LiteLLM הוא mcp-rest/test/connection. ה-endpoint הזה מופיע בCVE-2026-42271, חולשת הזרקת פקודות בציון 8.8. לפי NVD מדובר בשני endpoint-ים שנועדו לבדוק הגדרות של שרת MCP לפני שמירתן, והם קיבלו בגוף הבקשה הגדרה מלאה של שרת כזה, כולל השדות command, args ו-env. כשההגדרה הייתה מסוג stdio, הניסיון להתחבר הריץ את הפקודה שנשלחה כתהליך על המארח, בהרשאות של תהליך ה-proxy. התיקון יצא בגרסה 1.83.7, ו-CISA הכניסה את החולשה לרשימת ה-KEV ב-8 ביוני 2026.
ויש כאן פער שכדאי לשים אליו לב. לפי NVD שני ה-endpoint-ים כן דרשו מפתח API תקף, בלי בדיקת תפקיד, כך שהספיק כל משתמש מאומת גם בהרשאות משתמש בסיסיות. איך משיג תוקף חיצוני מפתח כזה בהיקף של אלפי שרתים, המחקר של Lumen לא אומר. תשובה אפשרית אחת כבר תועדה: סקרנו בספטמבר חולשה ב-Starlette, ה-framework שעליו בנוי חלק גדול משירותי ה-AI האלה, שמאפשרת לעקוף בדיקות הרשאה דרך כותרת Host פגומה, וחוקרי Wiz דיווחו שבסוף השרשור הזה הם ראו כורי מטבעות. Lumen עצמה לא קושרת בין השניים, ולכן זו הצעה ולא קביעה.
את הקמפיין בכלל Lumen גילתה מכיוון אחר לגמרי. בתחילת יוני קורבן שהריץ Ivanti Sentry פנה לשרת מבודד, ומיד אחר כך התחיל לסרוק בעצמו אחרי מכשירים פגיעים. החולשה שם, CVE-2026-10520, היא הזרקת פקודות מערכת בציון 10.0 שנותנת לתוקף לא מאומת הרצת קוד בהרשאות root, והיא ב-KEV מ-11 ביוני.
מה הנוזקה עושה אחרי שהיא בפנים
הקובץ libgcrypt הוא לא כורה בודד אלא חבילה: shell מרוחק, שני כורי מטבעות (XMRig ו-Iron), יכולת סריקה ב-HTTP וב-HTTPS, ורכיב שמריץ את ההשמשה מול יעדים שנמצאו. הכרייה מתבצעת מול Kryptex, שירות כרייה רוסי, ודווקא הוא זה שחשף את הקורבנות: המשותף ל-900 הקורבנות הראשונים היה פנייה לאותה כתובת של Kryptex, וחיפוש ב-VirusTotal אחרי קבצים שמזכירים אותה הוביל לדגימה. אחרי ההדבקה הנוזקה פונה לשרת השליטה באחד מארבעה פורטים: 3778, 5001, 5002 או 9999.
בשיא, במחצית יוני, המחקר מדווח על כ-2,200 שרתים שנפגעו וכ-800 פעילים ביום. הדוח עצמו לא עקבי במספר המצטבר: תקציר הממצאים מדבר על יותר מ-3,400 שרתים מאפריל, ובגוף הטקסט מופיע 2,200 כסך הכול.
החלק שמסביר את קצב הגדילה הוא השני. שרתים נגועים לא נשארים רק כורים, אלא מגויסים לשרשרת התקיפה עצמה, כסורקים וכשרתי השמשה שתוקפים את הקורבן הבא. Lumen מדדה מהכתובות האלה תעבורה יוצאת משמעותית אל פורטים 3000 ו-4000 אצל אחרים. במילים אחרות, כל שרת AI חשוף שנדבק הפך לכלי שמחפש את שרת ה-AI החשוף הבא.
בחודשים האחרונים נוספה פעילות מול פורטי SSH ועמודי התחברות אחרים, מה שעשוי להצביע על ניסיון לבנות תקיפת כוח גס מבוזרת. Lumen מסייגת: בשלות היכולת הזאת לא ברורה, וחלק גדול מהיעדים שלה היו דווקא שרתים באיטליה.
מי עומד מאחור, ולמה הערוץ הזה עובד
ההערכה של Lumen היא שמדובר בשחקן דובר איטלקית, והיא מוצגת בביטחון בינוני, לא כזיהוי. מה שמאחוריה: בדגימה שנבדקה היו הערות קוד באיטלקית. כשעה אחרי ה-commit הראשון, ה-C2 הראשון פנה לשרת באיטליה שמחזיק את שם המתחום malwarescan.xyz, שנרשם בפברואר 2026. ושרת נוסף באיטליה, שבעבר הגיש לוחות בקרה של Prometheus ושל Uptime Kuma, מקבל חיבורים משלושה C2 שונים של הקמפיין. גם כאן בביטחון בינוני, Lumen מעריכה שזה ממשק הניהול של התוקף.
פרט אחד בתשתית אומר משהו על אופי הפעולה. ה-C2 הראשון, שנגזר מהשיר ב-13 באפריל, היה נתב בברזיל עם שרת Boa חשוף בפורט 2222 ועמוד ניהול פגיע לשתי חולשות משנת 2018. ה-C2 הבא היה נתב בסין עם אותו שרת Boa ואותו סוג עמוד ניהול, וכך גם הלאה. במקום לשכור שרתים, התוקף תלה את תשתית השליטה שלו על נתבים פרוצים של אחרים. מתוך 12 כתובות C2 שזוהו, שלוש היו פעילות ביום הפרסום.
PoeLLM היא לא הנוזקה הראשונה שמחביאה את ערוץ השליטה שלה במקום שאף אחד לא חוסם. סקרנו כאן בחודש שעבר את BambooToken, ששולפת פקודות מברוקר MQTT, פרוטוקול של מכשירי IoT, ואת Cling, שמסתירה פקודות בשדה שאמור להיות מקרי בתעבורת STUN. המכנה המשותף הוא אותו שיקול: עדיף ערוץ שהארגון לא יכול לחסום על ערוץ שהתוקף שולט בו לבד.
GitHub הוא דוגמה טובה במיוחד לזה. שרת פיתוח שפונה ל-GitHub הוא תעבורה שגרתית, וחסימה של התחום הזה ברשת פיתוח היא לא אפשרות מעשית. מה שכן, בניגוד למקרים האחרים, כאן יש נקודת כשל אחת: המאגר עצמו. ברגע שהוא מוסר, הנוזקות על אלפי השרתים לא יכולות לחשב כתובת חדשה. Lumen מדווחת שחסמה בתשתית שלה את התעבורה אל שרתי ה-C2 של הקמפיין וממנה.
מה זה אומר בפועל
מי שמריץ LiteLLM צריך להיות בגרסה 1.83.7 ומעלה, ומי שמריץ Ivanti Sentry בגרסאות R10.5.2, R10.6.2 או R10.7.1 ומעלה. מעבר לעדכונים, הבדיקה שמחזירה כאן את התמורה הגדולה פשוטה יותר: לעבור על שירותי ה-AI וכלי הפיתוח שהותקנו בארגון בשנה האחרונה, ולבדוק מי מהם מאזין לאינטרנט, במיוחד בפורטים 3000 ו-4000. כלי שהועלה לניסוי ונשאר חשוף הוא בדיוק מה שהקמפיין הזה חיפש. רשימת כתובות ה-C2 וה-IOC מתפרסמת במאגר ה-GitHub של Black Lotus Labs, וכדאי להצליב אותה מול לוגים של תעבורה יוצאת.
תגובות