כשמישהו מקליד בסינית ב-Windows, מנוע הקלט של Sogou מציע לו מילים להשלמה. חלק מההצעות הן שמות מותג של חברות שנרשמו לתוכנית קידום שהחברה פתחה ב-2016, והן מופיעות ברשימה עם אייקון קטן של נבט ירוק כדי להבדיל אותן משאר המילים. כדי להוריד את האייקון הזה, רכיב של האפליקציה שואל שרת רחוק איזה קובץ להוריד ולאן לשמור אותו. השאלה הזאת יצאה ב-HTTP רגיל.

החוקר Anh Ho מ-ESET פרסם היום ניתוח שמתאר מה קרה כשהתשובה חזרה משרת של תוקף ולא משרת של Tencent. במקום נבט ירוק, הקונפיגורציה הורתה לאפליקציה להוריד שני קבצים ולשמור אותם בתוך תיקיית הרכיבים שלה, וכך להריץ על המכשיר מרגל בשם DarkVigil. ESET עוקבת אחרי הקמפיין מ-1 ביולי 2026 ומונה נפגעים בהונג קונג, תאילנד, יפן, וייטנאם, עומאן וסרי לנקה. בהמשך נראה למה נבחרה דווקא האפליקציה הזאת, איך קונפיגורציה מזויפת הופכת להרצת קוד בלי שהתוקף צריך לכתוב מנגנון הישרדות משלו, ומה החוקרים עדיין לא יודעים.

מי עומד מאחורי זה, ולמה דווקא תוכנה סינית

הקבוצה שאחראית לקמפיין מסומנת אצל ESET בשם SlippyNunchucks, ולפי החוקרים היא פעילה מאז 15 בספטמבר 2023 לכל הפחות. מה שמחזיק את הפעילות שלה יחד הוא ארגז כלים אחד: DarkVigil, שמוכר גם בשם FDMTP, מסגרת מודולרית ב-.NET שכוללת את המרגל עצמו ויותר מ-20 תוספים ידועים. הדרך שבה DarkVigil מגיע לקורבנות עוברת תמיד דרך תוכנה סינית פופולרית. ESET מונה שש כאלה שנוצלו מ-2025: מנוע הקלט של Sogou, שירות ההאצה QuickFox, QingTalk, MiYunChat, SoftCam והצ'אט tawk.to. הבחירה הזאת היא בעצם בחירה של קהל יעד, כי מי שמתקין מנוע קלט סיני על מכשיר באירופה או בדרום-מזרח אסיה הוא בדיוק דובר הסינית שהקבוצה מחפשת.

רשימת הנפגעים לא מצטיירת כיעד עסקי אחד. יש בה ארגון הימורים בין-לאומי שפועל מסרי לנקה, מהפיליפינים ומהונג קונג, בית קפה אינטרנט בדובאי וסטודנט אוניברסיטה בדנמרק, ולצד אלה נפגעים בודדים בגרמניה, רוסיה, בריטניה ואוסטריה. דווקא ארגון ההימורים הוא מה שקשר בעיני החוקרים את הפעילות לאינטרס מדיני: סין אוסרת על הפעלת עסקי הימורים ועל גיוס אזרחים סינים להמר בחו"ל, ESET מעריכה בביטחון גבוה שמדובר במאמץ ריגול ממדינה, בקו אחד עם האינטרסים של השלטון הסיני. כאן גם נקודת מחלוקת: דיווחים פומביים קודמים ייחסו את DarkVigil לקבוצה Mustang Panda, שמכונה גם Twill Typhoon, ו-ESET אומרת שבטלמטריה שלה אין שום חפיפה בין השתיים, ולכן היא עוקבת אחרי SlippyNunchucks כאשכול נפרד.

המעבר ל-Sogou לא היה הניסיון הראשון של הקבוצה. עד יולי האחרון הווקטור הפומבי היחיד שלה היה פריצה לשרשרת האספקה של QuickFox, שצוות התגובה לאירועים של Fortinet תיאר באוגוסט. ההדבקות דרך מנוע הקלט התחילו שלושה ימים אחרי ש-QuickFox שחררה גרסה נקייה.

הבקשה יצאה ב-HTTP, והתשובה חזרה מהשרת הלא נכון

הרכיב שעושה את העבודה נקרא SGTool.exe, והוא מעין מוקד משימות של האפליקציה. הוא מקבל מזהה פקודה דרך הארגומנט --appid=, מפרסר אותו ומנתב את ההרצה למטפל המתאים. ESET זיהתה בו לפחות 30 מזהי פקודה, שאחראים על התקנת מנוע הקלט, ניהול ערכות נושא, עדכוני מילונים והורדת רכיבי CEF. אחד המסלולים האלה, --appid=scdreg -update, שולח בקשת HTTP ל-endpoint בשם getBrandScd.php בדומיין config.pinyin.sogou[.]com ומבקש את הקונפיגורציה של אייקוני המותגים. התשובה מוצפנת ב-AES-256-CBC, כשהמפתח וה-IV שתולים בתוך הסקציה .rdata של SGTool.exe עצמו. בסביבה נקייה היא מכילה הוראה אחת: להוריד את tree.png, הנבט הירוק.

הדומיין הזה הוא שרת רשמי של Sogou, והוא עונה גם ב-HTTPS עם תעודה תקפה של Tencent Technology (Shenzhen). אבל כש-ESET עברה על SGTool.exe היא מצאה על אותו שרת 20 endpoints שהאפליקציה פונה אליהם ב-HTTP לא מוצפן, ו-getBrandScd.php הוא אחד מהם. בסביבות של הנפגעים, רזולוציית ה-DNS של config.pinyin.sogou[.]com הייתה בשליטת התוקף והצביעה על אחד משני שרתי הביניים שלו, 47.239.250[.]102 או 47.237.122[.]175, ששירתו את הדומיין sogou-cdn[.]com. מכאן זה פשוט: אותה בקשה בדיוק, שרת אחר, וקונפיגורציה חוזרת שמוצפנת באותו אופן כמו המקורית, כי המפתח וה-IV יושבים בתוך בינארי שכל אחד יכול להוריד ולפרק.

זאת לא הפעם הראשונה שמנוע הקלט של Sogou מופיע במחקרי אבטחה. ב-2023 פרסם Citizen Lab ניתוח של חולשות בהצפנה של המקלדת, שאפשרו למאזין ברשת לשחזר הקלדות. בספטמבר 2026 חשפה Gen Threat Labs חולשת הרצת קוד מרחוק באותה אפליקציה, CVE-2026-51990, שהופעלה בלחיצה אחת על קישור והורכבה משרשור של שלוש בעיות: הזרקת ארגומנט לשורת הפקודה דרך מטפל פרוטוקול מותאם, ניווט חופשי לכתובות בתוך WebView מבוסס CEF, ומנוע Chromium מיושן ובלי ארגז חול.

למה התוקף לא צריך מנגנון הישרדות משלו

הקונפיגורציה המזויפת מורה להוריד שני קבצים משרתי הביניים. הראשון הוא קובץ הרצה לגיטימי וחתום של Adobe, בשם Adobe Licensing WF Helper, שהתוקף מעביר בשם biz_helper.exe. השני הוא libcef.dll, שהוא DarkVigil עצמו. בקונפיגורציה יש שדות md5 לבדיקת שלמות, והתוקף פשוט עדכן אותם כך שיתאימו למטענים שלו, מה שהופך את הבדיקה לחתימה של התוקף על עצמו. שדות נוספים קובעים לאן לשמור את הקבצים, וזה החלק המעניין.

את הרכיבים שלה Sogou מנהלת בתיקייה SogouInput\Components\, דרך כלי נפרד בשם SogouComMgr.exe שיושב באותו מקום. SGTool.exe מריץ אותו עם ארגומנטים כמו -installdoall או -invoke כדי להתקין רכיב או לטעון אותו. הקונפיגורציה המזויפת שומרת את הקובץ של Adobe בדיוק במקום של SogouComMgr.exe, ומכאן כל פעם שהאפליקציה מנסה להתקין או לטעון רכיב, היא מריצה את הקובץ של Adobe במקומו. הקובץ החתום טוען לתוכו את libcef.dll שיושב באותה תיקייה, וה-DLL הוא המרגל. לטכניקה הזאת קוראים DLL sideloading, והיא עובדת כאן בלי לגעת ב-registry, בלי משימה מתוזמנת ובלי service חדש, כי מי שדואג להרצה החוזרת היא זרימת העבודה של האפליקציה עצמה.

יש גם גיבוי. אם עדכון תוכנה מחליף את SogouComMgr.exe בגרסה המקורית, אותם מטענים נשמרים גם תחת SogouInput\Components\biz_center ובתיקיית הגרסה שמתחתיה, ו-ESET ראתה את SGTool.exe מריץ שוב ושוב את SogouComMgr.exe עם הארגומנטים -invoke BizCenterComBundle BizCenterCom, מה שמוביל להרצת הקובץ המחופש מאותה תיקייה. רק אחד משני המסלולים יכול לעבוד בכל רגע נתון, והחוקרים מציינים ששניהם הרסניים ועשויים להפיל את התוכנה.

איך נראית השיחה עם שרת השליטה

החלק שהחוקרים מתארים כמעניין ביותר ב-DarkVigil הוא לא ההדבקה אלא מה שבא אחריה. התקשורת עם שרת השליטה והבקרה (C2, השרת שממנו התוקף שולח פקודות לתוכנה הזדונית) רצה על פרוטוקול בשם Duplex Message Transport Protocol, או DMTP, שמגיע ממסגרת רשת פתוחה בשם TouchSocket. את השם DarkVigil ESET גזרה ממסגרת פנימית בשם Vigil, שהופיעה בהפניות ספריות בקוד ובנתיבי PDB, ו-Vigil בנויה מעל TouchSocket. מבנה ההודעה ב-DMTP קצר: כותרת של שני בתים שמכילה תמיד את הערך dm, דגל, אורך, ואז המטען. אפשר להריץ אותו מעל TCP, UDP, HTTP, WebSocket ואפילו מעל named pipes, מה שמסביר למה הוא נוח למי שבונה דלת אחורית.

שתי יכולות בפרוטוקול הן הסיבה האמיתית לבחירה. הראשונה היא קריאות פרוצדורה מרחוק שעובדות בשני הכיוונים, כך שגם הלקוח וגם השרת מממשים מתודות שהצד האחר יכול להפעיל, וקריאה אחת יכולה לקרוא למתודה בצד השני בתוך ההרצה שלה. השנייה היא היכולת להחזיק בו-זמנית ערוץ שרת-לקוח וערוץ לקוח-לקוח. ככה נראה מחזור החיים של תוסף: השרת דוחף אותו ללקוח דרך העברת הקבצים המובנית של DMTP, קורא למתודה RegistryPlugin ששומרת את הבינארי הדחוס במפתח registry תחת HKCU\Software\Microsoft\IME, ואז קורא ל-RunPlugin, שפורק את הנתונים, טוען אותם לסביבת .NET ומפעיל את המתודה Run. התוסף מקבל מצביע לחיבור וגם מזהה שהשרת הקציב לו, ועם שניהם הוא פותח חיבור משלו אל ה-C2 כשהלקוח משמש לו ממסר. אחד התוספים שמופיע בדוגמה של החוקרים נקרא Pillager.

מה שעוד לא ידוע: איפה ה-DNS מתעקם

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

הצד של Tencent נסגר בינתיים. ESET דיווחה לצוות האבטחה ב-11 בספטמבר 2026, קיבלה אישור ב-21 בספטמבר, וגרסה 16.10 שיצאה בסוף אוקטובר מעבירה את הבקשות הרלוונטיות ל-HTTPS ומוסיפה הצמדת תעודה. (הדוח עצמו נוקב גם ב-29 וגם ב-30 באוקטובר כתאריך השחרור.) ב-2 בנובמבר הנפיקה ESET, בתפקידה כגוף שמקצה מזהי CVE, את המזהה CVE-2026-120422, שמופיע ברשומה עם ציון CVSS 8.9. החוקרים מוסיפים שהתיקון לא סוגר הכול: לדעתם SGTool.exe צריך גם לבדוק את סוג הקובץ שהוא מוריד, כדי שקובץ הרצה לא יגיע במקום תמונה, וגם להגביל את יעדי השמירה לתיקיות מוגדרות.

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

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

הצד השני הוא הניטור. כשהרכיב הזדוני נטען על ידי קובץ חתום של Adobe שיושב בתיקיית הרכיבים של אפליקציה לגיטימית, אין רשומת registry חדשה, אין משימה מתוזמנת ואין service שאפשר לחפש. מי שמחפש הרצה חוזרת לפי artifacts כאלה לא ימצא כלום, והאינדיקציה היחידה היא קובץ שלא אמור לשבת שם. את ה-IoCs של הקמפיין ESET פרסמה במאגר שלה ב-GitHub.