Primero: ¿Qué es eso de una "imagen bomba"?
En resumen, es una imagen de pequeño tamaño (relativamente) que, cuando la abrimos, ocupa una cantidad de memoria desproporcionada.
¿Cómo es posible esto?
Existen formatos de imágenes, entre ellos PNG, que comprimen los ficheros para que ocupen lo menos posible. En este caso vamos a aprovechar una forma de compresión en específico, la cual se encarga de agrupar píxeles que son iguales: es decir, si tenemos 500 píxeles blancos, la compresión tratará de agruparlos y crear punteros a ellos. Solo se guardan una pequeña cantidad de píxeles, lo demás son referencias. (Todo esto es una simplificación)
¿Cómo se puede hacer?
Vamos a usar python para esto. En concreto vamos a usar la librería Pillow. (Podéis hacer una prueba rápida de todo esto en un colab para que no se os pete el pc)
La primera prueba la haremos creando una imagen de 1000x1000 píxeles
Esto nos crea una imagen que ocupa unos 5.1k, bastante poco. Pero en memoria entre 50MB Y 100MB, dependiendo de la aplicación con la que se abra.
Ahora, vamos a crear una imagen de 50000x50000 píxeles
Sigue siendo un archivo ligero, 7MB. Ahora si, en memoria llega a ocupar hasta 20GB!
Con todo esto se pueden hacer imágenes muuucho más grandes, allá vosotros lo que queráis probar.
Además, esto no es una vulnerabilidad como tal, simplemente es una explotación de una funcionalidad. Cuando se manejan imágenes en formatos con compresión, primero hay que cargar en memoria la imagen, no hay más. Dicho esto, no solo las aplicaciones de escritorio se ven afectadas, todo software en servidores también es vulnerable, cualquier servicio de reescalado de imágenes, edición, etc... por poner un ejemplo, ahora que está de moda, servicios de modelos de ia para imágenes. Vamos que al menos que el código este bien escrito pueden haber problemas.
En fin, esto es puramente educativo, ya sabéis.
Por cierto y para que quede un poco mejor el hilo, si queréis saber alguna forma de protección de cara al servidor, es sencillo: Vale con comprobar que una imagen es lo que dice ser y limitar el tamaño, comprobando que en ancho y largo de la imagen son los que dice ser.
En resumen, es una imagen de pequeño tamaño (relativamente) que, cuando la abrimos, ocupa una cantidad de memoria desproporcionada.
¿Cómo es posible esto?
Existen formatos de imágenes, entre ellos PNG, que comprimen los ficheros para que ocupen lo menos posible. En este caso vamos a aprovechar una forma de compresión en específico, la cual se encarga de agrupar píxeles que son iguales: es decir, si tenemos 500 píxeles blancos, la compresión tratará de agruparlos y crear punteros a ellos. Solo se guardan una pequeña cantidad de píxeles, lo demás son referencias. (Todo esto es una simplificación)
¿Cómo se puede hacer?
Vamos a usar python para esto. En concreto vamos a usar la librería Pillow. (Podéis hacer una prueba rápida de todo esto en un colab para que no se os pete el pc)
La primera prueba la haremos creando una imagen de 1000x1000 píxeles
Esto nos crea una imagen que ocupa unos 5.1k, bastante poco. Pero en memoria entre 50MB Y 100MB, dependiendo de la aplicación con la que se abra.
Ahora, vamos a crear una imagen de 50000x50000 píxeles
Sigue siendo un archivo ligero, 7MB. Ahora si, en memoria llega a ocupar hasta 20GB!
Con todo esto se pueden hacer imágenes muuucho más grandes, allá vosotros lo que queráis probar.
Además, esto no es una vulnerabilidad como tal, simplemente es una explotación de una funcionalidad. Cuando se manejan imágenes en formatos con compresión, primero hay que cargar en memoria la imagen, no hay más. Dicho esto, no solo las aplicaciones de escritorio se ven afectadas, todo software en servidores también es vulnerable, cualquier servicio de reescalado de imágenes, edición, etc... por poner un ejemplo, ahora que está de moda, servicios de modelos de ia para imágenes. Vamos que al menos que el código este bien escrito pueden haber problemas.
En fin, esto es puramente educativo, ya sabéis.
Por cierto y para que quede un poco mejor el hilo, si queréis saber alguna forma de protección de cara al servidor, es sencillo: Vale con comprobar que una imagen es lo que dice ser y limitar el tamaño, comprobando que en ancho y largo de la imagen son los que dice ser.