Si llegaste a esta página directamente desde una Pull Request de Aikido Autofix y solo quieres saber cómo finalizar la PR, salta a ‘Cómo implementar’.
El ecosistema de JavaScript tiene un problema y se llama prototype pollution. Para una empresa SaaS que desarrolla con JavaScript/npm, típicamente entre el 20% y el 30% de todas las vulnerabilidades conocidas (CVE) detectadas en las dependencias son causadas por prototype pollution. Normalmente no son fáciles de explotar, pero en los peores casos, pueden llevar a fallos de ejecución remota de código. Esto significa que son difíciles de ignorar por completo.
Dos formas de prevenir la contaminación de prototipos
Existe soporte experimental en Node.js para congelar el prototipo por defecto bajo una flag llamada --frozen-intrinsics. Habilitar esa flag anula todos los ataques de contaminación de prototipos. Sin embargo, todavía no podemos recomendarlo porque es experimental y tampoco funcionará en bases de código de frontend. Eso te impediría construir la misma protección en tu frontend y backend.
Una alternativa es nopp (No Prototype Pollution), una librería de 14 líneas que congela el prototipo (y algunos otros puntos de entrada).
Cómo implementar
Importando la librería
Una vez que haya instalado nopp, todo lo que tiene que hacer es ir al script que inicia su aplicación. Allí, simplemente requiere la biblioteca, después de haber requerido todas sus otras bibliotecas. Ejemplo de commit a continuación:

2. Verificación de seguridad a nivel de aplicación para bibliotecas que dependen de la manipulación de prototipos
La razón por la que congelamos el prototipo después de incluir otras librerías es que algunas de sus otras librerías pueden depender de la modificación del prototipo para funcionar. Incluso después de asegurarse de congelar el prototipo DESPUÉS de incluir otras librerías, ¡todavía es posible que necesite algo de refactorización antes de que su aplicación vuelva a funcionar!
Un ejemplo claro es el propio aws-sdk de Amazon para Node.js, que realiza cambios en el prototipo durante la construcción de objetos como “new AWS.S3(..)”. En tales casos, es posible que tengas que realizar una refactorización como se muestra a continuación, asegurándote de que el objeto se cree cuando se inicie tu proceso de Node.js y no en una fase posterior.

Asegurarse de que tu aplicación siga funcionando después de este cambio podría suponer una mayor inversión de tiempo para repositorios más grandes con baja cobertura de pruebas. Para repositorios más pequeños, valdrá la pena para no tener que lidiar nunca más con la contaminación de prototipos. Para repositorios más grandes, esto podría ser más complejo, pero la inversión en ingeniería probablemente seguirá teniendo un ROI positivo a largo plazo.
Protege tu software ahora.


.jpg)
.avif)
