
CVE-2026-74970 · Обход изоляции сайтов Fission в Firefox WebRender
Серьёзность: умеренная (sec moderate). CWE 862 и CWE 284. Исправлено в Firefox 154 и ESR 153.1. Bugzilla 2056558.
При Fission каждый контентный процесс владеет пространством имён PipelineId — это старшие 32 бита wr::PipelineId. WebRenderBridgeParent::AddPipelineIdForCompositable выполняется в GPU-процессе. Он проверял защиту корневого пайплайна и принадлежность к собственному набору, но никогда не проверял, что пространство имён PipelineId принадлежит отправляющему процессу. Пути ключей изображений, шрифтов и blob-объектов в том же файле уже выполняют такую проверку. Скомпрометированный контентный процесс может зарегистрировать PipelineId в пространстве имён другого процесса и перезаписать асинхронный пайплайн изображений этого origin в общем менеджере.
Проверка MatchesNamespace, которую выполняют пути ключей ресурсов, отсутствует в пути PipelineId и в RemovePipelineIdForCompositable. AddAsyncImagePipeline защищает уникальность только с помощью MOZ_ASSERT. В релизных сборках это no-op. Поэтому общий AsyncImagePipelineManager молча перезаписывает пайплайн жертвы вместо отклонения дубликата.

Модель угрозы — скомпрометированный контентный процесс. PoC — это патч на стороне контента, защищённый XRE_IsContentProcess. Он подделывает пространство имён PipelineId. В комплекте идёт тестовая страница с WebGL-канвасом и кросс-оригинным внепроцессным iframe.
apply poc.patch to mozilla-central and build
MOZ_POC_FORGE_WR_NAMESPACE=999999 ./mach run --temp-profile poc.html
Наблюдается в релизной сборке.
[POC-2056558] ACCEPTED cross-namespace PipelineId: sender-namespace=4 pipeline-namespace=999999 (should have been rejected)
Кросс-оригинная путаница рендеринга и отказ в обслуживании между вкладками. Это обход авторизации изоляции сайтов Fission. Это не повреждение памяти. Потребители ниже по цепочке защищены проверками на null и используют подсчёт ссылок, поэтому это не приводит к выполнению кода.
Добавьте ту же проверку владения пространством имён, которую используют пути ключей ресурсов.
if (!MatchesNamespace(aPipelineId)) {
return IPC_FAIL(this, "PipelineId namespace does not belong to the sending process");
}
Abdulaziz Alasaiqah · https://azoz.my/writeups.html