
CVE-2026-74943 · Uso após liberação no RasterImage do Firefox (sec-high)
Severidade (segurança): alta. CWE 416. Corrigido no Firefox 154 e no ESR 140.14. Bugzilla 2057308. Acessível a partir de uma página web comum, sem interação do usuário.
O Firefox mantém superfícies de imagem decodificadas em um SurfaceCache. O cache mantém um ponteiro bruto não proprietário para a imagem proprietária. Quando uma superfície é removida, o cache notifica essa imagem em uma thread de decodificação. A notificação lia o sinalizador atômico mIsBeingDestroyed e somente depois capturava RefPtr<RasterImage> image = this. Ler o sinalizador e capturar a referência são duas operações separadas. A thread principal pode descartar a referência final entre elas. Um objeto em processo de destruição é ressuscitado e então lido após ser liberado.
Decoder thread (holds the SurfaceCache lock) Main thread
OnSurfaceDiscarded reads mIsBeingDestroyed = false
Release drops the refcount to zero and commits delete
~RasterImage sets the flag then blocks on the cache lock
RefPtr image = this (AddRef from zero to one)
queues the runnable and releases the lock
the destructor finishes and frees the 248 byte object
the runnable runs and reads freed mProgressTracker ==> use after free
O sinalizador de uma correção anterior estreita a janela. Não consegue fechá-la. Observar o sinalizador como falso não prova que a contagem de referências ainda está acima de zero, porque o sinalizador é definido dentro do destrutor estritamente após a contagem já ter chegado a zero.
As duas instruções que carregam a falha aparecem claramente na função compilada. A verificação do sinalizador e o incremento da contagem de referências em this são separados.

Use uma compilação ASAN de uma versão afetada. Aplique as preferências em prefs.js para que o cache de superfícies permaneça minúsculo e a thread de decodificação remova superfícies constantemente. Carregue uaf-reduced.html e deixe-o em loop. Esta é uma corrida de temporização entre threads, portanto reproduz de forma intermitente.
AddressSanitizer: heap-use-after-free
READ of size 8, 8 bytes into a freed 248-byte RasterImage
use : RasterImage::OnSurfaceDiscardedInternal (main thread)
freed : RasterImage::Release() via imgRequest teardown
alloc : ImageFactory::CreateRasterImage() on the ImageIO thread
Um uso após liberação de heap no processo de conteúdo. É acessível a partir de uma página web e não requer cliques ou permissões. Não foi demonstrada execução controlada nas compilações testadas. O objeto é ressuscitado e posteriormente liberado uma segunda vez.
OnSurfaceDiscarded não referencia mais a imagem. Ela captura uma referência forte ao ProgressTracker, cuja contagem de referências é separada, e recupera a imagem na thread principal através da referência inversa fraca do tracker. A recuperação usa uma adição atômica se o objeto estiver vivo. O sinalizador obsoleto é removido.
Abdulaziz Alasaiqah · https://azoz.my/writeups.html