payment-manager.js — postMessage без проверки event.originPoC-демо. Страница грузит настоящий SDK Яндекса и показывает, что входящее
message-событие принимается по строке source в payload'е, а не по origin отправителя.
Наш листенер повторяет ровно логику SDK: доверять, если
data.source === "YandexMBPaymentWidget". Жмём — шлём себе поддельное «успешная оплата».
Открывает plus.yandex.ru/gift в новой вкладке и «спреит»
туда поддельные события виджета. Если ты залогинен — увидишь, как чужой payload прилетает на доверенный
Яндекс-origin. Это твой тест на твоём же аккаунте, ничего не покупается (бэкенд подписку не выдаёт).
plus.yandex.ru, ott.kinopoisk.ru,
bookmate.ru …) SDK ставит window.addEventListener("message", cb) и дёргает
колбэки мерчанта (onSuccess/onError/NEED_AUTH/open-uri-tech) без сравнения
e.origin. Любое окно, сделавшее postMessage в окно мерчанта, форжит любое
событие виджета под доверенным Яндекс-origin. Потолок: integrity-forge клиентских колбэков + self-редирект
вкладки (токен не утекает — исходящие пиннят targetOrigin; подписку выдаёт бэкенд). CVSS 6.5 Medium.