¿Es segura la carga de imágenes a una base de datos si cambia el tamaño de la imagen primero en bytes sin procesar?

1

Por favor, vea el código de carga a continuación. El método se llama dentro de un try, catch. Si se necesita el código para las utilidades de imagen, simplemente diga. Básicamente, todo se maneja en bytes sin procesar y luego se almacena en la base de datos. Actualmente reproduzco imágenes como base 64, pero me estoy moviendo hacia el uso del fragmento inferior en la api web.

Mis principales pensamientos son:

  • La imagen se carga en bytes sin procesar. Si bien podría contener un virus, no se ejecutaría
  • El servidor tiene un tamaño máximo de archivo establecido, y antes de este método el usuario se autentica y se comprueba que no están descargando ningún otro archivo (uno a la vez) con una carga máxima de 100 imágenes por hora. Espero que esto detenga una imagen específica DoS.
  • Debido a que la imagen se modifica para que tenga un tamaño determinado (100 x 100), si no es un tipo de imagen válido, se generará una excepción y todo se incluirá en la lista
  • ¿Puedo agregar una lista blanca en las extensiones de archivo antes de esto si puedes ver algún problema potencial?
  • Creo que Image.FromStream está a salvo de un ataque por desbordamiento

    public string StoreProfileImage(ImageViewModel model, string userId)
    {
            var postedImg = model.Image;
            var image = Image.FromStream(postedImg.InputStream, true, true);
            if (image != null)
            {
                Rectangle rect = new Rectangle();
                rect.X = (int)Math.Floor(model.x / model.scale);
                rect.Y = (int)Math.Floor(model.y / model.scale);
                rect.Width = (int)Math.Floor(model.width / model.scale);
                rect.Height = (int)Math.Floor(model.height / model.scale);
    
                // crop the image
                var croppedImg = ImageUtilities.CropImage(image, rect.Height, rect.Width, rect.X, rect.Y);
                // resize to max pic size
                var resizedImg = ImageUtilities.ResizeImage(100, 100, croppedImg);
                // convert to bytes
                byte[] imageData = ImageUtilities.ImageToByteArray(resizedImg);
    
                using (var db = new DbContext())
                {
                    var userImage = new UserImage
                    {
                        ImageBytes = imageData,
                        ImageName = postedImg.FileName,
                        UserId = userId,
                        IsProfileImage = true
                    };
    
                    // add new users image
                    db.UserImage.Add(userImage);
                    db.SaveChanges(); 
                }
                return ImageUtilities.BytesToBase64(imageData);
            }
            return null;
        }
    

Fragmento de procesamiento

 HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
 result.Content = new ByteArrayContent(image.ImageBytes);
 result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
 return result;
    
pregunta user2330270 19.03.2016 - 20:51
fuente

2 respuestas

3

Mientras que la limpieza de la imagen mediante el cambio de tamaño es una buena idea, hubo varios errores críticos en las bibliotecas de procesamiento de imágenes en el pasado. Lo que significa que el proceso de cambio de tamaño de la imagen en sí podría desencadenar un error de este tipo y, por lo tanto, provocar un DOS con un ataque de complejidad contra la biblioteca de manipulación de imágenes o incluso la ejecución remota de código. Es por eso que el proceso de cambio de tamaño debe realizarse dentro de algún tipo de VM o sandbox y también debe estar limitado en el uso de CPU y memoria.

Y luego hay varias formas de cambiar el tamaño. No estoy familiarizado con la implementación que usa, pero podría ser que los metadatos de la imagen se conserven (es decir, comentarios, marcas, tiempo de creación, etc.) y, por lo tanto, aún se puedan usar más adelante dentro de un ataque. Por lo tanto, es mejor que primero convierta la imagen a algún formato como PPM, que no tiene capacidad para almacenar metadatos para eliminar cualquier tipo de metadatos dañinos potenciales.

Tampoco estoy familiarizado con el código de almacenamiento de la imagen en la base de datos en la implementación. Es de esperar que utilice el enlace de parámetros o técnicas similares, porque de lo contrario, una imagen maliciosa también podría usarse para un ataque de inyección de SQL.

En cuanto a la lectura de la imagen, debe tener en cuenta que los navegadores a menudo ignoran el tipo de contenido que envía según el contexto. Esto significa que si la URL se utiliza como fuente para la etiqueta de secuencia de comandos, la imagen se interpretará como secuencia de comandos, incluso si el tipo de contenido es imagen / png (Chrome no lo permite, pero otros sí lo hacen). La aplicación de contexto similar se puede hacer con una descarga forzada. Por ejemplo, podría enviar malware oculto por un tipo de imagen con <a href=image.png download=malware.zip> e incluso podría tener los bytes mágicos correctos para el tipo de imagen en la parte delantera porque la extracción de archivos ZIP a menudo ignora la basura al principio del archivo ZIP. Pero si eliminó los metadatos como he recomendado, probablemente esté seguro contra este tipo de mal uso.

    
respondido por el Steffen Ullrich 19.03.2016 - 21:53
fuente
0

¿Entonces tiene una carga de archivos HTTP para imágenes, y algún código para cambiar el tamaño de la imagen en el servidor, y está preguntando si es "seguro" (contra todo)?

No, nada es seguro.

  

La imagen se carga en bytes sin procesar. Si bien podría contener un virus,   no correría.

¿Por qué crees eso? Con un error en el servidor web y patrones de bytes específicos creados para usar este error, podría ejecutarse incluso antes de que llegue al código de procesamiento. Tener un código para cambiar el tamaño de las imágenes no puede evitarlo.

  

... tamaño máximo de archivo ... detener ... DoS

Hay muchos tipos de ataques DOS / DDOS. Cambiar el tamaño de las imágenes no ayudará.

  

Debido a que la imagen se modifica para que tenga un tamaño determinado (100 x 100), entonces si   no es un tipo de imagen válido, esto arrojaría una excepción y   todo esta recortado

Los archivos que son tanto una imagen válida como un malware no son un problema.
Imágenes que mantienen su parte de malware sin cambiar mientras se redimensiona, es decir. El malware no es parte de los datos de píxeles / color, tampoco son un problema.

  

Podría añadir una lista blanca

¿Para qué? Esto no ayudará.

  

Creo que Image.FromStream está a salvo de un ataque por desbordamiento

¿Y si no es como crees? Derecha.

Aparte de eso, enumeraste tus pensamientos sobre algunos ataques específicos, pero ¿qué hay del enorme descanso?

Cambiar el tamaño, o mejor convertir, las imágenes ciertamente ayuda contra algunas cosas en algunos casos,
Pero no es una bala mágica.

    
respondido por el deviantfan 19.03.2016 - 21:12
fuente

Lea otras preguntas en las etiquetas