
CVE-2026-74970 · Bypass dell'isolamento dei siti Fission in Firefox WebRender
Severità: moderata (sec). CWE 862 e CWE 284. Corretto in Firefox 154 e ESR 153.1. Bugzilla 2056558.
In Fission, ogni processo di contenuto possiede un namespace PipelineId. Questo è rappresentato dai 32 bit più alti di wr::PipelineId. WebRenderBridgeParent::AddPipelineIdForCompositable viene eseguito nel processo GPU. Verificava la protezione della pipeline root e l'appartenenza al proprio insieme. Non verificava mai che il namespace PipelineId appartenesse al processo mittente. I percorsi delle chiavi di immagini, font e blob nello stesso file impongono già questo controllo. Un processo di contenuto compromesso può registrare un PipelineId in un namespace di un altro processo e sovrascrivere quella pipeline di immagini asincrona di quell'origine nel manager condiviso.
Il controllo MatchesNamespace che i percorsi delle chiavi di risorse impongono manca sul percorso PipelineId e su RemovePipelineIdForCompositable. AddAsyncImagePipeline protegge l'univocità solo con MOZ_ASSERT. Questa è una no-op nelle build di release. Quindi il AsyncImagePipelineManager condiviso sovrascrive silenziosamente la pipeline vittima invece di rifiutare il duplicato.

Il modello di minaccia è un processo di contenuto compromesso. Il PoC è una patch lato contenuto protetta da XRE_IsContentProcess. Forgia il namespace PipelineId. Include una pagina di test con una canvas WebGL e un iframe fuori processo cross-origin.
apply poc.patch to mozilla-central and build
MOZ_POC_FORGE_WR_NAMESPACE=999999 ./mach run --temp-profile poc.html
Osservato su una build di release.
[POC-2056558] ACCEPTED cross-namespace PipelineId: sender-namespace=4 pipeline-namespace=999999 (should have been rejected)
Confusione di rendering cross-origin e denial of service tra schede. Questo è un bypass dell'autorizzazione dell'isolamento dei siti Fission. Non è una corruzione della memoria. I consumatori a valle sono protetti da controlli di nullità e utilizzano il conteggio dei riferimenti, quindi non consente l'esecuzione di codice.
Applica lo stesso controllo di proprietà del namespace usato dai percorsi delle chiavi di risorse.
if (!MatchesNamespace(aPipelineId)) {
return IPC_FAIL(this, "PipelineId namespace does not belong to the sending process");
}
Abdulaziz Alasaiqah · https://azoz.my/writeups.html