Pull to refresh

Кембридж: особенность компиляторов позволяет добавлять в исходный код вредоносы и обходить ручной аудит

Reading time2 min
Views2.2K

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

Real Python
Real Python

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

В таблице представлены отвечающие за работу алгоритма коды — Unicode Bidirectional, или Bidi
В таблице представлены отвечающие за работу алгоритма коды — Unicode Bidirectional, или Bidi

Авторы исследования воспользовались этими кодами, чтобы сдвинуть идентификатор комментария в коде на языке Python в конец строки, который находился в середине. Они применили код RLI, который сдвигает только несколько символов. 

Справа показан вариант кода, который увидит программист во время проверки исходников; слева — как он будет выполнен
Справа показан вариант кода, который увидит программист во время проверки исходников; слева — как он будет выполнен

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

Проблеме присвоили идентификатор уязвимости CVE-2021-42574. Перед публикацией авторы уведомили разработчиков широко используемых компиляторов и дали им время на подготовку патчей.

Исследователи привели два сценария применения уязвимости. Злоумышленник может скрыть в комментариях команду или скрыть что-то в строке, которая выводится на экран. Либо же можно создать код, строка которого выглядит как команда, а по факту будет являться частью комментария и не выполнится. Это позволит провести качественную атаку на цепочку поставок: подрядчик поставляет организации код, который работает не так, как задумывалось. После релиза конечного продукта злоумышленник может воспользоваться этой «альтернативной функциональностью» для атаки на клиентов организации.

Программист Расс Кокс опубликовал критический разбор атаки Trojan Source. Он заявил, что такого типа атаки совсем не новы, а во многих редакторах кода с подсветкой синтаксиса «невидимые» коды видны. По словам Кокса, выпускать патчи для компиляторов совсем не обязательно — достаточно внимательно проверять код, выявляя любого рода случайные или злонамеренные баги.

Проблема с управляющими символами Unicode проявлялась в 2017 году. Аналогичная проблема связана с омоглифами — символами, которые выглядят одинаково, но имеют разные коды.

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

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

Организациям, чтобы обезопасить себя от возможной эксплуатации Trojan Source, рекомендуется обновить компиляторы применяемых языков программирования (если для них выпущен соответствующий патч); написать собственные скрипты, детектирующие ограниченный ассортимент управляющих символов в коде.

Tags:
Hubs:
Total votes 12: ↑11 and ↓1+10
Comments2

Other news