Trojan Source

Nov 04, 2021 18:12

Каждой атаке положен официальный сайт. Вот, например.

Если использовать уникодные символы управления направлением вывода текста (слева направо интерпретировать кусок текста или справа налево), то можно добиться эффекта, когда человек, который ревьюит pull-request, увидит одно, а компилятор - совсем другое ( Read more... )

security, ссылки, компьютерное

Leave a comment

lnvp November 5 2021, 06:00:24 UTC
Я читал журналистский пересказ про эту идею атаки - по-моему, она относительно нетрудно затыкается техническими средствами (типа запрещения bidi override символов вообще в репо, они ведь введены довольно поздно в юникод для какого-то особого удобства? ну так, код комментировать можно и без особых удобств).

Reply

yurikhan November 5 2021, 09:22:41 UTC

Не особого удобства, а возможности выражать некоторые вполне легитимные потребности в двуязычном тексте. Например, они становятся нужны, когда в тексте на RTL-языке встречается слово из LTR-языка в скобках или кавычках. (Потому что нужно, чтобы LTR-островок начинался со скобки, а по умолчанию он начнётся с первой буквы.)

Поэтому запрещать bidi override нельзя, а читать надо не журналистский пересказ, а Unicode® Standard Annex #9: Unicode Bidirectional Algorithm.

Reply

lnvp November 5 2021, 09:40:57 UTC
Не понял, как чтение упомянутого стандарта может уберечь от атаки, поясните, пожалуйста.

Reply

yurikhan November 5 2021, 10:15:42 UTC

Чтение стандарта даёт понимание происходящего несколько более конкретное, чем журналистского пересказа сайта, на который ссылка в исходном посте. (Который сам - журналистский пересказ статьи, выложенной на нём.)

А понимание - это как раз то, что и уберегает от атаки. Я вот себе выставил в среде отображение bidi override’ов наряду с пробелами и табами.

Reply

lnvp November 7 2021, 02:40:21 UTC
Хорошая идея, но мне всё же привлекательным кажется какой-либо автоматический контроль (запрет на репо), и, также кажется, что это не так уж сложно. Однако, для меня этот вопрос досужий - на работе пишут комментарии всегда по-английски и исходники не в UTF-8, а в ASCII.

Reply

yurikhan November 7 2021, 05:18:13 UTC
Даже если ваш продукт исключительно англоязычный, ASCII недостаточно. В ASCII непредставимы апострофы, тире и кавычки.

Reply

vitus_wagner November 5 2021, 09:48:22 UTC
По-моему, как раз со скобками и кавычками все нормально. Если перевернуть только то, что внутри них, будет примерно то, что положено. Вот если там не слово в кавычках, а фраза, содержащая слово в кавычках, тогда другое дело.

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

Ежели же тебе нужно формировать вывод из маленьких кусочков и выводить символы переключения направления отдельным вызовов функции print, то вот тут как раз эскейп-последовательность читаемость кода скорее улучшит, чем ухудшит.

Reply

beldmit November 5 2021, 09:50:52 UTC
На сайте атаки описано примерно твоё решение как правильное.

Reply

vitus_wagner November 5 2021, 11:43:19 UTC
Ну, значит, как написано на первой странице любого учебника по матанализу, "монотонные и ограниченные мысли сходятся".

Reply

yurikhan November 5 2021, 15:45:34 UTC

А человек, который реализовал большую часть поддержки bidi в Emacs’е, говорит, что нет: оверрайды-де автоматически закрываются на конце абзаца, и поэтому строки без явной закрывашки валидны.

Background: его там пытаются уговорить, что все bidi-управляющие символы нужно отображать специальными значками и цветом, а он отбивается, что если так сделать, то все нормальные люди, пользующиеся в жизни RTL-языками, немедленно это отключат как мешающее жить.

Reply

yurikhan November 5 2021, 10:31:50 UTC

Вот да, мне кажется, логично считать каждый строковый литерал и каждый однострочный комментарий LTR-контекстом, требовать внутри него корректной вложенности, а при нарушении pop’ать всё, что не закрыто.

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

#include

int main() {
/* Pretend to greet the user
* or maybe to check some privilege.
‫/*
printf("Hello World!\n");
/* That’s all, folks! */
}

Reply

vitus_wagner November 5 2021, 11:41:58 UTC
Как мне кажется, если признак комментария присутствует в каждой строке (как в C++ или большинстве скриптовых языков)
то каждая строка в целом - LTR контекст.

А вот комментариях - скобках, как в C++ или паскале, можно делать многострочный RTL контекст.
При условии что сами скобки, ограничиавющие комментарий - в LTR-контексте.

Reply


Leave a comment

Up