Уязвимость в виджетах Telegram оказалась мультиплатформенной

Telegram исправил уязвимость в HTML-виджетах, через которую скрипт из сообщения мог выполнить свой код на Android. Ошибка была не в самом мессенджере, а в движке QuickJS.
QuickJS — компактный движок JavaScript, на котором работают скрипты интерактивных виджетов (HTML bubbles). Telegram использует собственный форк проекта QuickJS-ng. В журнале изменений песочницы виджетов на GitHub команда мессенджера пишет, что о проблеме сообщили применительно к Telegram для Android 13.2.1: скрипт виджета добивался выполнения машинного кода.
Ошибку описал разработчик Андреас Рёсдал. 9 ноября он опубликовал в репозитории QuickJS-ng аудит безопасности всего движка, который провёл с помощью модели Claude Fable 5.1. В отчёте 27 находок, уязвимость с циклом for (await using ...) в нём под третьим номером с высоким уровнем опасности. Автор оговорился, что проверял код чтением, без запуска эксплойтов, и выложил находки открыто, потому что повторить такой анализ теперь может любой.
Суть ошибки в том, что парсер QuickJS принимал конструкцию await using в заголовке цикла даже внутри обычных, не асинхронных функций. Движок выходил из такой функции по пути для асинхронного кода и не закрывал ссылки на её локальные переменные. Вложенные функции после возврата продолжали обращаться к уже освобождённому участку стека — это ошибка класса use-after-return. Через неё скрипт выходил за пределы песочницы.
По данным Telegram, ошибка затрагивала все платформы, где собирается форк движка, а добраться до неё можно было из обычного скрипта виджета. Уязвимый код попал в основную ветку QuickJS-ng 16 мая вместе с поддержкой явного управления ресурсами.
Исправление внесли 10 ноября. Теперь парсер отвечает на такую конструкцию синтаксической ошибкой, а интерпретатор выдаёт ошибку вместо того, чтобы приостанавливать обычную функцию. В тот же день вышла версия Telegram для Android 13.2.2. В основном репозитории QuickJS-ng обсуждение аудита на момент публикации остаётся открытым.
HTML-виджеты Telegram открыл ботам 9 ноября, и уже через два дня исследователи V12 показали выполнение кода на Android через такое сообщение, как ранее рассказывал «Код.ру».