Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Archivos de bloqueo y dependencias transitivas

5 tareas · 40 min · Principiante

La mayor parte del código que corre en una aplicación web no lo escribió su equipo: llega en paquetes, y cada paquete trae los suyos. El archivo que dice qué versión exacta de cada uno quedó instalada es el archivo de bloqueo, y es lo primero que se lee cuando salta una alerta. Cooperativa Uvito te entrega el proyecto de su portal de asociados y una alerta sobre un paquete que nadie del equipo recuerda haber instalado.

0 de 5 · 0%

Objetivo de la sala

La mayor parte del código que corre en una aplicación web no lo escribió su equipo: llega en paquetes, y cada paquete trae los suyos. El archivo que dice qué versión exacta de cada uno quedó instalada es el archivo de bloqueo, y es lo primero que se lee cuando salta una alerta. Cooperativa Uvito te entrega el proyecto de su portal de asociados y una alerta sobre un paquete que nadie del equipo recuerda haber instalado.

El manifiesto del proyecto (en Node.js, package.json) declara las dependencias directas y, casi siempre, un rango de versiones aceptables para cada una. El rango con acento circunflejo admite cualquier versión que no cambie el primer número distinto de cero: ^1.2.3 acepta desde la 1.2.3 hasta antes de la 2.0.0, pero ^0.2.3 solo hasta antes de la 0.3.0. La virgulilla es más estrecha: ~1.2.3 se queda dentro de la 1.2. Con rangos, dos instalaciones hechas en días distintos pueden traer versiones distintas.

El archivo de bloqueo (package-lock.json) congela el resultado de una instalación: la versión exacta de cada paquete del árbol, directo o no, de dónde se descargó (resolved) y la suma de integridad del archivo descargado (integrity). En su formato actual, las entradas van bajo packages y la clave de cada una es la ruta en la que queda dentro de node_modules. Si una dependencia necesita una versión incompatible con la que está en la raíz, recibe su propia copia anidada bajo su carpeta.

Para seguridad esto tiene una consecuencia directa: lo que está en producción lo dice el archivo de bloqueo, no el manifiesto. Una alerta se contrasta contra el bloqueo, y un arreglo se comprueba en el bloqueo.

Responde para continuar

Un proyecto declara "^0.4.1" para un paquete. ¿Qué versión podría instalar sin incumplir el rango?

Ver pista de ayuda

Con el primer número en cero, el que no puede cambiar es el siguiente.

Abre el laboratorio y lee encargo.txt, package.json y alerta-escaner.txt. El paquete de la alerta no figura en el manifiesto: es una dependencia transitiva, la dependencia de una dependencia. Para saber por qué está ahí hay que subir por el árbol hasta llegar a algo que sí declaró el proyecto. La salida de npm ls del archivo arbol-analiza-fechas.txt hace ese recorrido, y el archivo de bloqueo lo confirma en el campo dependencies de cada entrada.

Responde para continuar

¿Qué dependencia directa del portal es la que termina trayendo la copia vulnerable del paquete de la alerta? Escribe su nombre.

Ver pista de ayuda

Sube desde la versión de la alerta, no desde la otra copia del mismo paquete.

El árbol enseña dos versiones del mismo paquete instaladas a la vez. No es un error: cada dependencia pidió un rango distinto y el gestor no pudo satisfacer los dos con una sola copia, así que dejó una en la raíz y otra anidada. Por eso «ya tenemos la versión nueva» no basta para cerrar una alerta: hay que saber cuál de las copias está afectada y dónde vive.

Responde para continuar

¿Cuál es la clave del archivo de bloqueo de la copia que señala la alerta? Escríbela tal como aparece.

Ver pista de ayuda

Busca la entrada cuya versión coincide con la de la alerta.

Hay tres maneras de mover una dependencia transitiva. La primera es que el rango que pide su padre ya admita una versión corregida: entonces basta con actualizar esa entrada del bloqueo, sin tocar el manifiesto, y revisar el cambio. La segunda es actualizar el padre a una versión que pida otra cosa, lo que puede traer cambios incompatibles. La tercera es forzar la versión desde la raíz del proyecto (en npm, el campo overrides), útil cuando el padre no ha publicado nada, pero que obliga a probar que el padre funciona con una versión que no eligió.

Lo que no sirve es añadir el paquete como dependencia directa con la versión buena: el padre sigue pidiendo su rango y conserva su copia anidada. Y borrar el archivo de bloqueo para regenerarlo todo cierra la alerta a costa de cambiar a ciegas cientos de versiones que nadie revisará. Compara el aviso, el rango que pide el padre y las versiones publicadas del padre en registro-calendario-util.txt, y lee las tres propuestas de notas-equipo.txt.

Responde para continuar

¿Qué versión corregida del paquete vulnerable admite ya el rango que pide hoy su padre directo?

Ver pista de ayuda

Cruza el rango del padre en el archivo de bloqueo con las líneas de versiones corregidas del aviso.

Un archivo de bloqueo solo protege si la instalación lo respeta. Según el gestor y su configuración, la orden de instalación de uso diario puede actualizar el bloqueo cuando el manifiesto y el bloqueo no coinciden, y entonces lo que se construye no es lo que se revisó. Para eso existe una orden de instalación limpia (npm ci), que instala exactamente lo que dice el bloqueo, falla si no concuerda con el manifiesto y nunca lo reescribe. Lee pipeline.txt y la observación del equipo de plataforma.

Responde para continuar

¿Qué cambio en la integración continua de Uvito ataca la observación del equipo de plataforma?

Ver pista de ayuda

El problema es que el bloqueo cambia durante la instalación sin que nadie lo vea.

Inicia sesión para registrar tus puntos y progreso en el ranking.

Whoami-Labs Pro

Whoami-Labs Pro utiliza cookies

Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad