Новые виджеты Telegram превратились в проблему сразу для смартфонов и компьютеров. В Telegram Desktop 7.4.2, вышедшем 11 ноября, исправили несколько ошибок движка QuickJS, но пропустили патч дефекта, способного привести к выполнению постороннего кода. Для Android исправленная сборка уже доступна, а для ПК статус проблемы остаётся открытым.
Поддержка виджетов появилась 9 ноября вместе с Bot API 10.4. Боты получили возможность отправлять интерактивные HTML-карточки прямо в переписке. Внутри работают опросы, игры и другие мини-сервисы с JavaScript. Размер HTML-документа ограничен 32 КБ до сжатия и 4 КБ после него. Telegram запускает сценарии в QuickJS, который должен изолировать посторонний код от системы.
Уязвимость скрывалась в интерпретаторе JavaScript. При обработке конструкции await using внутри определённых циклов QuickJS мог сохранить ссылку на память завершившейся функции. Ошибку такого типа называют use-after-return. Обращение к памяти завершённого вызова позволяет нарушить работу программы, а при удачной эксплуатации может привести к выполнению нативного кода.
Разработчики Telegram 10 ноября исправили дефект в собственном форке QuickJS коммитом ca3594d. Патч запрещает некорректную конструкцию в обычных функциях и блокирует опасный путь в интерпретаторе. Исправление вошло в widget-sandbox 0.6.4 вместе с пятью другими исправлениями ошибок памяти, которые способен вызвать JavaScript-код виджета.
Однако Telegram Desktop 7.4.2 собрали с более ранней ревизией widget-sandbox a74626d. В коммите ef3f6fd разработчики подтянули пять исправлений, но не включили ca3594d. Следовательно, опубликованный код настольного приложения по-прежнему содержит уязвимый механизм. Подтверждённой демонстрации выполнения чужого кода на Windows, macOS или Linux пока нет.
Компания V12 показала на Android, как виджет запускает постороннее приложение. После открытия чата с ботом и нажатия Start Bot появился обратный отсчёт, а затем запустился системный калькулятор. Telegram заявил об устранении ошибки в Android 13.2.2 и распространении обновления. Дополнительно виджеты на Android перенесли в отдельный изолированный процесс.
Общий код виджетов предназначен для Android, iOS, Windows, macOS, Linux и веб-клиента, но версии движка и условия исполнения различаются. В браузере используется WebAssembly, поэтому последствия ошибки нельзя автоматически приравнивать к захвату компьютера. В рабочей сети Telegram виджеты пока доступны только в личных чатах с ботами. Другие способы распространения ограничены тестовым сервером.