Новая атака позволяет внедрять изменения в код, незаметные для разработчика
Исследователи из Кембриджского университета опубликовали технику незаметной подстановки вредоносного кода в исходные тексты, пишет OpenNet. Метод атаки Trojan Source основан на формировании текста, который по-разному выглядит для компилятора/интерпретатора и человека, просматривающего код. Примеры его применения продемонстрированы для различных компиляторов и интерпретаторов для языков C, C++ (gcc и clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go и Python.
Метод заключается в применении в комментариях к коду специальных Unicode-символов, меняющих порядок отображения двунаправленного текста. При помощи этих управляющих символов одни части текста могут выводиться слева направо, а другие — справа налево. Они применяются, например, для вставки в код строк на иврите или арабском языке. Но если комбинировать строки с разным направлением текста в одной строке при помощи указанных символов, то отрывки текста, отображаемые справа налево, могут перекрыть уже имеющийся обычный текст, отображаемый слева направо.
Используя данный метод, в код можно добавить вредоносную конструкцию, а затем сделать текст с ней незаметным при просмотре кода через добавление в идущем следом комментарии или внутри литерала символов, показываемых справа-налево, что приведёт к наложению на вредоносную вставку совершенно других символов. Подобный код останется семантически корректным, но будет различно интерпретироваться и отображаться.
При проверке кода разработчик столкнётся с визуальным порядком вывода символов и увидит не вызывающий подозрения комментарий, но компилятор и интерпретатор будут использовать логический порядок символов и обработают вредоносную вставку как есть, не обращая внимание на двунаправленный текст в комментарии. Проблеме подвержены различные популярные редакторы кода (VS Code, Emacs, Atom), а также интерфейсы для просмотра кода в репозиториях (GitHub, Gitlab, BitBucket и все продукты Atlassian).
Есть несколько способов использования метода для атаки: добавление скрытого выражения «return», приводящего к завершению выполнения функции раньше времени; заключение в комментарий выражений, нормальным образом видимых как действующие конструкции (например, для отключения важных проверок); присвоение иных строковых значений, приводящих к сбоям проверки строк; использование омоглифов — символов, внешне похожих по начертанию, но отличающихся значением и имеющих разные unicode-коды в именах функций и переменных для введения разработчиков в заблуждение.
Исправления с устранением уязвимости подготовлены для GCC, LLVM/Clang, Rust, Python и binutils. Проблему также устранили GitHub, Bitbucket и Jira. В процессе подготовки исправление для GitLab. Для выявления проблемного кода предложено использовать команду: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/source
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.