¿Es seguro almacenar y reproducir los tipos mime proporcionados por el usuario?

19

Si un usuario carga un archivo pero modifica la solicitud configurando el tipo mime en algo arbitrario, como "superdangerous / blackhatstuff", es seguro para mí enviar el mismo tipo mime a otro usuario más tarde en?

I.e. otro usuario descarga el mismo archivo y configuro el tipo MIME en "superdangerous / blackhatstuff", ¿es posible configurar el tipo mime en algo potencialmente peligroso? Debido a que son datos proporcionados por el usuario, tengo la sensación de que no es una buena idea almacenar y reproducir sin algún tipo de desinfección. (Por supuesto, estoy limpiando la consulta antes de almacenar el tipo mime, por lo que no me preocupan los ataques de inyección SQL a través del tipo mime).

Estoy utilizando clam AV para escanear los archivos cargados, lo que espero que detecte algunos de los ataques de olfateo del mimo, pero eso no es realmente lo que estoy preguntando aquí.

Si esto es, de hecho, peligroso, entonces, ¿qué es lo correcto a hacer? ¿No debería especificar un tipo mime y dejar que el receptor lo adivine? Debería intentar hacer mi propio rastreo de mime (estoy usando PHP en Linux, que proporciona una API para la magia de archivos).

Editar: Más detalles

Déjame explicarte el propósito de esta característica. La aplicación en cuestión se utiliza como parte de un flujo de trabajo que requiere que se envíen para su revisión y aprobación varios tipos de artefactos, incluidos (entre otros) documentos de Word, hojas de cálculo, imágenes y archivos. Otros usuarios deberán poder descargar estos artefactos para poder verlos y tomar una decisión de aprobación.

Para evitar algunas infracciones obvias, tenemos listas negras en su lugar (como cargar un archivo PHP o Javascript) y estamos configurando la Disposición de contenido como "archivo adjunto; nombre de archivo = ...". Estamos ejecutando Clam AV en los archivos cargados como un saneamiento básico, ya que realmente no podemos imponer una lista blanca a nuestros usuarios. La aplicación se ejecuta en una intranet y requiere autenticación antes de poder acceder a cualquier cosa, y nuestros usuarios [en su mayoría] son de confianza.

De todos modos, el punto es que no estoy preguntando sobre la seguridad de almacenar archivos y permitir que los usuarios los descarguen. (Me doy cuenta de que es un gran vector de amenazas, pero no es la pregunta que estoy planteando). Realmente me preocupa más si es seguro reproducir un tipo mime proporcionado por el usuario, y si no, ¿cuál es la alternativa? ¿Para no especificar un tipo mime en absoluto?

    
pregunta Mark E. Haase 03.11.2011 - 21:35
fuente

4 respuestas

13

No, no debe responder el tipo MIME proporcionado por el usuario. El ataque más simple al que está exponiendo a sus usuarios sería cargar un archivo de texto / html con código Javascript arbitrario, por ejemplo. en elementos [script]. Los usuarios a los que se les proporcionó la URL del archivo cargado tendrían Javascript ejecutado, dando como resultado XSS . Esto puede ser mitigado de alguna manera al servir los archivos con el encabezado adjunto de Disposición de Tipo de Contenido, pero hay maneras de evitarlo.

Otro vector sería almacenar applets de Java o archivos Flash maliciosos y muchos otros archivos cuyo tipo MIME los hace relevantes para la seguridad web ( archivo de manifiesto offline HTML5 , crossdomain.xml, varios archivos ejecutables en el cliente - exe, vbs, ...).

Mientras estamos en ello, asegúrese de servir los archivos provistos por el usuario desde un dominio separado de sus aplicaciones 'principales', para protegerlos de los ataques XSS ( la misma política de origen los detendrá si los archivos provienen de un dominio diferente).

    
respondido por el Krzysztof Kotowicz 04.11.2011 - 00:10
fuente
10

La respuesta corta: No es seguro. Permitir que el usuario especifique el tipo MIME y el contenido del archivo es un agujero XSS autoinfligido.

Un usuario malicioso Mallory podría especificar el tipo de texto MIME / html y proporcionar un documento HTML que contenga Javascript malicioso. Cuando le entregas ese documento a otro usuario Alice, el navegador de Alice ejecutará el Javascript malicioso. El JavaScript malicioso podría robar las cookies de la sesión de Alice, la contraseña de Alice para este sitio y todos los datos de Alice en este sitio, o podría alterar el contenido que Alice ve en este sitio.

Entonces, no, no es seguro.

Editar (11/4): veo que editó su pregunta para preguntar qué debe hacer. Esta es una pregunta compleja, pero permítame darle algunas estrategias básicas para defenderse contra esta amenaza:

  • Opción 1: No hay contenido proporcionado por el usuario. No hospede contenido proporcionado por el usuario. Entonces no tiene que preocuparse por este problema.

  • Opción 2: Permitir solo los tipos MIME incluidos en la lista blanca. Permitir que el usuario cargue datos y especificar un tipo MIME, pero solo si el tipo MIME proporcionado por el usuario está en una lista blanca de conocidos Tipos MIME seguros que no pueden desencadenar la ejecución de código malicioso. Por ejemplo, text/plain y image/jpeg son generalmente seguros, si aplica las defensas adecuadas contra los ataques de detección de contenido y, por lo tanto, podría incluirse en la lista blanca. text/html y application/x-shockwave-flash no son seguros y no deben incluirse en la lista blanca.

  • Opción 3: usar un dominio diferente. sirva el contenido subido por el usuario desde un dominio diferente. Asegúrese de que el dominio solo aloje contenido enviado por usuarios que no sea sensible a la seguridad. No aloje ninguno de sus propios materiales en ese sitio. Luego, la política del mismo origen del navegador aislará los ataques: un archivo cargado malintencionado puede atacar otro contenido subido por el usuario en ese dominio, pero no robar contraseñas / cookies de sesión / etc. desde su sitio principal.

respondido por el D.W. 04.11.2011 - 01:58
fuente
1
  

¿es seguro para mí enviar el mismo tipo de mime a otro usuario más adelante?

Voy a arriesgar mi brazo y decir que sí, pero es posible que tengas que parar si no funciona.

En este caso, un entorno cerrado con una mayoría de usuarios de confianza, listas blancas o tipos de MIME de subidas de lista agregará un poco de sobrecarga o ineficiencia a algún porcentaje de su base de usuarios. Cuantos más usuarios, más probable es que tengan algún formato que no hayas considerado. Si el formato de archivo de un usuario no está en su lista, entonces tendrá que hacer una excepción, modificar su lista blanca o necesitarán convertir el archivo a un formato diferente. Su trabajo y su costo.

Ha pensado en el problema y ha mitigado algo con el análisis antivirus. Esta mitigación no es suficiente. Deberá asegurarse de hacer una copia de respaldo de su máquina y, si por alguna razón, la máquina se apaga, restaure el servicio perdido de manera oportuna. Además, debe supervisar qué hacen los usuarios con el tipo MIME y, si se abusa o se convierte en un problema, debe activar la lista blanca.

Esto básicamente se reduce a que usted proporcione a los usuarios lo que necesitan y, si es necesario, los proteja unos de otros y ellos mismos. Dependiendo de quiénes sean sus usuarios, es posible que incluso desee señalar el problema y avisarles que los estará observando. Algo parecido a lo siguiente: "Hola a todos, el nuevo servidor de revisión tiene una versión 192.168.0.240. Puede enviar el formato de archivo que desee, lo cual es un poco riesgoso, pero registraré y revisaré las subidas".

    
respondido por el this.josh 09.11.2011 - 02:48
fuente
0

Bueno, devolver el tipo de contenido no modificado de un usuario podría terminar con el envío de contenido del tipo "terceros reglas / heil-hitler", lo que podría hacer que lo demanden y / o se burlen de él en algunos círculos. con un sentido del humor bajo / extraño (como la mitad de la tierra que se encuentra entre los océanos Atlántico Norte y Pacífico Norte).

Supongo que si desea devolver un tipo de contenido especificado por el usuario, es porque realmente desea devolver a un usuario un archivo que fue cargado por otro usuario, que Ya es toda una lata de gusanos. Y por "can" quiero decir "tanque de 20 galones".

Puede consolarse con la idea de que los servidores de correo electrónico lo hacen constantemente: cada correo electrónico puede tener archivos adjuntos con muchos tipos de contenido de los que el servidor de correo electrónico no tiene idea. Históricamente, esto ha implicado una gran cantidad de problemas de seguridad con los agentes de correo que, al recibir un archivo etiquetado como "ejecutable", encontró que era adecuado reaccionar con: "¿un ejecutable? ¡Genial, ejecutémoslo automáticamente!".

Si sus abogados no le permiten tomar el camino de "no es culpa mía", querrá desinfectar completamente el contenido del archivo, lo que necesariamente implica conocer el tipo de archivo, lo que implica automáticamente saber qué tipo de contenido es apropiado. Por lo tanto, la cuestión de dejar que el tipo de contenido especificado por el usuario pase por no debería ser relevante. Si es así, entonces hay algo sospechoso en su proceso de saneamiento.

    
respondido por el Tom Leek 03.11.2011 - 22:15
fuente

Lea otras preguntas en las etiquetas