ההערות בקוד הזדוני הסבירו למפעיל מה הוא עושה: קמפיין ריגול על שרתי לינוקס ממשלתיים שבו מודל כתב את המטענים
בתוך אחד הסקריפטים הזדוניים שנמצאו על שרת ממשלתי פרוץ היו הערות, וזה לא דבר חריג. מה שכן היה חריג הוא מה שכתוב בהן: לא תיעוד של מפתח ליד שורה מסובכת, אלא הסבר שיחתי, שלב אחר שלב, שמספר למישהו אחר מה הקוד הולך לעשות ולמה. ההערות לא דיברו אל מי שיקרא את הקוד בעתיד. הן דיברו אל מי שביקש אותו.
חוקרי Unit 42 רועי פורת ותום פקטרמן פרסמו ב-15 באוקטובר תיעוד של אשכול פעילות שהם מסמנים CL-UNK-1211, שפעל לפי מה שראו מאוקטובר 2025 ועד אפריל 2026 נגד גופים ממשלתיים ותשתיות מדינתיות. התוקפים התמקדו בשרתי לינוקס, אספו מהם מודיעין לאורך חודשים, וניסו לחלץ מסדי נתונים שלמים ותיבות דואר רשמיות. ה-UNK בשם האשכול הוא הצהרה של החוקרים על מה שהם לא יודעים: Unit 42 מסמנת כך פעילות שעדיין לא קבעה אם מאחוריה מדינה או פשיעה. נעבור כאן על מה שכן ידוע, מהדרך שבה נכנסו ועד הדרך שבה ניסו לצאת בלי להשאיר לוגים.
מה מסגיר קוד שנכתב על ידי מודל?
הסקריפטים של הקמפיין נכתבו ב-PHP וב-Bash, והם עשו את העבודה הרגילה: שימור אחיזה בשרת, סריקה, והוצאת מידע החוצה. מה שבלט בהם הוא הצורה. במקום תיעוד של מפתח, חלק מהקבצים הכילו הערות שמסבירות את ההיגיון של הקוד בשפה חופשית, כאילו נכתבו בתשובה לבקשה. החוקרים מצביעים גם על כותרות סעיפים בתוך סקריפטים ובפלט של פקודות shell, מבנה שעוזר למודל לקרוא את התוצאה מהר יותר, על שימוש נרחב בפקודות מקודדות Base64, ועל מעבר חלק בין PHP, JavaScript, Bash ו-Python באותה שרשרת תקיפה.
כאן שווה לשים לב למה שהדוח לא אומר. לפי Unit 42, הסימנים האלה מצביעים על כך שהקוד או הועתק ישירות מפלט של מודל שפה, או הורץ על ידי סוכן AI אוטומטי. החוקרים לא מכריעים בין שתי האפשרויות, וההבדל ביניהן גדול: בראשונה יש אדם שמעתיק ומדביק, בשנייה יש מערכת שמריצה את השרשרת לבד.
הדלת שנפתחת לפני כל שורת קוד אחרת
כדי להיכנס ולהישאר, התוקפים שתלו על שרתי הלינוקס web shell-ים, חלקם שכתבו בעצמם וחלקם פרויקטים פתוחים מ-GitHub. ה-web shell הוא קובץ שהתוקף מעלה לשרת ומריץ דרכו פקודות מהדפדפן, מעין מסוף מרוחק שמתחזה לדף רגיל באתר. החלק המעניין הוא לא הקובץ עצמו אלא איך דאגו שיופעל.
ל-PHP יש הגדרה שאומרת לו לטעון קובץ מסוים לפני כל סקריפט אחר שרץ בשרת. ההגדרה נקראת auto_prepend_file, והיא קיימת כדי לאפשר למנהלי שרתים לטעון קוד משותף בלי לערוך כל דף בנפרד. התוקפים שינו אותה בכל קובצי התצורה של PHP תחת /etc/php/ ותחת /opt/plesk/php/, התיקייה של לוח הניהול Plesk, והפנו אותה לקובץ ששתלו בשם /usr/lib/php/plesk_sys_driver.php. מאותו רגע כל פנייה לכל דף PHP בשרת מריצה קודם את הקוד שלהם.
במקביל הם אספו סיסמאות בשלוש דרכים שאף אחת מהן לא דורשת לשבור הצפנה. הראשונה היא החלפת ה-.bashrc של המשתמש בעותק שמגדיר כינוי לפקודת sudo. כשהמשתמש מקליד sudo, מופיעה בקשת סיסמה שנראית בדיוק כמו בקשת האימות של המערכת, מה שהוא מקליד נרשם לקובץ יומן של התוקפים, ואז מועבר ל-sudo האמיתי כדי שהפקודה תעבוד כרגיל. המשתמש לא רואה שום דבר חריג.
את קובץ היומן הזה הם קראו Solarwinds.StatusLog.txt. Unit 42 מדגישה שלא נמצאה שום עדות לפריצה למערכות של SolarWinds, ושהשם נוצל רק כהסוואה, כדי שקובץ חדש בשרת ייראה כמו פלט של מוצר ניהול מוכר. הדרך השנייה הייתה שורת קוד שהוזרקה לדף התחברות ב-PHP, ככל הנראה בשגרת אימות מול מסד נתונים, ששלחה לאותו יומן שם משתמש וסיסמה של כל מנהל שהתחבר. השלישית הייתה פשוט לחפש: סריקה של קובצי תצורה ושל היסטוריית הפקודות אחרי סיסמאות דואר, SMTP ומסדי נתונים ששמורות בטקסט גלוי.
SysGoRAT, ושש הדרכים שלו להישאר
הכלי המרכזי של הקמפיין הוא סוס טרויאני לגישה מרחוק שהחוקרים קראו לו SysGoRAT, כתוב ב-Go ורץ גם על לינוקס וגם על ווינדוס. הם נתקלו בו לראשונה תחת השם התמים sys-control-client. הקשר לשרת השליטה והבקרה (C2, השרת שדרכו התוקף שולח פקודות לנוזקה) נפתח מעל WebSocket, עם כתובת ברירת מחדל שקבועה בקוד, 104.194.158[.]65 בפורט 443, שהמפעיל יכול לדרוס בפרמטר בשורת הפקודה.
הנוזקה מקבלת שבעה סוגי פקודות. אחת מריצה פקודות דרך /bin/sh בלינוקס או cmd בווינדוס, אחת פותחת session אינטראקטיבי, אחת מציגה תוכן של תיקייה, ושלוש עוסקות בפרוקסי: פתיחת חיבור TCP ליעד שרירותי, העברת נתונים דו-כיוונית דרכו, וסגירתו. שלוש האחרונות הן מה שהופך מכשיר נגוע מנקודת גישה בודדת לצומת שדרכו אפשר להמשיך פנימה ברשת. הפקודה השביעית, control, מתפצלת לארבע פעולות משנה: פתיחת bash, צילום מסך, הורדה של קובץ מהמכשיר, והתקנה של מנגנון לשימור אחיזה.
מנגנון שימור האחיזה תומך בשש שיטות. בלינוקס, העתקה עצמית ל-/usr/local/bin/ ורישום service בשם sys-update.service, או רשומת cron שמריצה את הנוזקה כל חמש דקות. בווינדוס, העתקה ל-%APPDATA% תחת תיקייה בשם Onedrive Update וקובץ בשם Updater.exe עם מפתח הרצה ברישום, או משימה מתוזמנת יומית בשם Onedrive. שתי הנותרות אוטומטיות, ואחת מהן בוחרת לפי מערכת ההפעלה בלי לבדוק אילו הרשאות יש למשתמש שמריץ אותה. על הדיסק הבינארי קיבל שמות משתנים כדי להיטמע, בהם pip2.7, ea_install ו-semanage.
תיבות הדואר, הדאמפים, והניקוי שאחריהם
בשלב המודיעין התוקפים ירדו לרמת המשתמש הבודד. הם מנו את התיקיות תחת /var/qmail/mailnames/ בכמה דומיינים, ספרו כמה הודעות שמורות אצל משתמשים מסוימים כדי לזהות מי מעניין, ואז שתלו סקריפט PHP בשם search_social.php שחיפש מילות מפתח בכותרות הודעות. המטרה הייתה למצוא התכתבויות של רשתות חברתיות, והסקריפט החזיר את הנתיב המדויק של ההודעה, את השולח, את הנמען ואת הנושא. מי ששולט בתיבת הדואר הרשמית שולט גם בשחזור הסיסמה של החשבונות שרשומים לאותה כתובת.
אחרי שזיהו את מה שרצו, הם ניסו להריץ סקריפט bash בשם zip_mails.sh שיעבור על תיקיות המשתמשים ויארוז תיבות דואר שלמות לקובצי ZIP. הסקריפט לא עבד. Unit 42 מצאה בו שגיאות תחביר, בהן השמה שבורה של משתנה, שהיו מפילות אותו בהרצה. זאת הערה קטנה בדוח, ואולי הממצא שהכי קשה להתעלם ממנו: קוד שנוצר מהר ונשלח לשרת של הקורבן בלי שמישהו הריץ אותו פעם אחת.
עם מסדי הנתונים הם נהגו בזהירות רבה יותר. קודם דגימה, מאה שורות מארבע טבלאות לקובץ SQLite מקומי תחת /tmp. אחר כך דאמפ מלא של אותן טבלאות לקובצי CSV, דחיסה, והוצאה החוצה. חלק מהניסיונות הופנו לשרת C2 ישיר, וחלק לשירותי אחסון קבצים לגיטימיים כמו transfer.sh, bashupload.com ו-filebin.net, כדי שהתעבורה היוצאת תיראה כמו גלישה רגילה ב-HTTPS.
הניקוי היה יסודי. התוקפים הריצו סקריפטים שניסו לסגור את תהליכי ההגנה של Cortex XDR על השרת, ולפי Unit 42 הניסיונות זוהו ונחסמו. סקריפטים חד-פעמיים נכתבו לדיסק, הורצו ונמחקו באותה פקודה אחת. לקבצים שנועדו להישאר לטווח ארוך הם שינו את חותמות הזמן כך שייראו כאילו נוצרו הרבה לפני תחילת התקיפה. בסוף נמחקו לוגים של אימות, של היסטוריית פקודות, של דואר, של מערכת ההפעלה ושל שרת האינטרנט, ואחריהם רץ סקריפט שבדק אם כתובות ה-IP של התוקפים אכן נעלמו מהלוגים.
(ובתוך כל זה, פרט שנראה כמו ביטוח: באחד הסקריפטים הם השאירו מפתח בשם RedTeamOps2025, ולמשתמש שיצרו נתנו את הסיסמה pentest123. מי שהיה נתקל בפעילות אמור היה להסיק שמדובר בתרגיל אדום מאושר.)
מה ה-AI באמת שינה כאן
רוב ארגז הכלים של הקמפיין לא חדש בכלל. להסלמת הרשאות הם הריצו את LinPEAS, כלי קוד פתוח שסורק מערכת לינוקס ומחפש נתיבים להרשאות גבוהות יותר, ואחריו את PwnKit, exploit מוכן ל-CVE-2021-4034, חולשה בת ארבע שנים ברכיב polkit שמקבלת ב-NVD ציון CVSS 7.8 ומביאה משתמש מקומי להרשאות root. לתנועה רוחבית הם השתמשו ב-SSH עם פרטי אימות שאספו, בכלי מנהור פתוחים, ובמנגנון xp_cmdshell של MSSQL כדי לעקוף חומות אש פנימיות.
הדבר היחיד שבאמת היה עדכני בארגז הכלים הוא סורק חולשות שהתוקפים כתבו בעצמם ב-Go, שמחפש שרתים חשופים ל-CVE-2025-55182, החולשה שמוכרת בשם React2Shell. לפי הרשומה ב-NVD מדובר בחולשת הרצת קוד מרחוק לפני אימות בגרסאות 19.0.0, 19.1.0, 19.1.1 ו-19.2.0 של React Server Components, בציון CVSS 10, שנובעת מפענוח לא בטוח של מטענים שמגיעים בבקשות HTTP אל ה-endpoint של Server Functions.
וזה מחזיר לשאלה מה ה-AI תרם כאן בעצם. ביולי תיעדה Unit 42 קמפיין אחר לגמרי, של שחקן דובר סינית בכינויים knaithe ו-KnYuan, שהפעיל את DeepSeek דרך מסגרת Hermes Agent כמפעיל תקיפה אוטונומי ושלט בו דרך טלגרם, עד כדי כך שכשהניסיון הראשון נכשל הסוכן חיפש לבד CVE-ים ו-PoC-ים ב-GitHub. CL-UNK-1211 הוא לא זה. כאן המודל לא קיבל את ההחלטות האופרטיביות, הוא כתב את הדבק: סקריפט לכל שלב, מהר, בכמה שפות, בלי שמישהו יישב ויכתוב אותם. ההבדל נשמע טכני, והוא מה שמסביר איך אותו קמפיין מראה בו-זמנית הבנה עמוקה של לינוקס ושל התנהגות שרתי PHP, וגם סקריפט שנופל על שגיאת תחביר.
מה זה אומר בפועל
מי שמריץ שרתי PHP, ובמיוחד שרתים עם Plesk, צריך לעבור על ערכי auto_prepend_file בכל קובצי התצורה ולוודא שאף אחד לא מצביע על קובץ שלא הוכנס לשם במכוון. זאת הגדרה אחת ששולטת בכל מה שרץ באתר, ובשגרה כמעט אף אחד לא מסתכל עליה. שווה לבדוק באותה הזדמנות גם את ה-.bashrc של משתמשים בעלי הרשאות, את authorized_keys, ואת חוקי חומת האש ליציאה, כי כל שיטות הגישה מרחוק שבדוח מסתמכות על יכולת השרת לפתוח חיבור החוצה. ואם יש אצלכם React Server Components באחת מארבע הגרסאות שברשימה, או שרת לינוקס בלי עדכון polkit מ-2022, אלה שתי החולשות שהקמפיין חיפש.
תגובות