- Después de copy.fail, se dieron a conocer vulnerabilidades adicionales del kernel de Linux
- Actualmente se considera que es un momento especialmente propicio para que un ataque a la cadena de suministro de NPM cause grandes daños
- Se recomienda hacer una excepción con los parches del kernel de Linux proporcionados por la distribución
- Fuera de eso, conviene suspender la instalación de software nuevo durante aproximadamente una semana
- Se añade la salvedad de que, desde la publicación, los hechos o la situación podrían haber cambiado, por lo que se pide contactar antes de sacar conclusiones si algo parece incorrecto o poco claro
1 comentarios
Comentarios en Hacker News
Esto era una pesadilla que tarde o temprano iba a explotar. Hay demasiados paquetes y, con eso, la superficie de ataque de la cadena de suministro se volvió tan enorme que en algún momento iba a estallarle a todo el mundo
Pero era demasiado conveniente. A quienes intentaban advertir o reducir el daño los ignoraban personas que nunca habían probado otra forma de hacer las cosas, y
"import antigravity"era demasiado fácil como para renunciar a esoParece que ahora entramos en la etapa de “pagar el precio”
Casi todo se compilaba desde el código fuente, incluidos el compilador, el kernel y demás; los servidores/infraestructura de build no tenían ningún acceso a internet, y también había un proceso para introducir cambios. Cada CVE se revisaba al publicarse para decidir si nos afectaba y cómo mitigarla o manejarla
Después me cambié a una empresa donde los builds sí accedían a internet y actualizaban en cuanto salía una versión nueva. La gente lo veía como una buena práctica porque así recibían las correcciones de bugs más recientes, y la revisión de CVE la llevaba el equipo de seguridad
Luego estuve en una startup donde había una mezcla de prácticas. Había cosas muy buenas, pero también mucha deuda de CVE. Por ejemplo, usaban secure boot y discos cifrados en los servidores, y también tenían bastante claro el tema de asegurar las comunicaciones entre componentes
Todos creen que lo están haciendo bien. Es casi imposible convencer a la gente de “actualizar frecuentemente” de que existe el riesgo de introducir problemas nuevos. La industria necesita un mejor conjunto de prácticas, y personalmente creo que la forma de gestionar dependencias de la primera empresa era mejor. En general, las prácticas de seguridad estaban bien establecidas y el producto era realmente seguro
Que todo el software útil termine pasando por fuzzing, pruebas basadas en propiedades y verificación formal, y que cualquiera que busque vulnerabilidades tenga que volver a empezar desde cero
Claro, eso asumiendo que sobrevivamos el período intermedio en el que cada país lanza lo que le queda contra sus peores enemigos. O quizá al final terminemos golpeándonos con huesos de animales
A nivel de sistema operativo, el programa ejecutado recibiría tokens de capacidad desde el shell o desde donde se lo lanzó, y todas las system calls tendrían que recibir una capacidad como primer argumento. Entonces
"open path /foo"se convierte enopen(cap, "/foo"). Esa capacidad puede ser un filesystem falso, una rama del filesystem real, un filesystem de red o lo que sea, y el programa no necesita saber en qué sandbox viveTambién a nivel de librerías/lenguaje, al importar librerías de terceros como módulos de npm, habría que pasar capacidades en el momento del import o en cada punto de llamada. Esa librería no debería tener acceso de lectura/escritura a todos los bytes del espacio de direcciones de mi programa, ni poder hacer cualquier cosa en mi computadora como si fuera yo. La pregunta clave es: “¿cuál es el radio de explosión de este código?”. Si la librería que uso es maliciosa o vulnerable, necesito valores predeterminados razonables sobre la magnitud del daño. Una llamada como
lib::add(1, 2)no debería terminar en un compromiso persistente de toda mi computadoraSeL4 ofrece capacidades rápidas y eficientes a nivel de sistema operativo desde hace mucho tiempo, y funciona bien. En muchos casos es más rápido que Linux, y es muy útil para sandboxing transparente, drivers en espacio de usuario, comunicación entre procesos, mejoras de seguridad y demás. Incluso se puede ejecutar Linux como un proceso sobre SeL4. Quiero un sistema operativo que tenga toda la funcionalidad de un escritorio Linux, pero que se comporte como SeL4
Lamentablemente, no parece existir un lenguaje de programación con capacidades a nivel de lenguaje en la forma que quiero. Rust está bastante cerca, pero hace falta una forma de impedir que crates de terceros puedan llamar cualquier código unsafe. Incluyendo unsafe invocado por dependencias no confiables. También hay que corregir viejos bugs de soundness en Rust, y hace falta una biblioteca estándar basada en capacidades. Cosas globales como
open()/listen()deberían desaparecer, y solo deberían existiropenat()y formas equivalentes para las demás partes del sistema operativoSi los LLM siguen mejorando, en unos años, si nadie lo hace antes, pienso pedirle a un LLM que construya todo esto. La seguridad de los sistemas operativos de escritorio modernos es un chiste
También necesitamos una cultura de higiene para el código, y no es tan distinta de las normas que la mayoría de las culturas desarrolló para la comida. Es una combinación de heurísticas imperfectas, pero esa sensación de “guácala” salva a miles de millones de personas
Ahora estoy reduciendo la exposición a dependencias más que nunca, sobre todo en cosas que se pueden implementar con unos pocos cientos de líneas. Esto sí que es un cambio de paradigma
El enfoque de “espera una semana antes de instalar software” no funciona. Hace apenas unos meses una vulnerabilidad masiva golpeó la web, y fue un ataque diferido que estuvo latente más de un mes antes de ejecutarse
Si todos empiezan a esperar una semana, los atacantes esperarán dos. Los ciberdelincuentes no necesitan explotar algo de inmediato; solo necesitan explotarlo eventualmente. Además, muchos tipos de vulnerabilidad, como el typosquatting, no cambian en nada con este enfoque
Porque es muy probable que todavía no haya parches para estas vulnerabilidades, y aunque ya existan, es muy probable que pronto se descubran otras aún peores
Pero si no hay ningún retraso, podrías comerte un exploit que todavía nadie ha visto
Además, el descubrimiento de esos compromisos no dependió en absoluto de si llegaron a explotarse de verdad. Por eso no entiendo lo de “si todos esperan una semana, los atacantes esperarán dos semanas”
Como otra opción, puedes moverte a un sistema operativo como FreeBSD, que no aborda la seguridad con mentalidad YOLO
Las correcciones de seguridad no se tiran así nomás al kernel de FreeBSD sin coordinación. Pasan por el equipo de seguridad de FreeBSD, y pocos minutos después de que el parche entra al árbol src, se distribuyen actualizaciones binarias mediante FreeBSD Update y pkgbase para 15.0-RELEASE
Más o menos toma unos segundos que aparezca el mensaje en Slack de “empujé el parche”, 10 a 30 segundos subirlo, y hasta 1 minuto para la sincronización de mirrors
Siendo justos, mi reporte era sobre algo que no era un componente central y tampoco era fácil de explotar, pero Debian, OpenBSD, SUSE y Gentoo lo parchearon todo dentro de una semana https://www.maxchernoff.ca/p/luatex-vulnerabilities#timeline
Dicho eso, tampoco estoy diciendo que se deba juzgar todo un sistema operativo por cómo manejó un solo reporte menor, porque todo lo demás que he visto apunta más bien a que FreeBSD sí toma bastante en serio los reportes de seguridad. Aunque la misma lógica también puede aplicarse a bugs del kernel de Linux. Ese tipo de mala gestión de parches también es bastante raro en Linux
Suele priorizar la usabilidad por encima de la seguridad. Aquí hay un ejemplo conocido: https://vez.mrsk.me/freebsd-defaults
Agradezco el trabajo que aporta al proyecto, pero mientras existan esos malos valores por defecto, no puedo recomendarle a la gente que se cambie con la conciencia tranquila
Si quieres FreeBSD y seguridad, mejor usa HardenedBSD de Shawn Webb
Incluso los expertos en seguridad ya tienen que aceptar que nuestro mundo está sostenido sobre un equilibrio enormemente frágil. Creo que la gente realmente subestima esto
Y no solo el mundo de TI, sino el mundo entero está construido sobre montones de equilibrios muy frágiles. Los exploits de seguridad siempre van a existir. No solo en software, también en la vida real. Alguien logró colarse en una conferencia de seguridad, y ni siquiera fue un actor sofisticado, sino un youtuber. Claro, no era un evento de máxima seguridad, pero es el ejemplo que se me viene a la mente. Básicamente, en la mayoría de los casos, saltarse la seguridad es realmente fácil
Lo que quiero decir es que, en el fondo, nuestro mundo funciona porque la mayoría de la gente, al menos la mayor parte del tiempo, no abusa de ello. La sociedad humana siempre ha funcionado así, y probablemente seguirá funcionando así
Según entiendo, un youtuber llamado Max Fosh logró entrar repetidamente a la International Security Expo. En el Reino Unido usó el alias “Rob Banks” en https://www.youtube.com/watch?v=qM3imMiERdU y en Estados Unidos “Nick Everything” en https://www.youtube.com/watch?v=NmgLwxK8TvA
He estudiado un poco la cultura de la seguridad, y casi siempre termina siendo una escala deslizante entre seguridad de un lado y conveniencia/accesibilidad del otro. Cuanto más seguro, menos accesible; y al revés también
Ya hay una solución bastante buena para los ataques a la cadena de suministro en gestores de dependencias como npm, PyPI y Cargo: configurar que solo se instalen versiones de paquetes con algunos días de antigüedad
Todos los ataques grandes recientes se detectaron y revirtieron en menos de un día, así que con eso se habrían evitado sin problema. Este comportamiento debería ser el predeterminado. Puedes dejar que beta testers voluntarios y empresas de escaneo de seguridad prueben primero por un día las versiones más recientes de los paquetes. La idea está aquí: https://cooldowns.dev/
Es un gestor de artefactos. Te permite traer solo lo que aprobaste. Puedes actualizar rápido cuando lo necesites, y usar versiones estables validadas de forma consistente cuando haga falta. Requiere un poco de override de configuración, pero es algo fácil
Yo mismo hice una herramienta improvisada para un objetivo parecido, y este es un buen proyecto
Claro, fuera del entorno corporativo eso naturalmente no funciona tan bien
Una vez descubiertas, explotan de inmediato, y retrasar las actualizaciones les da más tiempo a atacantes entusiasmados
Otro modelo es CPAN de Perl, que distribuye solo archivos fuente
Quienes adoptaron integración continua y builds en contenedores relativamente hace poco deberían revisar si su sistema no está trayendo
latestde varios paquetes en cada buildNosotros armamos un contenedor base con todas las dependencias externas incluidas, y solo lo actualizamos explícitamente cuando decidimos que ya es momento
Así que quizá vayamos un poco detrás de la punta de lanza, pero asumimos mucho menos riesgo de que una vulnerabilidad de la cadena de suministro aleatoria se despliegue de inmediato por todo el mundo
Es un texto de opinión activamente dañino. Cuesta entender la lógica
Toma 45 segundos verificar desde cuándo existen realmente las vulnerabilidades copyfail y dirtyfrag. Es más tiempo del que toma leer el texto, sí. Dirtyfrag podría afectar incluso a sistemas que se remontan a 2017
Lo afectado no es software “nuevo”. Y el software realmente viejo está todavía peor, porque ha tenido mucho más tiempo para que le encuentren problemas
Algún día alguien va a reconstruir toda la pila, desde el sistema operativo hasta las aplicaciones, con upgrades de proof-carrying code
La única forma de ejecutar código confiable es mediante el codiseño y la coconstrucción de la prueba y el código
Esto no aplica solo al software; en realidad aplica a casi todo
No recuerdo dónde lo leí, pero al final se reduce a la diferencia entre necesidad y deseo
He usado esta regla al decidir si comprar un auto nuevo o usado, una aspiradora premium o una básica. Lo mismo con traer un aparato nuevo y brillante, algo nuevo al stack tecnológico, o elegir un stack tecnológico nuevo
Me gustaría ayuda para entender qué es copyfail y cómo se conecta con los paquetes de NPM
Por lo que logré ordenar, copyfail parece ser un bug del kernel que permite que un paquete npm malicioso obtenga privilegios de root en un servidor Linux
Entonces, como todavía hay servidores sin parchear, este sería el momento perfecto para que atacantes apunten a paquetes de NPM
¿La razón por la que el consejo no es simplemente “actualiza el kernel” es que siguen descubriéndose problemas nuevos relacionados?
Si un paquete popular de NPM fuera comprometido e incluyera un exploit de copy.fail, muchos sistemas quedarían vulnerables a una escalada de privilegios a root