Pero hay una manera o hay múltiples maneras, nuevamente, de mitigar un escenario, como se describe aquí, donde dices, oh, ahora en lugar de obtener el micro frontend púrpura o el original púrpura, obtenemos este código JavaScript modificado. Entonces, las dos formas de hacerlo, y me gustaría hablar más sobre la última aquí, es tener firma de código, lo que significa que usas un enfoque que es muy similar a un JWT. Tú, digamos, tienes una clave pública y una privada, y a través de la clave privada, puedes, digamos, junto con, por ejemplo, el hash, poner algo en tu código que diga, bueno, si esto se cumple, el código está debidamente firmado, por lo que puedes leerlo más tarde, el código en sí todavía es totalmente legible, y junto con la clave pública, verificas que esto no ha sido alterado. Pero también hay una manera más simple, por lo que, por supuesto, eso también hace algunas suposiciones, y eso es simplemente transportar la integridad del archivo JavaScript, y esto es esencialmente solo la función hash utilizada en los contenidos binarios del archivo. Ahora, si obtenemos, por ejemplo, junto con la referencia que usualmente tenemos a un micrófono, esta integridad, entonces podemos, por supuesto, usarla para también verificar que el contenido no ha sido alterado. Cómo funciona eso es que usualmente tienes un servicio de descubrimiento de micrófono central, y colocas esto en el medio de tu arquitectura, de tal manera que tu aplicación no solo, digamos, obtenga las referencias al JavaScript, sino que también obtenga estos valores de integridad, y luego puedes instruir al navegador para que realmente use los valores de integridad, y asegurar, por lo tanto, que solo si no han sido alterados, se ejecutarán. Así que, bastante bien, y el navegador, en este caso, bloqueará el JavaScript modificado porque ve que hay una discrepancia entre lo que el servicio de descubrimiento dijo, lo que se subió originalmente, por supuesto, y lo que realmente recibimos. Y nuevamente, no importa si lo recibimos porque hay un problema con el canal de transporte, o porque alguien podría alterar el almacenamiento de los archivos. Y para nosotros, es algo bueno. En forma de código, podría verse así. Entonces, la primera parte es la respuesta de un servicio de descubrimiento. Nos dice el nombre del micrófono, la versión, también nos da, por supuesto, una referencia a él, y luego, lo más importante, nos da el valor para la integridad. Finalmente, si queremos ahora incrustar esto, lo pondremos en una etiqueta de script, y esto no estaría cableado como lo vemos aquí. Por supuesto, todo esto se hace programáticamente, pero la parte realmente crítica es que usamos el atributo de integridad que ya está, digamos, entendido por todos los navegadores evergreen, y estamos bien. El navegador no bloqueará la ejecución de este archivo si detecta que la integridad no se cumple. Muy bien, entonces, otro problema ha sido resuelto. Esto es genial. Quedan solo tantos y tantos, pero veamos los problemas uno a la vez, y continuemos con la inyección, ¿verdad? Como ya se mencionó, la inyección es algo que quieres tener, pero quieres restringirlo tanto como sea posible, siguiendo, por supuesto, el principio de menor privilegio, que no lo abras innecesariamente, sino solo hasta donde necesites abrirlo. Ahora, el vector de ataque que vemos en este aspecto es, bueno, por supuesto, podemos construir un vector de ataque en el navegador, pero tal vez cambiemos un poco aquí y digamos que ejecutamos microformance en el servidor. Ahora, aquí, por supuesto, tenemos bastantes vectores de ataque críticos que ocurren muy naturalmente porque, bueno, todo se ejecuta en nuestro, por ejemplo, servidor, por lo que podríamos tener acceso allí a alguna base de datos SQL. Podríamos acceder aquí a una caché de Redis o lo que sea. Así que, muchos, muchos recursos, las variables de entorno, que generalmente se usan y, por ejemplo, obtienen el acceso a algo como la base de datos SQL, son muy, muy sensibles. Así que, al final del día, lo que podríamos decir, si hay algún código inyectado, que, por ejemplo, puede entonces leer variables de entorno, también podría enviarlo a algún lugar. Ahora, aún podríamos argumentar, tal vez podamos seguir un modelo como DNO y restringir solicitudes HTTP no deseadas, pero digamos que somos Node.js, no tenemos tales opciones. Claro, aún podríamos proteger el servicio, pero luego hay muchos otros vectores aquí. Entonces, ¿cómo podemos prevenir esto en primer lugar? La respuesta en Node.js es que podemos usar sandboxing con el módulo VM. Esencialmente, esto nos permite realmente solo determinar qué cosas deberían ser accesibles desde un módulo cuando lo ejecutamos. Esto es genial porque entonces, por supuesto, recursos como, por ejemplo, acceder a fetch o acceder a alguna dependencia de terceros que pueda tener acceso a fetch pueden ser severamente restringidos, y no necesitas preocuparte por ninguno de esos. Aún mejor, puedes restringir desde el principio. Ni siquiera necesitas tener acceso, por ejemplo, a process EMV.
Comments