Skip to main content

Cómo proteger aplicaciones JavaScript directamente desde la CLI

Escrito por
Headshot of Gideon Idoko

Gideon Idoko

feature secure js cli

24 de octubre de 2023

0 minutos de lectura

Según el Informe sobre el estado de la seguridad del código abierto 2022 de Snyk, los proyectos de JavaScript tienen un promedio de 49 vulnerabilidades, incluidas algunas comunes como dependencias inseguras, cross-site scripting (XSS), validación débil de entradas y falsificación de solicitudes entre sitios (CSRF). Dado el uso generalizado de JavaScript, contar con medidas de seguridad sólidas es cada vez más importante para proteger tus aplicaciones de los ciberataques. Si bien es crucial implementar estas medidas durante el desarrollo, también es importante hacerlo desde el principio, y usar la CLI facilita el proceso.

Por eso, en este artículo te guiaremos por el proceso para proteger tus aplicaciones JavaScript con la CLI de Snyk.

¿Qué es la CLI de Snyk?

La CLI de Snyk es una herramienta potente que puede analizar y monitorear tus aplicaciones, contenedores e infraestructura como código (IaC) para detectar vulnerabilidades de seguridad. Como se integra sin problemas en tu flujo de trabajo de desarrollo, puedes ejecutarla de forma local o en tu canalización de integración y entrega continuas (CI/CD). Así puedes abordar de forma proactiva los problemas de seguridad desde las primeras etapas del proceso de desarrollo.

Al analizar tu proyecto JavaScript con la CLI de Snyk, esta compara las dependencias del proyecto con una amplia base de datos de vulnerabilidades de seguridad e informa cualquier problema. También ofrece información sobre cómo corregirlos. Esto puede implicar actualizar un paquete vulnerable a una versión segura o usar alternativas que no sean vulnerables.

Beneficios de usar la CLI de Snyk durante el desarrollo

Con la CLI de Snyk, puedes mejorar la seguridad, la confiabilidad y la velocidad de lanzamiento de tus proyectos. Estos son algunos de sus principales beneficios:

  • Análisis de seguridad del código y las dependencias: La CLI de Snyk analiza tu base de código y sus dependencias para detectar vulnerabilidades de seguridad conocidas, y proporciona detalles sobre los problemas, incluidos sus niveles de gravedad y las correcciones recomendadas.

  • Detección temprana de vulnerabilidades: Con la CLI de Snyk, puedes detectar vulnerabilidades en las primeras etapas del ciclo de desarrollo y abordarlas antes, con menos costos y esfuerzo.

  • Orientación para corregir vulnerabilidades: Además de identificar vulnerabilidades, la CLI de Snyk sugiere actualizaciones para las dependencias vulnerables o bibliotecas alternativas, lo que facilita la corrección de los problemas detectados.

  • Compatibilidad con requisitos de cumplimiento y prácticas recomendadas: Puedes realizar auditorías de seguridad y evaluar el cumplimiento mediante los informes que genera la CLI de Snyk, al mismo tiempo que te aseguras de seguir las prácticas recomendadas.

  • Compatibilidad con distintos lenguajes y ecosistemas: Gracias a su compatibilidad con varios lenguajes, puedes usar la CLI de Snyk para probar una amplia variedad de proyectos, como Java, Python, .NET, Ruby, PHP y muchos otros. Esto la convierte en una excelente opción para equipos que trabajan con varios lenguajes.

  • Experiencia pensada para desarrolladores: Los intuitivos comandos de terminal de la CLI de Snyk facilitan la integración de las comprobaciones de seguridad en el flujo de trabajo de desarrollo. Además de la CLI, también puedes usar Snyk en tu IDE mediante complementos y extensiones.

Cómo instalar la CLI de Snyk

Hay varias formas de instalar la CLI de Snyk en tu equipo, desde usar los ejecutables independientes disponibles hasta utilizar administradores de paquetes como Homebrew para macOS y Scoop para Windows.

Sin embargo, la forma más sencilla de instalar la CLI de Snyk para tu aplicación JavaScript es mediante la instalación global de npm o Yarn, ya que lo más probable es que ya tengas Node.js instalado. Asegúrate de usar la versión 12 o posterior de Node.js y ejecuta el siguiente comando para instalar la CLI de Snyk como paquete global de npm:

npm i -g snyk

También puedes instalarla globalmente con Yarn. Para ello, ejecuta yarn global add snyk. Consulta la guía de instalación de la CLI de Snyk para obtener más información.

Cómo corregir vulnerabilidades de JavaScript con la CLI de Snyk

Ahora que instalaste la CLI de Snyk, explora sus funciones probándola con un proyecto JavaScript de ejemplo.

Configura un proyecto JavaScript de ejemplo de forma local

Para que puedas configurar rápidamente un proyecto y probarlo con la CLI de Snyk, hay un proyecto JavaScript de ejemplo disponible en este repositorio de GitHub, con todos los archivos de manifiesto necesarios. El proyecto es una API sencilla de citas que usa Lodash y Express como dependencias. La API de citas tiene un endpoint GET / que devuelve una lista de citas y un endpoint GET /random que devuelve una cita aleatoria.

El proyecto usa Docker para la contenerización y Kubernetes como parte de su infraestructura. La forma más sencilla de configurar Docker y Kubernetes en tu equipo local es instalar Docker Desktop y habilitar Kubernetes en la configuración:

Configuración de Docker Desktop abierta en Kubernetes; muestra la versión 1.25.4, Kubernetes habilitado y un botón para aplicar y reiniciar.

Para configurar el proyecto JavaScript de ejemplo, clona el repositorio en tu equipo local:

git clone https://github.com/IamGideonIdoko/vulnnode.git

Luego, ve al directorio del proyecto e instala sus dependencias:

cd vulnnode

npm install

Ten en cuenta que el código JavaScript del proyecto está en el archivo server.js. Ejecuta npm start para iniciar la aplicación en el puerto 3000:

Ventana oscura del navegador en localhost:3000 que muestra una respuesta de API JSON con un mensaje de éxito y citas obtenidas junto con los nombres de sus autores.

Ahora, crea e inicia un contenedor para la aplicación con el siguiente comando de Docker:

docker compose up --detach app

Este comando crea una imagen de Docker vulnnode a partir de Dockerfile, la ejecuta y expone el contenedor en el puerto 4000.

Por último, crea un recurso de Kubernetes para la aplicación:

kubectl create -f kube.yml 

Este código usa el archivo de manifiesto kube.yml y deja la aplicación disponible en el puerto 5000. Ya tienes todo listo; es hora de analizar el proyecto.

Autentica tu equipo

La CLI de Snyk debe estar vinculada a una cuenta de Snyk, por lo que tienes que autenticar tu equipo antes de usarla. Si no tienes una cuenta, regístrate para obtener una cuenta gratuita de Snyk y sigue los pasos. Después de iniciar sesión, abre la terminal y autentica la CLI de Snyk con este comando:

snyk auth

Se abrirá una página web en tu navegador. Haz clic en el botón Authenticate y la CLI de Snyk quedará autenticada.

Si este método de autenticación no funciona, puedes usar tu token de API directamente. Ve a Account Settings > General > API Token y copia tu token de API. Luego, autentícate con el token desde la terminal de la siguiente manera:

snyk auth <YOUR_API_TOKEN>

En este punto, deberías recibir un mensaje que indique que tu cuenta se autenticó y que la CLI está lista para usarse. Explora los comandos de la CLI de Snyk que te ayudarán a probar tu proyecto JavaScript.

snyk test

El comando snyk test valida el software de código abierto para detectar fallas de seguridad y licencias. Analiza las dependencias del proyecto para identificar vulnerabilidades de seguridad conocidas. También informa sobre esas vulnerabilidades, por ejemplo, sus tipos, descripciones, rutas de archivos vulnerables y pasos para corregirlas.

Cuando ejecutas snyk test , la CLI de Snyk intenta detectar automáticamente los archivos de manifiesto con dependencias (como el archivo package.json del proyecto que configuraste) y analizarlos. Nota: Snyk busca dependencias locales para detectar vulnerabilidades. Por eso descargamos las dependencias del proyecto durante la configuración.

Para analizar el proyecto, ejecuta el comando de prueba en el mismo directorio:

snyk test

Verás un resultado similar a este:

Salida de terminal de `snyk test` que informa nueve problemas y 10 rutas vulnerables en 51 dependencias de JavaScript.

Snyk analizó las dependencias del proyecto, encontró algunos problemas e informó sobre ellos con una descripción que incluye el ID del problema, su gravedad y un enlace para obtener más información.

Todos los problemas están agrupados en una sección llamada Issues to fix by upgrading, lo que significa que actualizar las bibliotecas relacionadas con esos problemas elimina una o varias vulnerabilidades. Más adelante aprenderás en detalle cómo corregirlos.

Los problemas del análisis también pueden agruparse en otras secciones, como las siguientes:

  • Patchable issues significa que no hay una actualización disponible para corregir el problema, pero puedes usar un parche como solución alternativa.

  • Issues with no direct upgrade or patch significa que no hay una actualización ni un parche disponible para corregir el problema. Puedes conservar la dependencia o reemplazarla por una alternativa.

Nota: Si prefieres que el resultado esté en un archivo JSON, solo tienes que agregar la opción --json-file-output=./path/to/file.json al comando de la CLI de Snyk.

En una canalización de CI/CD, puedes ejecutar snyk test para detener la canalización si el proyecto contiene vulnerabilidades; es decir, si el código de salida del comando de prueba no es 0.

snyk monitor

Cuando ejecutas el comando snyk monitor, captura una instantánea de tu proyecto y envía los datos a Snyk. Es importante entender que snyk monitor no está pensado para reemplazar a snyk test, ya que su propósito principal es crear una instantánea y darle seguimiento a lo largo del tiempo. Es una herramienta valiosa para usar antes de implementar en producción. Además, Snyk te mantiene al tanto y te notifica mediante el método de contacto que prefieras cuando se identifica una nueva vulnerabilidad o una corrección pertinente para tu proyecto.

Para asegurarte de que la instantánea se guarde en la ubicación correcta, te recomendamos especificar información adicional, como la organización (--org) y el nombre del proyecto (--project-name).

Para ver snyk monitor en acción, ejecuta el siguiente comando:

snyk monitor --file=package.json  --project-name=vulnnode --org=<YOUR_ORG>

Reemplaza <YOUR_ORG> por la organización en la que quieres guardar la instantánea del proyecto. Después de ejecutar el comando, recibirás un enlace a la instantánea en la respuesta, como este:

Salida de terminal de un comando de monitoreo de Snyk que muestra la URL de una instantánea del proyecto, notificaciones sobre problemas en las dependencias y el tiempo de ejecución.

Sigue el enlace para ver la instantánea en tu panel de Snyk:

Panel del proyecto de Snyk que muestra vulnerabilidades de alta gravedad: contaminación de prototipos en Lodash y envenenamiento de prototipos en qs, con puntuaciones de 731 y 696.

snyk ignore

En ciertos casos, no existe un parche ni una actualización para corregir una vulnerabilidad, o consideras que no es posible explotarla en tu aplicación. Si esto ocurre, puedes indicarle a Snyk que ignore la vulnerabilidad durante un periodo determinado. Con el comando snyk ignore, puedes gestionar problemas conocidos o falsos positivos que no se puedan corregir de inmediato o que no sean relevantes para el contexto de tu proyecto.

Al usar snyk ignore, debes identificar el problema con su ID de vulnerabilidad. Puedes obtenerlo en el resultado del comando snyk test. Por ejemplo, la vulnerabilidad de denegación de servicio mediante expresiones regulares (ReDoS) asociada con la versión actual del paquete Lodash del proyecto tiene el ID SNYK-JS-LODASH-1018905, así que puedes ignorarla ejecutando este comando:

snyk ignore --id=SNYK-JS-LODASH-1018905 --expiry=2023-07-27 --reason="Not that severe"  

En este caso, la opción --expiry especifica durante cuánto tiempo se debe ignorar el problema, y la opción --reason indica el motivo. Este comando crea un archivo de políticas .snyk con información sobre la vulnerabilidad en el directorio raíz. Así se evita que la vulnerabilidad se vuelva a señalar al ejecutar snyk test.

snyk container

La CLI de Snyk tiene dos comandos para contenedores (test y monitor) que analizan y monitorean imágenes de contenedores locales o remotas, como las imágenes de Docker, para detectar vulnerabilidades conocidas. La sintaxis de ambos comandos es la siguiente:

snyk container test <image>:<tag>
snyk container monitor <image>:<tag>

Como configuraste la imagen con el nombre vulnnode, analízala con este comando:

snyk container test vulnnode

Deberías ver un resultado similar a este:

Terminal que muestra una prueba de Snyk Container para vulnode, con varias vulnerabilidades de gravedad media en OpenSSL/libcrypto y las versiones que las corrigen.

Más adelante en este artículo aprenderás a corregir estos problemas. Al igual que con el comando snyk monitor, puedes monitorear y crear instantáneas de la imagen del contenedor vulnnode con el siguiente comando:

snyk container monitor vulnnode

snyk iac

Con IaC, los recursos en la nube, las redes y las configuraciones no se configuran manualmente; se administran y aprovisionan mediante código. El comando snyk iac identifica vulnerabilidades de seguridad en tus archivos de configuración. Así puedes corregir las configuraciones incorrectas antes de que se conviertan en un riesgo de seguridad.

Analiza el archivo de IaC de Kubernetes con el siguiente comando:

snyk iac test kube.yml

Verás un resultado similar a este:

Salida de terminal que muestra los resultados de las pruebas de Snyk Infrastructure as Code para kube.yml, incluidos cuatro problemas de seguridad de Kubernetes de baja gravedad.

Ahora que analizaste el proyecto JavaScript, veamos cómo puedes corregir algunos de los problemas que identificaste.

Cómo corregir problemas de seguridad en tu proyecto de JavaScript

Al comenzar con el comando snyk test, Snyk CLI indica que los problemas identificados en el resultado se pueden corregir actualizando express de v4.17.1 a v4.18.2 y lodash de v4.17.4 a v4.17.21. Actualiza las versiones en tu package.json y vuelve a instalar con npm install.

Vuelve a ejecutar snyk test después de reinstalar y obtendrás un resultado como este:

Salida de la terminal de Snyk Test que muestra 51 dependencias analizadas y ninguna ruta vulnerable en un proyecto de npm.

Y eso es todo lo que tienes que hacer para resolver las vulnerabilidades del proyecto. Nota: Si conectas tu repositorio de Git con Snyk a través de app.snyk.io, Snyk creará automáticamente nuevos pull requests con actualizaciones de dependencias que corrigen los problemas de seguridad en el archivo de manifiesto package.json.

Con el comando de prueba snyk container, los problemas detectados se deben a la aplicación en la imagen y a la imagen base que se utiliza:

Salida de la terminal que enumera vulnerabilidades en dependencias y recomendaciones para actualizar las imágenes base de Node.js.

La imagen base actual tiene un problema crítico, cuatro de gravedad alta y tres de gravedad media. Se recomienda eliminar cuanto antes los problemas críticos y de gravedad alta, ya que podrían afectar gravemente tu aplicación si alguien los explota.

Para corregir los problemas del contenedor, puedes actualizar la imagen base en el Dockerfile a una de las sugeridas, como node:20.5-bookworm-slim:

+ FROM node:20.5-bookworm-slim AS development
- FROM node:16.15-alpine3.14 AS development

WORKDIR /app

# …

Nota: Si conectas tu repositorio de Git con Snyk a través de app.snyk.io, Snyk creará automáticamente nuevos pull requests con actualizaciones del Dockerfile que corrigen los problemas de seguridad para que las integres.

Vuelve a crear la imagen del contenedor con lo siguiente:

docker compose build app

Vuelve a ejecutar la prueba del contenedor y esta vez obtendrás un resultado como este:

Resultados del análisis de seguridad de la imagen de Docker vulnnode: 28 problemas de dependencias, incluida una vulnerabilidad de baja gravedad en libapt-pkg6.0.

Esta solución elimina los problemas críticos y de gravedad alta. Los 28 problemas que quedan son de prioridad baja, por lo que no representan un impedimento.

Por último, con el comando snyk iac test, los problemas detectados se deben a algunas configuraciones que no se incluyeron en el archivo de manifiesto kube.yml:

El análisis de seguridad en la terminal informa problemas de escalamiento de privilegios en Kubernetes y resume ocho problemas en total: cuatro de gravedad media y cuatro baja.

Estos problemas tienen prioridad media. Intenta corregir dos de ellos con la solución recomendada por Snyk CLI. Abre el archivo kube.yml y actualiza el contenedor:

#...      
    spec:
      containers:
      - name: nodeserver
        image: vulnnode:latest
        ports:
        - containerPort: 3000
        imagePullPolicy: Never
        resources:
          requests:
            memory: "64Mi"
            cpu: "500m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        securityContext:
          runAsNonRoot: true
          allowPrivilegeEscalation: false

# …

Vuelve a ejecutar snyk iac test kube.yml y deberías obtener lo siguiente:

Informe de análisis de seguridad que muestra dos problemas de gravedad media en Kubernetes y un resumen de pruebas con seis problemas en total.

Esto redujo los problemas a dos de prioridad media que se pueden ignorar.

Para terminar

En este artículo, aprendiste cómo proteger tus aplicaciones de JavaScript mediante el análisis con Snyk CLI para identificar vulnerabilidades.

¿Te encanta la terminal? Ahora puedes usar Snyk CLI fácilmente para proteger tu código, aplicaciones, contenedores y archivos de IaC. Snyk CLI es un aliado formidable que permite a los desarrolladores proteger sus proyectos frente a posibles amenazas e integrarse sin problemas en sus flujos de trabajo de desarrollo. Regístrate gratis hoy.

Empieza a proteger tus aplicaciones JavaScript

Encuentra y corrige vulnerabilidades de JavaScript gratis con Snyk. 

No necesitas tarjeta de crédito.

O regístrate con Azure AD Docker ID Bitbucket

Al usar Snyk, aceptas cumplir nuestras políticas, incluidos nuestros Términos del servicio y nuestra Política de privacidad.

Leer más

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad al ritmo del desarrollo con IA

El desarrollo impulsado por IA supera el ritmo de los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas definen el estándar.

blog feature ai violet
Blog

VulnBump: ¿Pueden los agentes de IA corregir dependencias vulnerables sin romper la compilación?

VulnBump prueba agentes de IA en 307 actualizaciones reales de dependencias. Una corrección cuenta solo si elimina la vulnerabilidad y mantiene en verde la compilación y las pruebas.

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.