5 ноября в описании Telegram Desktop 7.4.0 появилась ровно одна строка — «HTML widgets in bots». Через четыре дня, 9 ноября, виджеты открыли всем ботам в Bot API 10.4, и в тот же день Андреас Рёсдал выложил аудит движка QuickJS-ng на 27 находок. К 13 ноября Telegram выпустил уже 7.4.3.
Механика такая: виджет — это сообщение с HTML и JavaScript, до 4 КБ. Скрипт крутится в песочнице без сети и без ввода с клавиатуры, но под ним лежит QuickJS, движок на C, и ошибка работы с памятью выносит скрипт за пределы песочницы. Первый баг — use-after-free в replace: регулярка пересобиралась прямо посреди операции, старый байткод освобождали, а движок продолжал читать его по прежнему адресу. Второй — use-after-return: await using внутри обычной функции, движок принимал код, который должен был отклонить, функция завершалась, а замыкания лезли в её бывшую память. В журнале исправлений запись о RCE стоит 6 ноября — за три дня до открытия виджетов всем ботам.
11 ноября, на следующий день после статьи автора разбора на Хабре, V12 выложила ролик: виджет запускает калькулятор на Android. Дальше Павел Дуров ответил постом — «Проблемы не существует. Никого нельзя было взломать одним лишь получением сообщения», а закрыл тему предложением «Попробуйте взломать мой аккаунт: t.me/monk».
Совпадение по датам выглядит некрасиво. Функцию выкатили всем ботам 9 ноября, хотя запись про RCE в журнале движка появилась тремя днями раньше. Наша оценка: это не злой умысел, а нормальная для быстро катящихся фич гонка — сначала доступ, потом закрытие дыр, и посторонние исследователи успевают быстрее. Но именно поэтому фраза «уязвимости нет, и мы её исправили» в одном посте и звучит как мем.
Что это меняет по сути: у мессенджера появился свой рантайм для чужого кода. Раньше риск от сообщения сводился к фишингу, теперь — к запуску кода на JS-движке. Требование «сначала нажми Старт у бота» сужает сценарий, но человек идёт в чат не за этим: под предлогом верификации для входа «Старт» нажимают не глядя. Это рассуждение, а не свидетельство конкретной атаки.
Выигрывают, похоже, обе стороны сразу. Аудит Рёсдала писали с помощью Claude Fable 5.1, ошибку памяти 11 ноября нашла Mythos 5.2, а Коннор Ши подтвердил результат. Нейросети ускорили поиск багов в чужом C-коде — и заодно ускорили гонку для тех, кто катит этот код в прод. Кто проигрывает — зависит от того, сколько таких находок ещё лежит в отчёте без PoC.
Все 27 находок Рёсдал проверил по коду и не пытался воспроизвести — это его собственная оговорка. Неизвестно, какой именно баг использовала V12 и был ли вообще реальный инцидент помимо демонстрации калькулятора. Telegram — заинтересованная сторона, и его «полностью закрыто на сервере» никем в поводе не подтверждено. Список исправлений в журналах тоже не гарантирует, что он полный.
Обязан ли мессенджер с миллиардом пользователей держать новую исполняемую поверхность за флагом дольше одной недели — или скорость раскатки тут важнее?
Считать ли требование «сам запусти бота» защитой или перекладыванием ответственности на человека, который просто читает сообщения?
Стоит ли верить аудитам, где нейросеть искала баги, а человек проверял их по коду без воспроизведения?
Прогноз: в течение квартала выйдет минимум один независимый публичный разбор или PoC по QuickJS-ng в контексте виджетов — при условии, что исследователи не упрутся в отсутствие тестового стенда.
Дисклеймер: хронология и детали уязвимостей взяты из одного авторского разбора; официально Telegram подтвердил только исправление на сервере.
Источник: Хабр
Источник: habr.com · пост в Telegram