Источник трояна
Идентификатор(ы) CVE |
|
---|---|
Дата обнаружения | 9 сентября 2021 г |
Первооткрыватель | Николас Баучер, Росс Андерсон |
Затронутое программное обеспечение | Юникод , исходный код |
Веб-сайт | исходник трояна |
Trojan Source — это название уязвимости программного обеспечения , которая использует Юникода двунаправленные символы для отображения исходного кода иначе, чем фактическое выполнение исходного кода. [1] Эксплойт использует способ отображения и кодирования на компьютерах сценариев написания различных направлений чтения. Его обнаружили Николас Баучер и Росс Андерсон в Кембриджском университете в конце 2021 года. [2]
Предыстория [ править ]
Unicode — это стандарт кодирования для представления текста, символов и глифов. Юникод — наиболее распространенная кодировка на компьютерах, используемая более чем на 98% веб-сайтов по состоянию на сентябрь 2023 г. [update]. [3] Он поддерживает множество языков и поэтому должен поддерживать разные методы написания текста. Для этого требуется поддержка как языков с письмом слева направо , таких как английский и русский, так и языков с письмом справа налево , таких как иврит и арабский . Поскольку Unicode стремится обеспечить возможность использования более чем одной системы письма, он должен иметь возможность смешивать сценарии с разными порядками отображения и разрешать конфликтующие порядки. В качестве решения Unicode содержит символы, называемые двунаправленными символами ( Bidi ), которые описывают, как отображается и представляется текст. Этими символами можно злоупотреблять, чтобы изменить интерпретацию текста, не меняя его визуально, поскольку символы часто невидимы. [4]
Аббревиатура | Имя | Описание |
---|---|---|
ЖРД | U+202A ВСТРОЕНИЕ СЛЕВА НАПРАВО | Попробуйте обрабатывать следующий текст слева направо. |
РЛЭ | U+202B ВСТРОЕНИЕ ПРАВО НАЛЕВО | Попробуйте обрабатывать следующий текст как справа налево. |
МРО | U + 202D ПЕРЕОПРЕДЕЛЕНИЕ СЛЕВА НАПРАВО | Принудительно обрабатывать следующий текст слева направо. |
РЛО | U + 202E ПЕРЕОПРЕДЕЛЕНИЕ СПРАВА НАЛЕВО | Принудительно обрабатывать следующий текст как справа налево. |
ЛРИ | U + 2066 ИЗОЛЯЦИЯ СЛЕВА НАПРАВО | Принудительно обрабатывать следующий текст слева направо, не затрагивая соседний текст. |
РЛИ | U + 2067 ИЗОЛЯЦИЯ СПРАВА НАЛЕВО | Принудительно обрабатывать следующий текст как справа налево, не затрагивая соседний текст. |
ФСИ | U+2068 ПЕРВЫЙ СИЛЬНЫЙ ИЗОЛЯТ | Принудительно обрабатывать следующий текст в направлении, указанном следующим символом. |
U+202C НАПРАВЛЕННОЕ ФОРМАТИРОВАНИЕ POP | Завершите работу ближайшего LRE, RLE, LRO или RLO. | |
ПДИ | U+2069 POP НАПРАВЛЕННЫЙ РАЗЪЕДИНИТЕЛЬ | Завершите работу ближайшего LRI или RLI. |
Методология [ править ]
В эксплоите двунаправленные символы используются для визуального изменения порядка текста в исходном коде, чтобы последующее выполнение происходило в другом порядке. Двунаправленные символы можно вставлять в те области исходного кода, где разрешены строковые литералы. Это часто относится к документации, переменным или комментариям.
Исходный код с подсказками | Исходный код отображается визуально | Исходный код интерпретирован |
---|---|---|
def sum(num1, num2):
'''Add num1 and num2, and [RLI] return; '''
return num1 + num2
|
def sum(num1, num2):
'''Add num1 and num2, and return; '''
return num1 + num2
|
def sum(num1, num2):
'''Add num1 and num2, and ''' ;
return
return num1 + num2
|
В приведенном выше примере знак RLI (выделение справа налево) заставляет следующий текст интерпретироваться в обратном порядке: сначала идет тройная кавычка (завершение строки), за которой следует точка с запятой (начало новой строки). , и, наконец, с преждевременным возвратом (возвращением Нет и игнорируется любой код под ним). Новая строка завершает метку RLI, предотвращая ее попадание в приведенный ниже код. Из-за символа двунаправленного текста некоторые редакторы исходного кода и IDE переупорядочивают код для отображения без какой-либо визуальной индикации того, что код был перекомпонован, поэтому человек, проверяющий код, обычно их не обнаруживает. Однако когда код вставляется в компилятор, компилятор может игнорировать символ двунаправленного текста и обрабатывать символы в другом порядке, чем отображается визуально. Когда компилятор завершит работу, он потенциально может выполнить код, который визуально кажется неисполняемым. [5] Метки форматирования можно комбинировать несколько раз для создания сложных атак. [6]
Воздействие и смягчение последствий [ править ]
Языки программирования, которые поддерживают строки Unicode и следуют алгоритму Bidi Unicode, уязвимы для эксплойта. Сюда входят такие языки, как Java , Go , C , C++ , C# , Python и JavaScript . [7]
Хотя атака не является строго ошибкой, многие компиляторы, интерпретаторы и веб-сайты добавили предупреждения или меры по смягчению последствий эксплойта. И GNU GCC , и LLVM получили запросы на устранение этой уязвимости. [8] Марек Полачек отправил в GCC патч вскоре после публикации эксплойта, который реализовал предупреждение о потенциально небезопасных направленных символах; эта функциональность была объединена с GCC 12 в рамках -Wbidi-chars
флаг. [9] [10] LLVM также объединила подобные патчи.
Rust исправил эксплойт в версии 1.56.1, отклонив код, содержащий символы по умолчанию. До исправления разработчики Rust не обнаружили уязвимых пакетов. [11]
Red Hat опубликовала на своем веб-сайте предупреждение, в котором эксплойт был назван «умеренным». [12] GitHub опубликовал предупреждение в своем блоге, а также обновил веб-сайт, чтобы отображать диалоговое окно при обнаружении символов Bidi в коде репозитория. [13]
Ссылки [ править ]
- ^ « Ошибка «Источник трояна» угрожает безопасности всего кода – Кребс о безопасности» . Ноябрь 2021 г. Архивировано из оригинала 14 января 2022 г. Проверено 17 января 2022 г.
- ^ «VU#999008 — Компиляторы допускают управляющие символы Юникода и гомоглифические символы» . www.kb.cert.org . Архивировано из оригинала 21 января 2022 г. Проверено 17 января 2022 г.
- ^ «Обзор использования кодировок символов с разбивкой по рейтингу» . w3techs.com . Архивировано из оригинала 21 января 2022 г. Проверено 17 января 2022 г.
- ^ «UAX #9: Двунаправленный алгоритм Unicode» . www.unicode.org . Архивировано из оригинала 02 мая 2019 г. Проверено 17 января 2022 г.
- ^ Эдж, Джейк (3 ноября 2021 г.). «Источник трояна: трюки (без угощений) с Unicode [LWN.net]» . lwn.net . Проверено 12 марта 2022 г.
- ^ Стокли, Марк (3 ноября 2021 г.). «Источник трояна: сокрытие вредоносного кода на виду» . Лаборатория Малваребайтс . Проверено 12 марта 2022 г.
- ^ Тунг, Лиам. «Языки программирования: этот хитрый трюк может позволить злоумышленникам скрыть «невидимые» уязвимости в коде» . ЗДНет . Архивировано из оригинала 21 декабря 2021 г. Проверено 21 января 2022 г.
- ^ «Ожидаются исправления GCC и LLVM для отражения атак троянских источников» . www.phoronix.com . Архивировано из оригинала 01 декабря 2021 г. Проверено 17 января 2022 г.
- ^ Малькольм, Дэвид (12 января 2022 г.). «Предотвратите атаки троянских источников с помощью GCC 12» . Разработчик Red Hat . Архивировано из оригинала 17 января 2022 г. Проверено 17 января 2022 г.
- ^ «Параметры предупреждения (с использованием коллекции компиляторов GNU (GCC))» . gcc.gnu.org . Архивировано из оригинала 5 декабря 2018 г. Проверено 17 января 2022 г.
- ^ «Рекомендации по безопасности для RustC (CVE-2021-42574) | Блог Rust» . blog.rust-lang.org . Архивировано из оригинала 30 ноября 2021 г. Проверено 21 января 2022 г.
- ^ «RHSB-2021-007 Атаки на источник трояна (CVE-2021-42574, CVE-2021-42694)» . Портал для клиентов Red Hat . Архивировано из оригинала 17 января 2022 г. Проверено 21 января 2022 г.
- ^ «Предупреждение о двунаправленном тексте в Юникоде | Журнал изменений GitHub» . Блог GitHub . 31 октября 2021 г. Архивировано из оригинала 15 января 2022 г. Проверено 21 января 2022 г.
Внешние ссылки [ править ]
- https://trojansource.codes/ сайт первооткрывателей Николаса Баучера и Росса Андерсона.
- NIST Национальная база данных уязвимостей и CVE общие уязвимости и уязвимости
- UAX 9 от Консорциума Unicode о двунаправленных символах и форматировании
- Unicode UTR 36 от Консорциума Unicode , в котором описана уязвимость в Unicode.
- Отчет об уязвимостях CERT/CC