Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

189
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda