Entonces, la biblioteca se utilizó, si estás construyendo un sitio web y quieres comunicarte con este dispositivo de hardware, instalarías este paquete NPM para poder interactuar con el dispositivo de hardware de una manera más fluida. Así que hay muchos sitios web por ahí que intentan interactuar con este dispositivo de hardware que estaban usando el paquete NPM para hacerlo.
Y la forma en que usarías el paquete es, el README tenía esta línea en la que se indica agregar este paquete de carga del kit de conexión como dependencia y luego usarlo de la siguiente manera. Así que parece bastante sencillo, ¿verdad? Simplemente importas el paquete y luego llamas a esta función de carga del kit de conexión. Y luego, si te fijas, hay otra parte del README que dice que esto permitirá que tu aplicación descentralizada, que básicamente es tu sitio web, cargue la biblioteca del kit de conexión en tiempo de ejecución desde un CDN para que puedan mejorar la lógica y mejorar el producto sin tener que esperar a que las personas lancen nuevas versiones.
Entonces, de inmediato, esto activa mis alarmas porque vemos aquí que el código en el que dependemos en realidad depende de más código, pero este código adicional está en un CDN. ¿Qué significa eso? Significa que ese es un código que puede cambiar. Está cargando ese código desde un servidor remoto. Así que veamos cómo se ve realmente esto. Si realmente entras en esa función, verás que esta función no contiene la lógica de la funcionalidad real que estoy tratando de usar aquí. Lo que realmente está haciendo es ir a esta URL HTTP con una etiqueta de script y luego ejecutar ese código. Y ese código es cualquier código que se sirva en ese servidor en ese momento. Y así, este código puede cambiar debajo de nosotros. Y lo que esto realmente significa es que este es un paquete que efectivamente evita nuestro archivo de bloqueo. Como nuestro archivo de bloqueo en NPM está diseñado para bloquear el código en el que nuestra aplicación depende para que no cambie de compilación en compilación, ¿verdad? Para que sea determinista. Pero cuando tienes un paquete que simplemente va a cargar lo que sea que esté en esta URL HTTP, tu aplicación va a cambiar debajo de ti. Y eso es exactamente lo que sucedió aquí. Entonces, el atacante pudo introducir su código en ConnectKit, que este CDN aquí comenzó a servir. Y luego todos los sitios web por ahí, que en realidad eran, creo, miles, comenzaron a servir instantáneamente el código malicioso sin una actualización, sin una nueva compilación, sin una nueva instalación de NPM. Simplemente se actualizaron instantáneamente todos los sitios. Así es como funcionan las etiquetas de script. Y eso, por cierto, es por qué las etiquetas de script son tan peligrosas. Estás dando capacidades de ejecución de código remoto a cualquier sitio que uses allí.
Entonces, ¿qué aprendimos de esto? Yo diría que aprendimos varias cosas. Veamos algunas lecciones. Entonces, para los autores, quiero decir, la lección principal es no enlazar directamente a CDNs desde dentro de tus paquetes de NPM porque estarás evitando los archivos de bloqueo de tus usuarios, lo cual no es bueno. Además, relacionado con eso, a veces verás paquetes que usan dependencias HTTP o dependencias Git o incluso una URL de GitHub como una solución temporal para solucionar un error. Verás, como, un fork. Las personas dependerán de una versión bifurcada.
Comments