מי שיגיע לחקור את המכשיר הנגוע ויחפש את הקובץ הזדוני בתיקיית /sbin לא ימצא שם כלום. הסקריפט שהתוקפים הריצו העתיק לשם שני קבצים, הריץ את שניהם, חיכה עשר שניות ומחק אותם. שני התהליכים ממשיכים לרוץ. ב-Linux זאת התנהגות חוקית: קובץ שנמחק בזמן שתהליך מריץ אותו נשאר בזיכרון עד שהתהליך נסגר, ו-/proc/PID/exe מצביע על נתיב שמסומן (deleted). אין מה לחשב עליו hash ואין מה לשלוח לניתוח.

חוקרי Rapid7 Intelligence פרסמו ב-2 באוקטובר ניתוח של אוסף דגימות Linux שנמצאו על רכיבי תקשורת ועל שערי אבטחת דואר בטייוואן ובקוריאה הדרומית. האוסף כולל גרסה חדשה של BPFDoor, גרסת Rekoobe שבנויה על אותו רעיון, את ה-dropper שמתקין אותם, ושש גרסאות בנייה של שתל שהחוקרים קוראים לו AVERAT. מה שמחבר אותן הוא לא טכניקה אחת אלא הרגל: כל דגימה יודעת איזו תוכנה רצה על המכשיר שהיא תוקפת, ומתחפשת בדיוק לה. בהמשך נראה למה דווקא פורט 25, איך נראית דלת אחורית שלא פותחת שום פורט, ולמה השרתים שמהם מגיעות הפקודות הם בעצמם קורבנות.

למה דווקא פורט 25

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

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

הדלת שמחכה לחבילה אחת

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

כאן מתחיל מרדף מעניין. בגרסאות הוותיקות הסימן שהנוזקה חיפשה היה רצף בתים קבוע בכותרות TCP או UDP, ויצרני אבטחה כתבו לו חתימות Suricata ו-Snort. התגובה של המפעילים הייתה לעבור דרך ה-proxy שבקצה הרשת: לעטוף את החבילה המעוררת בתוך בקשת HTTPS POST רגילה לגמרי, ולהסתמך על כך שבסביבות תקשורת ה-proxy מפרק את ההצפנה ומעביר הלאה בקשה שנראית תמימה. הבעיה שנוצרה להם היא שה-proxy משנה את הכותרות בדרך, מוסיף X-Forwarded-For ומחליף את ה-User-Agent, כך שאי אפשר יותר לסמוך על מיקום קבוע בבתים. הפתרון שהחוקרים שחזרו מהקוד כמעט משועשע: הצד התוקף שולח בקשה שנראית כמו ניסיון התחברות לממשק ניהול, עם ריפוד מחושב שמבטיח שהרצף 9999 ייפול בדיוק בבית ה-26 של המטען. משם הנוזקה מחפשת את סוף הכותרות ומפרסרת את הפקודה מגוף הבקשה.

ההתחפושת היא לא קוסמטיקה. הגרסה שנמצאה על מערכות בקוריאה הדרומית מייצרת קובץ PID בשם של SpamSniper, מוצר אנטי-ספאם שנפוץ שם, ומחליפה את שם התהליך שלה מתוך רשימה של עשרה שמות daemon-ים מוכרים של Linux. דגימה אחרת קוראת לעצמה ora_ppmond, שם שנראה הגיוני רק על מכונה שמריצה פלטפורמות מנויים וחיוב של אורקל בחברת תקשורת. כל שם נראה שקוף רק בסביבה שבשבילה נבחר. המחקר הקודם של Rapid7 על המשפחה, שהתבסס על כמעט 300 דגימות, תיאר את אותה מגמה.

הקובץ שנמחק עשר שניות אחרי שהורץ

ה-dropper עצמו הוא קובץ ELF קטן בלי שום יכולת רשת, מתקין מקומי שרץ אחרי שהתוקף כבר השיג גישה למכשיר בדרך אחרת. את מפתח ההצפנה שלו הוא גוזר מ-16 הבתים הראשונים של SHA1 על המילה ShareTech, שמה של יצרנית רכיבי הרשת שעל המכשירים שלה הוא נבנה. הם זרעו את גזירת המפתח בשם היצרן שהם תוקפים.

ההרצה מותנית בתנאי אחד: ההתקנה מתבצעת רק אם הקובץ /tmp/flag כבר קיים, ואם הסקריפט שהוא עומד לכתוב עוד לא נמצא. את /tmp/flag ה-dropper בודק ולא יוצר, כלומר הוא מצפה למצוא אותו משלב קודם בשרשרת. כשהתנאי מתקיים הוא כותב סקריפט shell אל כונן האחסון של המכשיר תחת סיומת .php ומעביר אותו ל-system(). הסקריפט מעתיק שני קבצים מתיקיית ההרחבות של המכשיר אל /sbin בשמות ntpdate ו-udevds, מריץ כל אחד ומוחק אותו אחרי עשר שניות.

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

מה AVERAT יכול לעשות על המכשיר

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

הדיווח חוזר כל 600 עד 699 שניות ומוסר שם מחשב, משתמש, גרסת מערכת הפעלה, כרטיסי רשת ומשתמשים מחוברים. את מרווח הדיווח המפעיל יכול לשנות, והוא נשמר בקובץ מוסתר תחת /var/lib כך שהשינוי שורד הפעלה מחדש. כל ערכי התצורה יושבים בגוש מוצפן של 276 בתים שהמפתח שלו נגזר מ-16 הבתים הראשונים של הגוש עצמו. ב-Rapid7 כתבו חולץ תצורה למשפחה, ומצאו שבכל שש גרסאות הבנייה מפתח ה-MAC זהה בית-בית.

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

השרתים ששולחים את הפקודות הם קורבנות של מישהו אחר

שלוש כתובות ה-IP שחולצו מהתצורות הן לא תשתית שהתוקפים שכרו. כל השלוש יושבות ברשת HiNet של Chunghwa Telecom, בשלוש ערים שונות בטייוואן, וכל אחת מהן היא מכשיר אמיתי של עסק אמיתי שנפרץ. אחת היא NAS של Synology של חברת קמעונאות דלק טייוואנית, שעדיין מגיש ממשק ניהול מבוסס Laravel מאחורי תעודה שפג תוקפה באוקטובר 2021, לצד מסד נתונים MariaDB בגרסה שהגיעה לסוף החיים ב-2020. השנייה היא רכיב רשת לעסקים קטנים עם תעודה עצמית של NetKlass שתוקפה היה בין 2004 ל-2014. השלישית היא מקליט מצלמות של Dahua.

הפרט שקושר את שלושתן הוא שרת PPTP בפורט 1723 על כל אחת מהן, שמחזיר באנר זהה בית-בית. מקליט של Dahua לא מגיע עם שרת PPTP בכלל, וב-Synology זאת חבילה אופציונלית שמושבתת כברירת מחדל ומוכרזת כמיושנת. החוקרים מעריכים שהמפעילים התקינו אותו בעצמם, וזה הופך כל מכשיר כזה לדו-תכליתי: גם ממסר יוצא שמקבל את תעבורת השתל המחופשת ל-SMTP, וגם דלת VPN נכנסת אל הרשת הפרטית של העסק שנפרץ.

מכאן כדאי לקרוא בזהירות. פרופיל המכשירים הזה, אחסון רשתי שיצא מתמיכה, רכיבי קצה ומקליטי מצלמות שהחולשות שבהם לא יתוקנו לעולם, הוא בדיוק מה שתיארו CISA וה-NCSC הבריטי יחד עם סוכנויות נוספות בהתראה המשותפת מאפריל 2026 כאבני הבניין של רשתות ממסר סמויות בחסות סין. ובכל זאת, ב-Rapid7 לא טוענים שמדובר ברשת ידועה. בדוח נכתב במפורש שלא נמצאה שום חפיפה של תשתית או של סימני זיהוי עם אף רשת ORB בעלת שם, לא LapDogs, לא SPACEHOP ולא FLORAHOX, ושהתשתית מתאימה לדפוס הכללי של סוג המכשירים בלי לאשר שיוך לרשת מסוימת. את השיוך עצמו הם משאירים כהערכה שתתעדכן עם דגימות חדשות.

מה זה אומר בפועל

אם אתם מפעילים שער אבטחת דואר, רכיב קצה או מכשיר משובץ בתוך הרשת, הדוח הזה אומר שחיפוש קבצים על המכשיר הוא לא הכלי הנכון, כי אין קובץ. מה שכן אפשר לחפש זה תהליכים שה-/proc/PID/exe שלהם מצביע על נתיב מסומן (deleted), מסננים גולמיים ו-socket-ים גולמיים על מכונות שאין להן שום סיבה ללכוד תעבורה, ותהליכים שיוצאים לפורט 25 ואינם שירותי דואר. ברשת, ב-Rapid7 ממליצים להתייחס לתעבורת SMTP שיוצאת מרכיב תשתית אל שמות מתארחים שמתרגמים למכשירים ביתיים או משובצים כסימן מספיק בפני עצמו לבדיקה.

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