Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

188
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!