﻿# Атака Trojan Source для внедрения в код изменений, незаметных для разработчика

Исследователи из Кембриджского университета опубликовали технику незаметной подстановки вредоносного кода в рецензируемые исходные тексты\. Подготовленный метод атаки \(CVE\-2021\-42574\) представлен под именем Trojan Source и базируется на формировании текста, по\-разному выглядящего для компилятора/интерпретатора и человека, просматривающего код\.

![0933_Trojan_source_ru/image1.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image1.png)

Примеры применения метода [продемонстрированы](https://github.com/nickboucher/trojan-source) для различных компиляторов и интерпретаторов, поставляемых для языков C, C\+\+ \(GCC и Clang\), C\#, JavaScript \(Node\.js\), Java \(OpenJDK 16\), Rust, Go и Python\.


> Мы опубликовали и перевели эту статью с разрешения правообладателя\\\. \[Оригинал\]\(https://www\.opennet\.ru/opennews/art\.shtml?num\=56083\) опубликован на сайте OpenNET\\\.

Метод основан на применении в комментариях к коду специальных Unicode\-символов, меняющих порядок отображения двунаправленного текста\. При помощи подобных управляющих символов одни части текста могут выводиться слева\-направо, а другие — справа\-налево\. В повседневной практике подобные управляющие символы могут применяться, например, для вставки в файл с кодом строк на иврите или арабском языке\. Но, если при помощи указанных символов комбинировать строки с разным направлением текста в одной строке, отрывки текста, отображаемые справа\-налево, могут перекрыть уже имеющийся обычный текст, отображаемый слева\-направо\.

Используя данный метод, в код можно добавить вредоносную конструкцию, но затем сделать текст с этой конструкцией незаметным при просмотре кода, через добавление в следом идущем комментарии или внутри литерала символов, показываемых справа\-налево, что приведёт к наложению на вредоносную вставку совершенно других символов\. Подобный код останется семантически корректным, но будет по\-разному интерпретироваться и отображаться\.

![0933_Trojan_source_ru/image2.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image2.png)

Рисунок 1\. Отображаемый текст, содержащий атаку Trojan Source "растянутая строка" в C\+\+\.

![0933_Trojan_source_ru/image3.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image3.png)

Рисунок 2\. Закодированные байты атаки Trojan Source "растянутая строка" в C\+\+\.

![0933_Trojan_source_ru/image4.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image4.png)

Рисунок 3\. Отображаемый текст, содержащий атаку Trojan Source "комментирование кода" в C\+\+\.

![0933_Trojan_source_ru/image5.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image5.png)

Рисунок 4\. Закодированные байты атаки Trojan Source "комментирование кода" в C\+\+\.

В процессе рецензирования кода разработчик столкнётся с визуальным порядком вывода символов и увидит в современном текстовом редакторе, web\-интерфейсе или IDE не вызывающий подозрения комментарий, но компилятор и интерпретатор будут использовать логический порядок символов и обработают вредоносную вставку как есть, не обращая внимания на двунаправленный текст в комментарии\. Проблеме подвержены различные популярные редакторы кода \(VS Code, Emacs, Atom\), а также интерфейсы для просмотра кода в репозиториях \(GitHub, Gitlab, Bitbucket и все продукты Atlassian\)\.

![0933_Trojan_source_ru/image7.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image7.png)

Рисунок 5\. Подверженность уязвимости различных программ для работы с кодом\.

Выделяются несколько способов использования метода для реализации вредоносных действий: добавление скрытого выражения "return", приводящего к завершению выполнения функции раньше времени; заключение в комментарий выражений, нормальным образом видимых как действующие конструкции \(например, для отключения важных проверок\); присвоение иных строковых значений, приводящих к сбоям проверки строк\.

Например, атакующий [может предложить](https://www.openwall.com/lists/oss-security/2021/11/01/1) изменение, включающее строку:

```cpp
if access_level != "user[RLO] [LRI]// Check if admin[PDI] [LRI]" {
```

которая будет отображена в интерфейсе для рецензирования как:

```cpp
if access_level != "user" { // Check if admin
```

Дополнительно предложен ещё один вариант атаки \(CVE\-2021\-42694\), связанный с использованием [омоглифов](https://ru.wikipedia.org/wiki/%D0%9E%D0%BC%D0%BE%D0%B3%D0%BB%D0%B8%D1%84), символов, внешне похожих по начертанию, но отличающихся значением и имеющих разные unicode\-коды \(например, символ "ɑ" напоминает "a", "ɡ" — "g", "ɩ" — "l"\)\. Подобные символы можно использовать в некоторых языках в именах функций и переменных для введения разработчиков в заблуждение\. Например, могут быть определены две функции с неотличимыми именами, выполняющие разные действия\. Без детального разбора сразу не понять, какая из этих двух функций вызывается в конкретном месте\.

![0933_Trojan_source_ru/image8.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image8.png)

Рисунок 6\. Отображаемый текст, содержащий атаку Trojan Source "функции\-омоглифы" в C\+\+\.

![0933_Trojan_source_ru/image9.png](https://import.viva64.com/docx/blog/0933_Trojan_source_ru/image9.png)

Рисунок 7\. Закодированные байты атаки Trojan Source "функции\-омоглифы в C\+\+\.

В качестве меры для защиты рекомендуется реализовать в компиляторах, интерпретаторах и сборочных инструментах, поддерживающих Unicode\-символы, вывод ошибки или предупреждения при наличии в комментариях, строковых литералах или идентификаторах непарных управляющих символов, меняющих направление вывода: \{U\+202A\} \(LRE\), \{U\+202B\} \(RLE\), \{U\+202C\} \(PDF\), \{U\+202D\} \(LRO\), \{U\+202E\} \(RLO\), \{U\+2066\} \(LRI\), \{U\+2067\} \(RLI\), \{U\+2068\} \(FSI\), \{U\+2069\} \(PDI\), \{U\+061C\} \(ALM\), \{U\+200E\} \(LRM\), \{U\+200F\} \(RLM\)\. Подобные символы также должны быть явно запрещены в спецификациях языков программирования и должны учитываться в редакторах кода и интерфейсах для работы с репозиториями\.

Дополнение 1: исправления с устранением уязвимости подготовлены для [GCC](https://gcc.gnu.org/pipermail/gcc-patches/2021-November/583031.html), [Rust](https://blog.rust-lang.org/2021/11/01/cve-2021-42574.html), [Go](https://github.com/golangci/golangci-lint/pull/2330), [Python](https://www.mail-archive.com/python-dev@python.org/msg114237.html) и [binutils](https://access.redhat.com/security/cve/cve-2021-42574)\. Проблему также устранили [GitHub](https://github.blog/changelog/2021-10-31-warning-about-bidirectional-unicode-text/), [Bitbucket и Jira](https://confluence.atlassian.com/security/multiple-products-security-advisory-unrendered-unicode-bidirectional-override-characters-cve-2021-42574-1086419475.html)\. В процессе подготовки исправление для [GitLab](https://gitlab.com/gitlab-org/gitlab/-/issues/344610)\. Для выявления проблемного кода предложено использовать команду:

```cpp
grep -r                                                                       \
$'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' \
/path/to/source
```

Дополнение 2: Рас Кокс \(Russ Cox\), один из разработчиков ОС Plan 9 и языка программирования Go, [раскритиковал](https://research.swtch.com/trojan) излишнее внимание к описанному методу атаки, который уже давно известен \([Go](https://golang.org/issue/20209), [Rust](https://twitter.com/eggleroy/status/1006150385067855872), [C\+\+](https://twitter.com/zygoloid/status/1187150150835195905), [Ruby](https://twitter.com/jupenur/status/1244286243518713857)\) и не воспринимался всерьёз\. По мнению Кокса, проблема в основном касается правильности отображения информации в редакторах кода и web\-интерфейсах, решается применением корректных инструментов и анализаторов кода при рецензировании\. Поэтому вместо привлечения внимания к умозрительным атакам было бы более правильным сосредоточить внимание на улучшении процессов рецензирования кода и зависимостей\.

Рас Кокс также считает, что компиляторы не то место, где стоит устранять проблему, так как даже в случае запрета опасных символов на уровне компилятора останется огромный пласт инструментов, в которых использование проблемных символов остаётся допустимым, таких как системы сборки, ассемблеры, пакетные менеджеры и разнообразные парсеры конфигурации и данных\. Для примера приведён проект Rust, который запретил обработку кода LTR/RTL в компиляторе, но не добавил исправление в пакетный менеджер Cargo, что позволяет совершить аналогичную атаку через файл Cargo\.toml\. Другими источниками атак могут стать такие файлы, как BUILD\.bazel, CMakefile, Cargo\.toml, Dockerfile, GNUmakefile, Makefile, go\.mod, package\.json, pom\.xml и requirements\.txt\.

**Примечание команды PVS\-Studio\.** Незаметно внедрить уязвимость в уже существующий код может быть не так уж и просто на практике, однако описанная в статье уязвимость вполне реальна\. Мы реализовали диагностику [V1076](https://pvs-studio.ru/ru/docs/warnings/v1076/) \(C и С\+\+\) для поиска подозрительных Unicode последовательностей в релизе [PVS\-Studio 7\.16](https://pvs-studio.ru/ru/docs/manual/0010/)\. Для остальных языков \(C\#, Java\) соответствующие диагностики появятся в следующих релизах\. Они все будут релевантны [SAST направлению](https://pvs-studio.ru/ru/pvs-studio/sast/), которое наша команда сейчас активно развивает\.

## Дополнительные ссылки

1. [Главная ссылка к новости](https://www.openwall.com/lists/oss-security/2021/11/01/6)
1. [Trojan Source: Invisible Vulnerabilities\. Light Blue Touchpaper](https://www.lightbluetouchpaper.org/2021/11/01/trojan-source-invisible-vulnerabilities/)
1. [CVE\-2021\-42574](https://security-tracker.debian.org/tracker/CVE-2021-42574)
1. [Trojan Source: Invisible Source Code Vulnerabilities](https://www.trojansource.codes/)
1. [OpenNews: Использование похожих Unicode\-символов для обхода аутентификации](https://www.opennet.ru/opennews/art.shtml?num=52047)
1. [OpenNews: Новый метод фишинга с использованием unicode\-символов в домене](https://www.opennet.ru/opennews/art.shtml?num=46394)
1. [OpenNews: Уязвимость, позволяющая отобразить иной домен в адресной строке браузера](https://www.opennet.ru/opennews/art.shtml?num=44985)
1. [OpenNews: Оценка типичных проблем с безопасностью для различных языков программирования](https://www.opennet.ru/opennews/art.shtml?num=50415)
1. [OpenNews: Возможность регистрации фишинговых доменов с похожими unicode\-символами в имени](https://www.opennet.ru/opennews/art.shtml?num=52479)