C # Image.FromStream es así de seguro?

7

después de leer los datos de la solicitud como Stream i necesitaba convertirlos a Imagen, así que utilicé este Método:

Stream inputStream = HttpContext.Current.Request.InputStream;
Image img = Image.FromStream(inputStream)

así que, aunque no puedo saber qué había en ese inputStream (el formato del archivo ya está hecho, pero aún así ...) puede haber un virus o malware, por lo que en ese caso FromStream (Stream) arrojaría ArgumentException. ya que no es una imagen.

mi pregunta es: si el archivo cargado contiene un virus y el método lanza una excepción al intentar convertir la secuencia a Imagen: ¿Eso hizo algún daño al servidor? Si es así, ¿cómo evitarlo? ¿Cuál debería ser el escenario para manejar la carga de archivos en el servidor? Estoy preguntándome o no, necesito buscar virus en el escenario de carga de fotos.

    
pregunta Yaniv 21.02.2012 - 19:01
fuente

2 respuestas

6

Si el archivo cargado está en un formato de imagen válido, .FromStream no lanzará una excepción, incluso si contiene un virus. Es decir, no hay ningún virus que lo controle.

Por otro lado, tampoco hay forma de que el virus se active, ya que el archivo en este punto solo se trata como bytes sin procesar.
(Es posible, si no es posible, que contenga un ataque dirigido directamente a la clase .NET Image , por ejemplo, a través de un desbordamiento de búfer. Sin embargo, además de ser muy improbable que exista tal vulnerabilidad, es incluso más improbable que alguien lo haga. vaya a la molestia de apuntar a un vector de nicho como).

Por lo tanto, en este punto usted está perfectamente (hablando de manera realista), pero tampoco tiene idea de si el archivo está limpio o no.

La verdadera pregunta es, ¿qué pasa con este archivo después?

¿Se guarda en el disco y se usa localmente?
En este caso, debe tener algún tipo de antivirus, búsquelo, aunque sea para su beneficio. Si cree en ellos, puede hacer que el motor AV local lo analice.

¿Se devuelve más tarde a otros usuarios y, por lo tanto, puede usar su sistema para propagarse? Definitivamente debería tener algún tipo de escaneo AV antes de guardar el archivo. Tenga en cuenta que esto puede no ser tan simple, ya que puede estar almacenando las imágenes en su base de datos (hay escáneres AV que pueden ser activados por API para un segmento de memoria, antes de que se guarden en un archivo) ... En cualquier caso, Estoy categóricamente en contra de ejecutar análisis antivirus directamente en sus sistemas reales. Sería mejor tener algún tipo de analizador AV de puerta de enlace, incluso antes de que llegue a su sistema.

Sin embargo, tenga en cuenta que cuando permite que usuarios aleatorios carguen archivos arbitrarios, la limpieza de virus no es lo más importante.

  • Por un lado, puedes ser abrumado, ya sea por archivos grandes o muchos más pequeños, por lo tanto, DoSing tu servidor.
  • Si el usuario puede especificar la ruta del archivo guardado, podría sobrescribir los archivos del sistema o cargar código ejecutable.
  • Si los atributos del archivo se guardan y luego se muestran (esto incluye el nombre del archivo y el nombre de usuario, pero también la descripción, el tipo de archivo, la ubicación, etc.), esto puede provocar otros ataques web estándar, como XSS o Inyección de SQL.
  • Haga una búsqueda aquí para GIFAR: estos son archivos que son archivos de imagen válidos y archivos JAR (archivo ejecutable de Java para el navegador) válidos. Por supuesto, estos no son un virus ...
  • Dependiendo del sistema, puede estar en riesgo de daños legales, si sus usuarios suben, por ejemplo. imágenes con derechos de autor, o por ejemplo pornografia infantil. Por supuesto, consulte con su abogado, ya que no soy uno.

TL; DR

En resumen, la aceptación de subidas arbitrarias lo lleva a una gran cantidad de problemas potenciales, y el análisis de virus no es lo peor.

    
respondido por el AviD 21.02.2012 - 20:22
fuente
4

Sí, la función está protegida de todos los desbordamientos de búfer conocidos, ya que Microsoft envía parches para el código base de .NET. Pero no es una solución completa.

Para obtener más información, consulte estos enlaces:

Aquí están las protecciones que emplearía al aceptar imágenes de fuentes no confiables :

  • Parchea el servidor: la clase de imagen es parte del marco .NET, siempre que estés en un marco compatible, MSFT evitará los desbordamientos de búfer.

  • Administre la ArgumentException de esta clase, ya que los intentos de cargar imágenes que no son imágenes lanzará una excepción. Puede obtener una advertencia temprana de intentos de "pirateo" con esta excepción.

  • Comprueba la extensión y el nombre de la imagen

  • No permita que el usuario especifique el directorio (o lo controle firmemente si lo hace)

  • Comprueba el tipo de contenido con la extensión.

  • Ejecute un comprobador de virus en la imagen (por ejemplo, VirusTotal )

  • Use el encabezado X-Content-Type-Options : Nosniff ( more info ) para proteger de los ataques de estilo GIFR .

  • No mostrar metadatos de imágenes a los usuarios finales. Herramientas como Exiv2 permiten ver y editar datos que no son de confianza.

  • Límite de tamaño: ajuste la clase Stream y permita que corte los intentos de cargar archivos grandes. Si está utilizando ASP.NET, por defecto, el componente del lado del servidor guarda primero todos los datos en la RAM. Evite el agotamiento de la memoria DoS utilizando un HTTPHandler que guarda directamente en el disco.

  • Use un dominio DNS separado para servir imágenes ( más información )

  • Convierta todas las imágenes cargadas a BMP, luego a un formato común (PNG, etc.) ( más información )

  • Asegúrese de que el área de preparación de la conversión mencionada anteriormente no sea accesible para el público

  • Inyecte la imagen con ruido ( más información )

respondido por el random65537 21.02.2012 - 19:29
fuente

Lea otras preguntas en las etiquetas