Британские ученые из кембриджского университета Росс Андерсон и Николас Баучер, опубликовали документ, в котором подробно описали концепт атаки Trojan Source с индексом CVE-2021-42574. Она заключается в инъекции вредоносного кода в листинг программы с помощью полей комментариев. Сам эксплойт уже можно найти на GitHub.
Атака заключается в следующем: хакер использует двунаправленные символы Unicode в полях комментариев к листингу исходного кода. Эти символы Unicode обычно (BiDi - bidirectional) используют для перехода режима внутри текстовой строки, LTR (слева направо) к режиму RTL (справа налево). Например, для вставки текста с обратным способом чтения на арабском или иврите.
Используя спецсимволы встроенные в комментарии, можно изменить порядок строк кода и соответственно его логики, перемещая код в комментарии и наоборот. Выявить подобные трюки, как пишут исследователи, довольно таки сложно, поскольку спецсимволы перемещающие код будут использоваться на этапе компиляции и не видны человеку, тем самым открывая в ПО уязвимость.
![](https://habrastorage.org/getpro/habr/upload_files/aa0/b1f/18b/aa0b1f18b19d5b08f83a2ba8f7d88aff.gif)
Несколько способов переупорядочивания блоков исходного кода. Early Returns
вызывает замыкание функции из-за оператора return
который визуально кажется в строке комментария. Оператор Commenting-Out
заставляет комментарий выглядеть как код, который не выполняется. Stretched Strings
считывается языком как код, но фактически эффект такой же, как и комментирование и поэтому сравнение строк пройдет с ошибкой (комментарии за код не считаются).
Авторы в своем исследовании представили рабочие примеры на языках C, C ++, C #, JavaScript, Java, Rust, Go и Python, очевидно и в других ЯП подобная уязвимость тоже работает. Пока что данной проблемой озаботились создатели Rust, выпустив обновление.
Кроме компиляторов, уязвимости подвержены несколько операционных систем и IDE.
![](https://habrastorage.org/getpro/habr/upload_files/958/480/6a2/9584806a2a841cbe1874683df36b0dc3.png)
Похожая проблема, (CVE-2021-42694) заключается в использовании гомоглифов или символов которые кажутся почти идентичными. Вот пример кода:
![](https://habrastorage.org/getpro/habr/upload_files/8e2/048/584/8e2048584d030c28a8898a3bbff81b1f.png)
Две одинаково выглядящие в глазах человека функции, но не для компилятора. Злоумышленник подобным образом, может внедрить собственный вредоносный код.
Авторы резюмируют, что компиляторы, интерпретаторы, IDE, должны выдавать ошибки или предупреждения при использовании двунаправленных управляющих символов и гомоглифов. Спецификации языка должны формально запрещать незавершённые двунаправленные управляющие символы Unicode в комментариях и строковых литералах.