Атака на троянский источник, что это такое?

18/11/21

Как насчет того, чтобы можно было заставить компиляторы создавать двоичные файлы, отличные от логики, видимой человеческому глазу в исходном коде? Мы показываем вам, что это не только возможно, но и легко эксплуатируется ...

Об этом говорится во введении к статье. «Источник троянской программы: невидимые уязвимости», недавно опубликованные проф. Росс Андерсон из Кембриджского университета, автор текста Инженерия безопасности и его докторантом Николасом Буше. 

Заинтригованные, как это часто бывает в кибер-мире, мы решили углубить ...

Для начала помните, что программам, написанным на современных языках программирования, нужен компилятор, то есть другая программа, которая анализирует текст нашей программы, проверяет ее синтаксическую правильность и переводит ее в оптимизированную программу на языке, исполняемом компьютером. Уже из этого мы понимаем важность разработки компилятора, который может непреднамеренно внести уязвимости в программу.

В 80-х годах Кен Томсон, один из отцов Unix, уже предупреждал об этих рисках в своей знаменитой лекции, прочитанной по случаю присуждения «премии Тьюринга» (эквивалент Нобелевской премии по информатике) с запоминающимся названием. Размышления о доверии . Компилятор языка C сам по себе является программой, написанной на языке C, поэтому, чтобы иметь возможность доверять исполняемой программе, созданной компилятором, необходимо не только доверять тому, кто написал программу, но и доверять компилятору.

Теперь, возвращаясь к статье Баучера и Андерсона, давайте начнем с рассмотрения компилятора как анализатора текста, который знает термины и синтаксис языка программирования. Символы, используемые для формирования текста, необходимо закодировать на компьютере. 

Чтобы понять, в чем состоит этот новый тип атаки, представленный Баучером и Андерсоном, сначала нам нужно поговорить о кодировании и стандартах, используемых для кодирования.

Одним из наиболее часто используемых стандартов в компьютерном мире с течением времени является ASCII, Американский стандартный код для обмена информацией. Первое издание этого стандарта было опубликовано в 1963 году и со временем менялось несколько раз. Для кодирования 128 различных символов потребовалось семь бит. 

С развитием компьютерных систем потребности изменились, и необходимо было расширить стандарт ASCII, чтобы можно было кодировать символы, поступающие с разных языков или необходимые для определенных сред.

Таким образом, постепенно был принят стандарт, известный как UNICODE. Этот стандарт позволяет кодировать 144.697 XNUMX между различными символами и символами. Среди них так называемые алфавиты. Слева направо (слева направо, например, итальянский, русский, английский ...) e Справа налево (справа налево, например, арабский, иврит ...). В случае Unicode, который сегодня является одним из наиболее широко используемых стандартов кодирования, алгоритм называется Двунаправленный алгоритм (БиДи). 

Алгоритм BiDi предназначен для автоматического управления отображением текста с помощью так называемых управляющих символов (замещающих символов), которые позволяют вам явно указать, как следует обрабатывать определенную часть текста (например, Справа налево переопределение, RLO, указывает обрабатывать текст, к которому он применяется, как справа налево). Управляющие символы - это невидимые символы на экране, которые позволяют управлять отображением частей текста. Вот некоторые из наиболее часто используемых.

Кроме того, управляющие символы могут быть «вложенными», что позволяет очень сложным образом изменять порядок отображения текста.

Теперь, если текст, отображаемый на экране, представляет собой программный код, необходимо иметь в виду, что в принципе синтаксис большинства языков программирования обычно не позволяет вставлять эти управляющие символы непосредственно в исходный код в том, как Во многом они, очевидно, изменили бы логику управления программой. Однако, поскольку многие языки позволяют использовать комментарии и строки, можно вставлять управляющие символы внутри комментариев или строк и заставлять их влиять на исходный код как BiDi оверриды они не уважают разделители строк и комментариев.

Тип атаки, описанный Баучером и Андерсоном, основан на этой характеристике, типичной для сегодняшних кодировок. Фактически, благодаря управляющим символам можно использовать разницу между тем, что отображается, и тем, что на самом деле закодировано и передано компилятору и интерпретатору для проведения типа атаки «Trojan Source Attack», описанной Баучером и Андерсоном.

Баучер и Андерсон также продемонстрировали, что этот тип атаки возможен с помощью наиболее широко используемых языков программирования, включая C, C ++, C #, JavaScript, Java, Rust, Go и Python. 

Пример ниже в коде Python показывает, что код, закодированный (и, следовательно, выполняемый на машине) слева, отличается от отображаемого исходного кода (справа).

Основываясь на последнем, можно было бы ожидать найти значение, равное 50, в банке ['alice'] в конце выполнения, в то время как на практике текущая стоимость по-прежнему будет равна 100.

Тот факт, что до сих пор нет доказательств такого рода атак, не дает нам уверенности в будущем, поскольку, как и мы, другие, возможно, прочитали статью и, возможно, приняли решение проверить концепции.

Давиде Ариу, Джорджио Джачинто и Алессандро Руголо

Для получения дополнительной информации:

Источник трояна: невидимые уязвимости

Ошибка 'Trojan Source' - новый способ атаковать кодировки программ (techxplore.com)

Атака Trojan Source опасна для компиляторов программных языков (gridinsoft.com)

Атаки на троянский источник

GitHub - nickboucher / trojan-source: Trojan Source: Invisible Vulnerabilities

Алгоритм двунаправленного текста Unicode - руководства для разработчиков | MDN (mozilla.org)

https://doi.org/10.1145/358198.358210

https://www.cl.cam.ac.uk/~rja14/book.html