Чтобы интерактивные карточки в подсистеме HTMLBubbles не сажали батарею и не несли угроз безопасности, разработчики заложили в движок предельно жесткие рамки. Разбор свежего бинарника показал, как устроена эта песочница:
Защита процессора и батареи
— Жесткий таймаут: синхронный вызов JS не может выполняться дольше 50 мс, а суммарная квота CPU ограничена 200 мс в секунду (20% ядра). Зависший скрипт убивается моментально.
— Лимит таймеров: разрешено не более 16 активных
setTimeout / setInterval одновременно.— Автопауза: как только сообщение уходит за пределы экрана при скролле, 60 fps-анимации немедленно засыпают, чтобы не греть устройство.
— Тихий откат: при любой ошибке JS или падении по таймауту клиент мгновенно подменяет сообщение заранее прописанным статичным HTML-блоком.
Абсолютная изоляция (Zero-Trust)
— Никакого доступа в сеть: в JS-контексте вырезаны
fetch, XMLHttpRequest и сокеты. Сообщение в принципе не может отправить данные наружу или подгрузить что-то втайне от пользователя.— Без DOM и WebAssembly: нет привычных
document или window. Движок работает по строгой реактивной схеме: *состояние → render() → HTML-строка*. Поддержка WASM полностью заблокирована.Ограничения на верстку и медиа
— Лимит на размер: сгенерированная разметка не может превышать 256 КБ (ровно 262 144 символа).
— Никакого тяжелого контента: теги
<video>, <audio>, <iframe> и <canvas> полностью игнорируются.— Запрет на внешние картинки: ссылки
http:// и https:// внутри <img> заблокированы (никаких трекинговых пикселей и утечек IP). Доступны только data: (base64/SVG), нативные векторные иконки macOS sf: и внутренние ресурсы мессенджера app:.— Изоляция стилей: CSS заперт внутри своего контейнера и физически не способен сломать оформление соседних сообщений.
Фактически Telegram строит не «браузер в чате», а сверхлегкий и безопасный реактивный микровиджет, полностью изолированный от сети и операционной системы.
TBetaLeak