WebKit – Universal XSS Using Cached Pages
DETALHES DA VULNERABILIDADE
“ “
void FrameLoader :: detachChildren ()
{
[…]
SubframeLoadingDisabler subframeLoadingDisabler (m_frame.document ()); // *** 1 ***
Vetor <Ref <Frame>, 16> childrenToDetach;
childrenToDetach.reserveInitialCapacity (m_frame.tree (). childCount ());
for (Frame * child = m_frame.tree (). lastChild (); child; child = child-> tree (). previousSibling ())
childrenToDetach.uncheckedAppend (* child);
para (automático e filho: childrenToDetach)
child-> loader (). detachFromParent ();
}
“ “
Quando uma página em cache está sendo restaurada e a página que está sendo navegada não é armazenável em cache,
existe um período durante o qual dois documentos são anexados ao mesmo quadro. Se um atacante
encontrar uma maneira de executar JS durante esse período, ela poderá usar um dos documentos para
execute JavaScript no contexto do outro.
Uma pilha de chamadas possível que pode levar à execução de JS é:
“ “
o manipulador de descarregamento de um quadro filho
…
ContainerNode ::connectDescendantFrames ()
Documentação :: prepareForDestruction ()
FrameLoader :: clear ()
FrameLoader :: open ()
“ “
Quando o `FrameLoader :: clear` é chamado, os quadros filhos geralmente já estão desconectados do
documento via
“ “
FrameLoader :: detachChildren ()
FrameLoader :: setDocumentLoader ()
FrameLoader :: transitToCommitted ()
“ “
No entanto, o invasor pode iniciar um novo carregamento de página dentro de `detachChildren` para ignorar
SubframeLoadingDisabler e crie um novo quadro filho. Observe que não cancelará a página em cache
carga.
O ataque tem uma restrição que limita significativamente sua aplicabilidade – a página da vítima deve
carregar um <iframe> (potencialmente em área restrita) com conteúdo controlado pelo invasor, para que o JS do invasor tenha
uma chance de rodar dentro de `Document :: prepareForDestruction`. É o caso, por exemplo, de online
tradutores.
VERSÃO
Revisão do WebKit 246194
Não está claro se o bug é explorável no Safari 12.1.1. O caso de repro parece ter um problema
com uma chamada aninhada `showModalDialog`.
CASO DE REPRODUÇÃO
O caso de teste novamente conta com `showModalDialog` para executar carregamentos de página síncronos. Além disso, o
O código é envolvido em uma chamada `showModalDialog` para manter um token de gesto do usuário ativo durante todo o
execução.
INFORMAÇÃO DE CRÉDITO
Sergei Glazunov, do Google Project Zero
Prova de conceito:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47453.zip