שימוש בתווי Unicode בלתי נראים כדי להסתיר פעולות בקוד JavaScript

בעקבות שיטת ההתקפה של מקור Trojan, המבוססת על שימוש בתווי Unicode המשנים את סדר התצוגה של טקסט דו-כיווני, פורסמה טכניקה נוספת להכנסת פעולות נסתרות, החלה על קוד JavaScript. השיטה החדשה מבוססת על שימוש בתו ה-unicode "ㅤ" (קוד 0x3164, "HANGUL FILLER"), השייך לקטגוריית האותיות, אך אין לו תוכן גלוי. קטגוריית Unicode שאליה שייך תו זה מותרת מאז מפרט ECMAScript 2015 לשימוש בשמות משתני JavaScript, מה שמאפשר ליצור משתנים בלתי נראים או משתנים חדשים שאינם ניתנים להבדלה ממשתנים אחרים בעורכי קוד פופולריים כגון Notepad++ ו- VS Code.

כדוגמה, ניתן הקוד של פלטפורמת Node.js, שבו, באמצעות משתנה המורכב מתו אחד "ㅤ", מוסתרת דלת אחורית המאפשרת לבצע את הקוד שצוין על ידי התוקף: app.get('/ network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // למעשה כתוב "const { timeout,ㅤ \u3164}" const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// example.com/',ㅤ // הפסיק מלווה את התו \u3164 ];

במבט ראשון, רק ערך הזמן הקצוב מועבר דרך הפרמטר החיצוני, והמערך עם הפקודות לביצוע מכיל רשימה קבועה לא מזיקה. אבל למעשה, לאחר משתנה הזמן הקצוב, הערך של משתנה בלתי נראה אחר עם קוד התווים \u3164 מוקצה, שגם הוא מוחלף במערך הפקודות הניתנות להפעלה. לפיכך, אם עיצוב כזה זמין, תוקף יכול לשלוח בקשה כמו "https://host:8080/network_health?%E3%85%A4=command" כדי להפעיל את הדלת האחורית ולהפעיל את הקוד שלו.

דוגמה נוספת היא התו "ǃ" (ALVEOLAR CLICK), שניתן להשתמש בו כדי לתת מראה של ציון סימן קריאה. לדוגמה, הביטוי "if(environmentǃ=ENV_PROD){" כאשר הוא מופעל ב-Node.js 14 תמיד יהיה נכון, מכיוון שהוא לא בודק הבדל, אלא מקצה את הערך של ENV_PROD למשתנה "environmentǃ". תווי יוניקוד מטעים אחרים כוללים "/", "−", "+", "⩵", "❨", "⫽", "꓿" ו-"∗".

מקור: OpenNet.ru

הוספת תגובה