Aikido

Prevención de la contaminación de prototipos en su repositorio

Willem DelbareWillem Delbare
|
#

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:

Prevención de la contaminación de prototipos mediante la implementación de nopp, paso 1: commit de ejemplo para importar la librería.
Importando la librería nopp (paso 1)

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.

Prevención de la contaminación de prototipos mediante la implementación de nopp, paso 2: realizando un pequeño refactor para corregir el uso de AWS.
Realizando un pequeño refactor para corregir el uso de AWS (paso 2)

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.

4.7/5

Protege tu software ahora.

Empieza gratis
Sin tarjeta
Solicitar una demo
Sus datos no se compartirán · Acceso de solo lectura · No se requiere tarjeta de crédito

Asegúrate ahora.

Proteja su código, la nube y el entorno de ejecución en un único sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.