Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

190
Visualizações
¿Cómo detectar o evitar que se reemplacen las funciones integradas del navegador?

Hoy me di cuenta de que puedo reemplazar una función JS integrada sensible como esta:

 async function _hackedEncrypt(algorithm, key, data) { console.log('hacked you!'); } const subtle = global.crypto.subtle; // Assign to get around "read-only" error. subtle.encrypt = _hackedEncrypt; global.crypto.subtle.encrypt(); // 'Hacked you!' appears in console.

¡Ay!

Este exploit es tan simple. Cualquiera de las miles de dependencias (directas y transitivas) en mi aplicación web podría reasignar esta función. Tenga en cuenta que mi pregunta no es específica de Web Crypto, es solo uno de los objetivos más peligrosos para un atacante.

¿Cómo puedo detectar que la función ha sido reasignada o garantizar que siempre estoy llamando a la implementación original del navegador?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

En mi index.js , importo este módulo antes que cualquier otro módulo. Debe ser la primera importación para que otras dependencias no tengan la oportunidad de reemplazar una función antes de que pueda establecer una referencia al original.

 const originalEncrypt = global.crypto.subtle.encrypt; // Any number of functions worth protecting can be added here // and also added to the check in wereFunctionsReplaced(). function wereFunctionsReplaced() { return global.crypto.subtle.encrypt !== originalEncrypt; }

... y luego llamo a wereFunctionsReplaced() antes de la llamada de función que me preocupa:

 if (wereFunctionsReplaced()) throw Error('Everybody run to the panic room!'); global.crypto.subtle.encrypt(algorithm, key, data);

Por supuesto, también podría envolver las funciones protegidas como:

 function safeEncrypt(algorithm, key, data) { if (wereFunctionsReplaced()) throw Error('Everybody run to the panic room!'); return global.crypto.subtle.encrypt(algorithm, key, data); }

En algunos casos, sería más conveniente almacenar la función integrada en una variable y llamar a la función directamente desde la variable en lugar de global.* . Pero para crypto.subtle.encrypt arrojará un error de "Invocación incorrecta" en Chrome. Y pensándolo mejor, muchos comportamientos sutiles e inesperados podrían ser causados al llamar a las funciones integradas fuera de su ubicación esperada en la jerarquía global.

Esta es una auto-respuesta para la posteridad. Pero me encantaría escuchar mejores soluciones que esta. Las críticas sobre cualquier falla que pueda tener esta solución también son bienvenidas.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda