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



Здесь перед закрытием комментария вставляется символ RLI (U+2067), который требует ориентировать последующие символы с ориентацией справа налево. В результате для того, кто будет просматривать исходный код, команда return окажется внутри комментария, хотя на самом деле она находится за его пределами и будет выполнена. То есть появляется возможность «протащить» потенциально уязвимый или вовсе вредоносный код, который не будет замечен при ручной проверке.

Гипотетическая атака эксплуатирует алгоритм Unicode Bidirectional или bidi. Он призван разрешить проблемы с текстами с разным направлением письма в одной строке, для чего и вводятся те самые спецсимволы-команды.


Креативное их применение дает много способов добавления команд, которые будут выглядеть как часть комментария или строки, выводимой на экран. В общем, как что-то безобидное. Такие атаки применяются далеко не в первый раз: спецсимволы или написание right-to-left ранее часто использовались в фишинговых атаках для создания «похожих на настоящие» доменных имен и тому подобного.

Даже в случае кода данная «уязвимость» выглядит как нечто относительно безобидное. Но она была расценена как достаточно опасная, получила свой идентификатор CVE (CVE-2021-42574), а сама работа была опубликована после трехмесячной паузы на подготовку патчей. Пример решения проблемы можно посмотреть в бюллетене разработчиков языка программирования Rust: код со спецсимволами просто не будет компилироваться.

Что еще произошло


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

Компания Adobe выпустила внеочередной апдейт: он закрывает 92 уязвимости, из них 66 критических. Затронуты 13 продуктов, включая Photoshop, Premiere Pro и Lightroom Classic.

Исследователь из Израиля продемонстрировал метод масштабного сбора данных о точках доступа Wi-Fi с последующим взломом паролей. Всего он собрал данные с 5000 точек доступа, подобрать пароль удалось в 70% случаев. Рекомендация автора работы — ставить на Wi-Fi пароль подлиннее: как минимум это снижает шансы оказаться жертвой такого коллективного взлома.

Разработчики браузера Firefox заблокировали вредоносные расширения, которые препятствовали загрузке обновлений. Расширения использовали полмиллиона пользователей. Были также внесены обновления в компонент Proxy API, которым пользовались авторы вредоносных аддонов.

Комментарии (10)


  1. vesper-bot
    01.11.2021 17:29
    +5

    А разве после RLI сам return не будет перевернут при отображении ("nruter")? Он же не один символ, а много.


    1. unsignedchar
      05.11.2021 13:25
      +1

      Вставил в текстовый файл символ LRI (https://www.compart.com/en/unicode/U+2066).

      Заголовок спойлера
      00000000 74 68 69 73 20 69 73 e2 81 a6 20 72 65 74 75 72 |this is... retur|
      00000010 6e 0a |n.|


      Не смог найти редактор, который его обрабатывает как указано. Все игнорируют, pycharm делает так:


      1. vesper-bot
        11.11.2021 15:12

        Тормознул сразу. Вы же вставили LRI, а надо было RLI (U+2067), это разные символы. Оттого и нет реакции, что LRI в left-to-right тексте ничего не меняет.


  1. Mingun
    01.11.2021 17:49
    +2

    Неужели кто-то ревьюирует код без подсветки? А подсветка-то наверное все же подсвечивать будет не по тому, как отображается, а по тому, как в коде следует. Хотя идея запрещать всякие левые символы в коде/идентификаторах здравая.


    1. petropavel
      01.11.2021 19:11
      -2

      Да ничего она не здравая, это синдром вахтёра, всё запрещать. Почему бы каким-нибудь арабам на писать переменные или комментарии на своём, на арабском, справа налево?

      Правильный фикс — нельзя переключать на RTL внутри строки или комментария , а обратно на LTR внутри другой строки или комментария. Внутри той же строки или комментария — можно. Такой фикс разрешит все нормальные варианты использования и отсечёт эксплоиты


      1. Mingun
        05.11.2021 15:15

        Непонятно, нафига вообще указывать, что вам надо что-то переключать. Арабский и так справа-налево пишется, зачем это еще дополнительно указывать? По самой букве этого не видно?


        1. petropavel
          05.11.2021 15:24

          Ну, есть же в Unicode символы для переключения (202B), надо что-то с ними делать. А так да, по букве видно. Вот пример без всяких дополнительных символов.


  1. waterman
    05.11.2021 13:00
    +1

    Рассуждения Russ Cox о Trojan source (tl;dr; - всё не страшно и, более того, не ново) https://research.swtch.com/trojan


  1. mk2
    09.11.2021 19:16

    Интересно, в каких-то языках программирования такие спецсимволы вообще могут быть где-то кроме комментариев?


    1. petropavel
      10.11.2021 16:44

      в строках, легко. std::cout << "рим, молаШ";