¡PAC proxy envenenados! El paquete NPM con una brecha de seguridad en toda la red … – Naked Security

No hace mucho, el desarrollador de software independiente Tim Perry, creador del kit de herramientas HTTP para interceptar y depurar el tráfico web …

… decidió agregar soporte de proxy a su producto, que, como gran parte del software en estos días, está coescrito Node.js.

ICYMI, Node.js es el proyecto que eliminó el lenguaje JavaScript de su navegador y lo convirtió en un sistema de desarrollo de aplicaciones completo, un poco como Java (que por cierto no tiene nada que ver con JavaScript, aunque los nombres suenan similares).

Además del núcleo de JavaScript, que utiliza el motor JavaScript V8 del proyecto Chromium de Google, Node.js El software generalmente también se basa en NPM, los Administrador de paquetes de nodo, y el Registro de NPM, un repositorio realmente enorme de herramientas de nodo de código abierto y bibliotecas de programación.

El registro de NPM se ejecuta desde el formato de texto básico hasta el reconocimiento facial completo y casi todo lo demás.

En lugar de escribir todo o incluso la mayor parte del código en su proyecto usted mismo, simplemente señale los paquetes de complementos que desea usar y NPM los recogerá junto con los paquetes adicionales que su paquete elegido necesitará …

… y cualquier paquete que necesite estos paquetes, siga las Tortugas Paquetes hasta el final hasta que cualquier código adicional necesario para completar el rompecabezas se haya encontrado e instalado automáticamente.

Índice de contenido

Sopa de letras

Como puede imaginar, esta es una posible pesadilla de seguridad.

Agregar solo un paquete a su propio proyecto puede requerir varios paquetes adicionales, cada uno de los cuales puede haber sido escrito por una persona diferente que no conoce, a quien nunca ha conocido y probablemente nunca lo hará.

Esta sopa de letras se conoce como su software Árbol de dependencia, y ya hemos escrito sobre los riesgosos efectos secundarios de este enfoque para el desarrollo de software y descubrimos que:

El soporte de proxy trae problemas

Perry redescubrió recientemente este riesgo cuando decidió utilizar un popular paquete de NPM llamado. usar Proxy-Agent para proporcionar el soporte de proxy que quería en su producto de kit de herramientas HTTP.

Afortunadamente, Perry no solo buscó, instaló y comenzó a usar ciegamente Proxy-Agent y su árbol de dependencias completo sin verificar los componentes recién adquiridos en su proyecto.

Entonces se encontró con una vulnerabilidad ahora conocida como CVE-2021-23406 Proxy-Agent Llamado adicción Pac-Resolver, un subcomponente que ayuda a su código a lidiar con el proceso de PAC, o Configuración automática de proxy (vea la barra lateral a continuación).

Un servidor proxy realiza conexiones salientes en su nombre, generalmente por razones de seguridad (por ejemplo, para filtrar el tráfico web), razones de rendimiento (por ejemplo, para mantener copias locales de archivos que se descargan con frecuencia o para mantener el Para regular el uso del ancho de banda durante las horas pico) o para ambos. Te conectas al proxy y le dices a dónde quieres ir; realiza el enrutamiento por usted, recopila las respuestas y se las envía de vuelta. Muchas redes corporativas están configuradas de tal manera que ciertas conexiones salientes, especialmente solicitudes HTTP, solo son posibles desde un determinado servidor proxy. Esto asegura que todos dentro de la red envíen su tráfico a través del proxy en lugar de ir directamente a sitios externos. Existen numerosas herramientas de estilo empresarial que ayudan a las computadoras en una red a encontrar automáticamente sus proxies internos oficiales, incluido PAC, abreviatura de Configuración automática de proxyy WPAD, abreviatura de detección automática de proxy web.

Por extraño que parezca

Lo crea o no, los archivos PAC no son meras listas de números de IP o nombres de servidores en los que se encuentran los servidores proxy oficiales de su red.

Dado que estaban destinados a ser registrados y utilizados en su navegador, los archivos PAC se diseñaron deliberadamente para ser más flexibles que solo una lista estática de datos.

De hecho, un archivo PAC consta de JavaScript que puede determinar dinámicamente si se necesita un proxy y, de ser así, dónde encontrarlo en la red.

Como señala Perry, el formato de archivo PAC se remonta a un cuarto de siglo y apareció por primera vez como una «característica» en el navegador Netscape:

Por supuesto, Perry no tenía la intención de ejecutar archivos PAC dentro de las limitaciones algo más limitadas de un navegador, sino más bien como parte de su software HTTP Toolkit, que se ejecuta como una aplicación normal y potencialmente le da al JavaScript que lanza mucho más alcance y rendimiento. de lo que el código de script disfrutaría en un navegador.

Así que decidió echar un vistazo a cómo los programadores del código de configuración de proxy que eligió se habían enfrentado a las implicaciones de seguridad de obtener y ejecutar JavaScript externo.

Descubrió que el código tenía un componente de nodo llamado. usó vm, corto para máquina virtual, que le permite configurar una nueva instancia de JavaScript o un nuevo estado en el que no interfiere con el código que se ejecuta en otras instancias de Node en su aplicación.

Esta es una precaución útil si desea que dos partes de su código hagan cosas diferentes para que no puedan colisionar accidentalmente.

En las palabras del vm Documentación de la biblioteca:

La seguridad es buena, pero la seguridad es mejor

Perry se dio cuenta de que el programador original cuyo código había adoptado ahora era el vm Biblioteca para seguridad programática y seguridad, aparentemente asumiendo un nuevo vm La instancia no solo estaba separada de los demás vm Instancias en la aplicación, pero también estrictamente en un mundo JavaScript separado e independiente.

Sin embargo, dado que el vm La documentación lo deja claro, en letras fuertes y en negrita:

Perry descubrió rápidamente cómo usar una técnica de programación JavaScript estándar para ejecutar código en la nueva. vm Instancia que tenía acceso completo a los datos externos de su principal Node.js Usar.

Técnicamente, esto representa un error de RCE en el proceso de configuración del proxy, donde RCE es la abreviatura de. es Ejecución remota de código.

En términos generales, RCE significa que el contenido que no es de confianza obtenido de una fuente que no es de confianza puede hacer intencionalmente algo malicioso, que no está permitido, sin mostrar primero advertencias o cuadros de diálogo emergentes.

¿Eso es realmente un problema?

Como señalaron algunos comentaristas sobre el descubrimiento de Perry, explotar esta falla generalmente significa modificar el archivo PAC oficial del proxy de una red privada para que contenga JavaScript con trampa explosiva.

Pero si ya tiene la opción de cambiar la configuración del proxy de una organización, puede redirigir a todos en la red a un proxy falso de todos modos, con o sin errores de JavaScript en la ecuación …

… y si puede redirigir silenciosamente todos los navegadores de la red, ¿ya tiene control más que suficiente sobre los ciberdelincuentes para causar estragos en el negocio?

Por lo tanto, algunos comentaristas argumentaron que CVE-2021-23406 era poco más que una tormenta en una taza de té.

Aparte del hecho de que redirigir todos los navegadores a través de un proxy falso, por arriesgado que sea en última instancia, simplemente no es tan peligroso como tener la capacidad de ejecutar cualquier programa que desee en cada computadora de la red como efecto secundario de la configuración del proxy. ..

… mientras que la configuración del proxy original permanece sin cambios para que todo lo demás parezca funcionar como de costumbre

Hackear una red reconfigurando abiertamente cada computadora para usar un servidor proxy diferente es mucho más probable que resulte en efectos secundarios molestos que serán notados, reportados e investigados.

A los ciberdelincuentes contemporáneos les gusta permanecer «fuera del radar» evitando los cambios que los usuarios comunes podrían notar incluso si no están alertas a los incidentes de ciberseguridad.

¿Qué tengo que hacer?

  • ¿Tiene un software Node.js que lo haga? usó Pac-Resolve, Pac-Proxy-Agent, o Proxy-Agent? En este caso, asegúrese de tener la versión 5.0.0 o superior de estos paquetes.
  • Compruebe los muchos con regularidad Node.js ¿Módulos en los que se basan sus productos? Si no es así, planee hacerlo. Esto significa que usted dedica tiempo y experiencia extra al proceso de lanzamiento de su software. Muévete rápido y rompe cosas puede ser un lema viable para la creación de prototipos y la experimentación interna, pero es una forma despiadada de crear productos de envío.
  • ¿Está investigando las restricciones de seguridad de las bibliotecas que usa? Si no es así, esto es lo que debe hacer. La creación de una nueva instancia de VM de JavaScript parece que debería mejorar la seguridad, ya que cada «máquina virtual» se ejecuta por separado, pero eso no es lo mismo que ejecutarse en una caja de arena con control de seguridad o un jardín amurallado, y la documentación dice que lo hace claramente.
  • ¿Asume que los paquetes generalizados pueden tratarse como seguros? Si es así, entonces no. CVE-2021-23406 no es el tipo de error que probablemente aparezca con el uso normal, a diferencia de un desbordamiento del búfer que puede manifestarse a través de bloqueos inesperados. Algunos errores solo se encuentran porque alguien decidió mirar con cuidado, como lo hizo Tim Perry aquí.

Perry señala que los paquetes de esta historia obtienen aproximadamente 3.000.000 de descargas por semana, por lo que la popularidad por sí sola no es garantía de precisión.

Con los llamados errores de la cadena de suministro de este tipo, nunca olvide que puede subcontratar la codificación, pero no la responsabilidad.