Video Summary and Transcription
Los paquetes npm son entradas no sanitizadas de internet que ejecutamos sin mucho escrutinio, por lo que necesitamos abordar el problema de los paquetes maliciosos. Lavamote ofrece protecciones de tiempo de ejecución proactivas para detectar y mitigar amenazas automáticamente. Lava Mode utiliza JavaScript endurecido para proporcionar aislamiento y hacer cumplir una política para el proceso de construcción de su aplicación. La charla introduce un plugin de webpack para aquellos que no quieren usar el ecosistema de browserify. Se explora el comportamiento de Lavamote, mostrando cómo restringe el acceso del paquete a ciertas propiedades. La prueba beta está abierta para recopilar comentarios y mejorar Lava Mode.
1. Introducción a los paquetes npm
Imagina que te doy un poco de código JavaScript y te pido que lo ejecutes en tu aplicación. ¿Lo harías sin verificarlo? Probablemente no. Pero si ofreciera ponerlo en un archivo tar.gz, algunas personas estarían más dispuestas. Eso es porque los paquetes npm son solo archivos tar.gz que extraes de internet e instalas en tu aplicación. Sin embargo, debemos reconocer que estos son entradas no saneadas de internet que ejecutamos sin mucho escrutinio. Este es el tema que discutiremos hoy.
🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐜🐟🐟🐜🐟🐜🐟🐜🐟🐜🐟🐟🐜🐟🐜🐟🐜🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟🐜🐟 Bueno, imagina que te doy un poco de texto y te digo que es JavaScript, que hace algo, solo ponlo en tu aplicación y ejecútalo. ¿Lo pondrías en tu aplicación y lo ejecutarías en producción para tus usuarios? Bueno, he hecho esto antes, he hecho esta pregunta y nadie quiere ejecutar mi código sin verificar qué es, pero si ofreciera ponerlo en un archivo tar.gz, ¿eso ayudaría? Y ahora, algunas personas de repente están más dispuestas a ejecutar mi código. ¿Por qué es eso? Bueno, eso es porque los paquetes npm son solo archivos tar.gz que extraes de internet, no lees su contenido y los pones en tu aplicación. Y no me malinterpretes, esto es genial, uso paquetes npm todo el tiempo, pero tenemos que admitir que estas son entradas no saneadas de internet que pones en tu aplicación y ejecutas sin mucho escrutinio, ¿verdad? Así que esto es de lo que vamos a hablar hoy.
2. Lidiando con Paquetes npm Maliciosos
Necesitamos abordar el problema de los paquetes npm maliciosos. Herramientas reactivas como npm audit y SocketDev pueden ayudar a identificar paquetes potencialmente maliciosos, pero requieren una revisión manual. Alternativamente, Lavamote ofrece protecciones de tiempo de ejecución proactivas para tu aplicación. Imagina un escenario en el que un desarrollador instala una herramienta de construcción, y un hacker malicioso inserta código en una dependencia. Este código puede comprometer información sensible. Para mitigar este riesgo, necesitamos una aplicación que pueda detectar automáticamente estas amenazas.
Sabes, estamos instalando paquetes npm, estamos instalando muchos de ellos. Pero, ¿qué pasa si algunos de ellos no son buenos? Y con no buenos, no me refiero a paquetes malos, he publicado un montón de paquetes malos en mi tiempo. No pasó nada malo, pero me refiero a paquetes realmente maliciosos. Esta masterclass va a ser estrictamente sobre paquetes maliciosos.
¿Cómo manejamos esa situación? Bueno, hay herramientas que yo llamo herramientas reactivas. Puedes usar npm audit o cualquier cosa que pase por informes CVE, etc., y te dice que, hey, este paquete en tus dependencias que ha estado en producción durante dos meses, alguien lo revisó y encontró un problema con él. Ese paquete es realmente malicioso. ¿Es eso suficientemente bueno? Probablemente no. Luego está SocketDev. SocketDev es esta nueva cosa donde ellos usan varias formas de analizar los paquetes automáticamente y vienen con sugerencias de que, hey, este paquete, parece que algo anda mal con él. Deberías buscarlo, deberías revisar qué está haciendo este paquete. Parece arriesgado. Así que SocketDev puede decirte eso incluso horas después de que el paquete ha sido publicado, porque ya está analizado. Eso es una gran mejora. Aunque tienes que hacer la revisión tú mismo. ¿Tienes tiempo para eso? Bueno, ahora tienes que tenerlo. ¿Cuáles son las otras opciones? Bueno, puedes ser proactivo en lugar de reactivo. Y aquí es donde entra Lavamote. Voy a contarte sobre Lavamote. Lavamote es un conjunto de herramientas que juntas proporcionan protecciones para tu aplicación. Pero esas protecciones ocurren en runtime en lugar de cuando estás buscando paquetes que deseas instalar. ¿De acuerdo? Entonces, ¿cómo funciona? Bueno, vamos a repasar los conceptos básicos aquí. Así que imagina a este tipo desarrollador. Quiere instalar una herramienta de construcción para la aplicación. Lo que sucede es que una de las dependencias de desarrollo de su aplicación, en algún lugar del árbol de dependencias de esta herramienta de construcción está controlada por un hacker malicioso representado por un sombrero negro y una sudadera con capucha, obviamente. Y lo que hace el hacker, ponen un poco de código en un paquete existente que ya se confiaba en él. Ese código toma tu token de GitHub y lo envía a algún lugar. ¿Es eso agradable? Eso no es agradable. ¿Lo detectarías? Bueno, es poco probable que leas todo lo que pones en tus dependencias. Así que en su lugar, usemos una aplicación para eso.
3. Lava Mode y la Aplicación de Políticas
Lava Mode genera una política para el proceso de construcción de tu aplicación y la aplica. La política se aplica por paquete, lo que te permite controlar qué incorporaciones, importaciones y globales están disponibles. Si un paquete viola la política, Lavamode evita que importe o use elementos restringidos en tiempo de ejecución. Lavamode utiliza el propio lenguaje para defenderse contra el código ofuscado o importado dinámicamente, interceptando el acceso a variables globales. Esto se basa en JavaScript Endurecido, lo que permite el aislamiento.
Y aquí es donde entra Lava Mode. Lava Mode hace dos cosas en esta etapa. Primero genera una política. Así que ejecutas Lava Mode en tu aplicación. En este caso, tu aplicación es el proceso de construcción. Así que ejecutas tu proceso de construcción a través de Lava Mode con un indicador que dice, oh, genera la política automáticamente. ¿Y obtienes un archivo de política que puedes editar? Llegaremos a eso en un momento. Y entonces tu script real no se está ejecutando puramente en Node, sino que se está ejecutando en Node instrumentado por Lava Mode. Y Lava Mode se va a asegurar de que la política que se establece se va a aplicar.
¿De qué se trata esa política? Esta es la política. Este es un breve fragmento del contenido de una política. Así que tienes ese plugin eslint, y tiene una dependencia que el hacker modificó, y el uso de HTTPS y process env probablemente será detectado. Así que aparece en la política. Puedes cambiar eso a falso. O puedes eliminar completamente esos elementos de la política, lo que significa que estos no van a estar disponibles. Y lo que es genial es que la política se aplica por paquete. Así que dentro del mismo proceso, dentro de los mismos contextos, hemos aislado cada paquete por separado de manera que puedes decidir qué incorporaciones o qué importaciones en general van a estar disponibles para él y qué globales van a estar disponibles para él.
Así que ahora, con el cambio de política, obtendrás un error diciendo que este paquete, EvilDependency, solicitó HDDPS, y no se suponía que debía hacerlo. Así que si un paquete que sólo se suponía que procesaba cadenas tenía una política generada, esta cosa va a evitar que importe o use algunos globales en tiempo de ejecución. Y necesito verificar que entiendes que sólo el paso inicial de generar la política está procesando el código en absoluto. Si encuentra algo que se está utilizando de una manera regular, lo va a poner en la política y luego puedes modificarlo. Pero si el paquete, incluso si el paquete está ofuscado o utiliza algunos... Importa cosas dinámicamente o utiliza algunos globales dinámicamente, si la política no lo detectó, estas cosas no terminaron en la política, lo que significa que en tiempo de ejecución, Lavamode ya no está leyendo el código. Lavamode está utilizando el propio lenguaje para defenderse. Así que si cualquier programa es capaz de acceder a la variable global llamada process, Lavamode va a interceptar eso. Y tenemos el poder de decidir si process va a ser el process que el programa espera o si este paquete en particular va a obtener undefined en su lugar. De aquí es de donde viene el poder. Tú puedes decidir, el hacker no puede. ¿De acuerdo? Así que todo esto se basa en algo llamado JavaScript Endurecido. JavaScript Endurecido nos permitirá hacer el aislamiento.
4. JavaScript Endurecido y Lava Mode
JavaScript Endurecido proporciona aislamiento a través de compartimentos, bloqueo y endurecimiento. Los compartimentos permiten el aislamiento de procesos o pestañas, mientras que el bloqueo repara y congela los globales del lenguaje para eliminar la contaminación del prototipo. La función de endurecimiento protege objetos específicos del código no confiable. La implementación del compartimento es una propuesta en etapa temprana impulsada por los responsables de congelar objetos, usar estricto y promesa. Lava Mode fue creado para proteger Metamask, una extensión de navegador, y utiliza un empaquetador basado en browserify.
Y sobre eso, podemos construir la parte de Lavamode que decide qué puede ser accedido por quién.
Bien, entonces JavaScript Endurecido son tres cosas. Una es el compartimento. Es algo que proporciona este aislamiento. Así que puedes tener compartimentos en un proceso en tu aplicación o en una pestaña en tu navegador. Puedes tener varios compartimentos que están aislados entre sí. Y para que eso sea seguro y para evitar dejar algo en el lenguaje que pueda ser manipulado, tenemos el bloqueo. El bloqueo es algo que ejecutas al inicio de tu aplicación. Y va a utilizar la flexibilidad de JavaScript para eliminar la flexibilidad de JavaScript. Así que el bloqueo reparará y luego congelará todos los globales que son parte del propio lenguaje. Así que el prototipo de objeto ya no será algo con lo que el código malicioso pueda jugar para hacer contaminación de prototipo. El bloqueo prácticamente elimina el tipo de ataque de contaminación de prototipo global. Y por último, pero no menos importante, endurecer. Endurecer es una función que puedes usar para proteger un objeto específico que quieres pasar a algún código que necesita usarlo, pero no quieres confiar plenamente en esa cosa. Así que puedes usar endurecer en tu aplicación cuando estás pasando algunos objetos a una función de dependencia y los estás recuperando y luego procesándolos aún. Así que, ya sabes, pueden reemplazar un array con algo que simplemente tiene el método reduce y va a implementar algo completamente diferente como el método reduce.
Bien, y los compartimentos, o para ser más precisos, todo lo que está detrás de la implementación del compartimento va a formar parte del lenguaje. Bueno, eventualmente, es una propuesta en etapa temprana. Ha habido un montón de progreso en la virtualización de la carga del módulo. Esto está ocurriendo en 2C39, y eventualmente obtendremos todas las partes que son necesarias para construir un compartimento en el propio lenguaje. Y estas están siendo impulsadas por personas que son responsables de traernos cosas como congelar objetos, usar estricto o promesa. Así que tengo esperanzas.
Y estamos en una conferencia que no es exactamente sobre Node. Así que mi ejemplo anterior probablemente fue menos interesante, pero tenemos un empaquetador. Así que Lava Mode fue creado para proteger Metamask, la cartera de criptomonedas, y Metamask resulta ser una extensión de navegador. Así que necesita ser construido, y también necesita ejecutarse bajo una política de seguridad de contenido que impide el uso de eval. Y la implementación actual de JavaScript Endurecido tiene que usar eval para construir un evaluador. En el futuro, el evaluador también será parte del lenguaje, pero por ahora, necesitamos un evaluador, pero no tienes que usar un evaluador que esté construido sobre eval. Si resulta que eres un empaquetador. Así que tenemos un empaquetador basado en browserify porque browserify era el más flexible y era la fruta más fácil de alcanzar.
5. Introducción del Plugin de Webpack y Pruebas Beta
Estamos introduciendo un plugin de webpack para aquellos que no quieren usar el ecosistema de browserify. Webpack es el sistema de construcción más flexible, y después de cuatro intentos, hicimos posible el plugin. Estamos abriendo nuestra beta para pruebas, así que por favor háganos saber si encuentra alguna incompatibilidad. Este es un proyecto de código abierto, y queremos proporcionar soporte y solucionar cualquier problema que surja.
Así que se desarrolló hace unos años y ahora ha estado alimentando la integración de metamask con laugh mode durante un tiempo. Así que podemos tomar eso y usarlo de inmediato, pero estamos introduciendo un plugin de webpack para aquellos de ustedes que no desean permanecer en el ecosistema de browserify o incluso volver a él porque sí, sí sé que browserify está un poco anticuado. Fue genial en su momento, pero ahora está un poco anticuado. Webpack fue el más flexible de los sistemas de construcción que se utilizan actualmente. Así que optamos por eso. Y aunque inicialmente parecía imposible, pero después de cuatro intentos llegamos a un punto donde el plugin es realmente posible. Y vamos a abrir nuestra beta, que es una prueba. Así que no hay garantías para la seguridad y la producción todavía, pero queremos probarlo en su proyecto. Y por favor háganos saber si encuentra alguna incompatibilidad donde sus plugins de Webpack se interfieren con nuestro plugin. Así que por favor póngase en contacto en el hilo de discusión. Esta es la única oportunidad de obtener soporte en vivo para el plugin sin pagar por ello de ninguna manera porque este es un proyecto de código abierto. Y aunque probablemente no apoyaremos a todos todo el tiempo, este es el momento en el que realmente queremos estar en contacto con usted y ver lo que está haciendo y en qué problemas se mete para que podamos solucionarlo para todos en el futuro, ¿de acuerdo? Ahora, sí, antes de llegar a las diapositivas finales vamos a entrar en una demostración de este bundler.
6. Explorando el Comportamiento de Lavamote
Echemos un vistazo a lo que hace Lavamote en vivo. Es una aplicación sencilla que importa un paquete llamado Cookie Monster. La aplicación establece una cookie, imprime la cookie y el host de ubicación, y pide una cita aleatoria de CookieMonster. También se incluye el archivo TypeScript, y todo se construye con webpack. El paquete CookieMonster tiene permiso para usar fetch, math y encode URI. Sin embargo, también intenta robar cookies enviándolas a un servidor.
Entonces, echemos un vistazo a lo que hace Lavamote en vivo. Esta es una aplicación muy sencilla. Para abreviar, lo que está haciendo es importando un paquete que hice llamado Cookie Monster. Por cierto, no busques este paquete en NPM. Es un paquete malicioso y publicar cosas maliciosas en NPM no es una buena idea. Quiero decir, he sido expulsado de NPM antes. Así que déjame decirte, no deberías hacerlo.
Y luego hay otro paquete solo para demostrar que puedes importar algún paquete CJS antiguo y todavía va a funcionar. Hay un poco de TypeScript que se está importando. Todo esto se está agrupando y se envía al navegador para ejecutarse. ¿Qué hace? Establece una cookie. Y luego imprime la cookie del documento y el host de ubicación para el contexto. Y luego pide una cita aleatoria de CookieMonster. Y CookieMonster nos da una cita, una cita famosa de CookieMonster, siempre es divertido. Lo pasamos por leftPad porque ¿por qué no? Y luego obtenemos una reacción del archivo TypeScript para saber que el TypeScript está funcionando. Y todo esto se construye con webpack. Así que tenemos app.js como punto de entrada. Se agrupa, y tiene algunos plugins que webpack normalmente usa. Pero sobre todo, tiene el plugin ScoreTrop. Y pasamos la política aquí. Obviamente, esto podría cargarse desde un archivo porque ¿por qué no?, pero estamos pasando la política aquí. A leftPad no se le permite acceder a ninguna variable global, eso es normal porque leftPad no depende de ninguna variable global. Y ahora, CookieMonster... Permitimos a CookieMonster usar fetch, math, y encode URI. Así que estas son las variables globales a las que CookieMonster va a acceder con éxito.
Bueno, ahora echemos un vistazo al CookieMonster. CookieMonster nos está dando una cita aleatoria de un montón de citas que están disponibles, pero también intenta robar nuestras cookies. Bueno, es un CookieMonster, ¿qué esperabas? Así que sí, va a ejecutar un fetch y enviará tu host y tus cookies a un servidor para usarlas en el futuro. Y esto no es lo mejor que le puede pasar a tus cookies, te lo aseguro. Echemos un vistazo al comportamiento de esta aplicación.
7. Analizando el Comportamiento de la Aplicación y Pruebas Beta
Echemos un vistazo al comportamiento de esta aplicación. Cuando se ejecuta sin el plugin Scoretrot, la solicitud enviada por el paquete Cookie Monster roba nuestra cookie. Sin embargo, cuando se ejecuta con Lava Mode, el paquete se restringe de acceder a ciertas propiedades, resultando en valores indefinidos. Si quieres aprender más, te recomiendo ver las charlas anteriores sobre JavaScript endurecido y participar en nuestra beta. Ofrecemos soporte para ayudarte a configurar Lava Mode en tu proyecto y agradecemos tus comentarios para mejorarlo.
Así que he construido esta aplicación con y sin el plugin Scoretrot, y ahora puedo mostrarte cómo es. Así que aquí estamos en una página con las herramientas de desarrollo abiertas donde el plugin Scoretrot no estuvo involucrado. Vale, déjame recargar la página y mostrarte qué pasa. Así que estamos en el nombre de localhost, chocolate chip es lo que tenemos como cookies. Obtenemos las citas y también obtenemos un error porque Cookie Monster no fue muy discreto al enviar esta solicitud, pero puedes ver que la solicitud contiene nuestra cookie que ha sido robada. Mientras tanto, si ejecutamos con Lava Mode, puedes ver que obtenemos indefinido. ¿Por qué obtenemos indefinido? Porque, la ubicación y el documento no estaban listados en la política. Así que no existen para Cookie Monster. Mientras tanto, nuestra aplicación estaba accediendo a ellos con éxito para imprimir en la consola. Eso es más o menos lo que pasa aquí. Nosotros controlamos eso, no Cookie Monster.
¿Quieres saber más? Hay algunas charlas anteriores que di sobre JavaScript endurecido, también conocido como Secure ECMAScript, abreviado como SAS. Y Mark Miller, el inventor de JavaScript endurecido, tuvo una charla muy interesante con más detalles que también te recomiendo que veas. Te recomiendo que participes en nuestra beta, y recuerda, puedes obtener ayuda para configurar tu Lava Mode en tu proyecto si te pones en contacto, ya sea a través del canal beta o si quieres ejecutar algo más que solo el plugin de Webpack, no dudes en ponerte en contacto, y ofrezco soporte limitado por tiempo limitado para que puedas empezar a funcionar. Y todo lo que recibo a cambio son los problemas con los que te has topado, para que podamos hacer Lava Mode aún mejor. Gracias, y mantente seguro. SÍGUENOS EN LAS REDES SOCIALES SÍGUENOS EN LAS REDES SOCIALES SÍGUENOS EN LAS REDES SOCIALES
Comments