HACER IMAGENES "BOMBA" CON PYTHON


_EzzyS

Miembro muy activo
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
1698510887600.png

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.
1.jpg

Ahora, vamos a crear una imagen de 50000x50000 píxeles
1698511084256.png

Sigue siendo un archivo ligero, 7MB. Ahora si, en memoria llega a ocupar hasta 20GB!
2.jpg


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.
 

Anon

🏴‍☠️
Owner
Staff
Moderador
Paladín de Nodo
Jinete de Nodo
Burgués de Nodo
Noderador
Nodero
Noder
tienes algún ejemplo creado? Prueba a cargarlo en el foro jeje
 

_EzzyS

Miembro muy activo
tienes algún ejemplo creado? Prueba a cargarlo en el foro jeje
Tengo los ejemplos del post, y he estado intentando hacer uno de 100000x100000 píxeles, pero se me peta el equipo xdd, y si lo intento en el colab se come toda la RAM. Cuando lo consiga cargar te aviso ;)
 

Dark

🔥root313🔥
Staff
Moderador
Paladín de Nodo
Jinete de Nodo
Burgués de Nodo
Noderador
Nodero
Noder Pro
Noder
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
Ver el archivo adjunto 26170
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.
Ver el archivo adjunto 26174
Ahora, vamos a crear una imagen de 50000x50000 píxeles
Ver el archivo adjunto 26171
Sigue siendo un archivo ligero, 7MB. Ahora si, en memoria llega a ocupar hasta 20GB!
Ver el archivo adjunto 26173

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.
Lo he probado y nada, el proceso no llegaba ni a los 200mb con 30000x30000

Me ha ocupado 4GB casi el Python creando esa imagen.