Descarga segura del contenido enviado por el usuario

1

TL; DR Guardamos la carga útil de solicitud y el encabezado Content-Type en una base de datos. Debe ser JSON o CSV pero puede tener un formato incorrecto. Los usuarios de soporte descargan la carga útil de solicitud como un archivo en sus navegadores utilizando Content-Disposition: attachment . Intentamos agregar una extensión de archivo de .json o, la predeterminada, '.csv'.

¿Cómo pueden los usuarios de soporte descargar este archivo de forma segura cuando podría contener absolutamente cualquier cosa? Estoy menos preocupado por los ataques tipo ZIP, pero hay más spyware, ransomware, etc., etc.

Background

Tenemos una API REST que admite tipos de contenido JSON y CSV.

La API está protegida con un certificado de cliente único para cada usuario.

Por razones de arbitraje debemos mantener un registro de auditoría del contenido exacto enviado al servicio, lo hacemos almacenando los bytes directamente en la base de datos junto con el encabezado de tipo de contenido y algunos otros campos de la URL y el certificado del cliente. Todo esto, con la excepción del certificado, es una validación previa, ya que también necesitamos registrar los envíos no válidos.

Tenemos un equipo de soporte, una actividad muy importante para ellos es ayudar a los usuarios que no pueden enviar sus documentos debido a a) contenido mal formado o b) el contenido infringe alguna regla comercial.

Ahora ha llegado un requisito para permitir que nuestro equipo de soporte descargue la información de auditoría para que puedan tratar de reproducir el problema de los usuarios enviándolo a un sistema de prueba o simplemente mirando el contenido para detectar errores.

Si podemos detectar el tipo de contenido, proporcionaremos un enlace al archivo con una extensión .csv o .json.

El problema

Obviamente, esto está completamente abierto a XSS desde el punto de los campos no validados, pero eso se mitiga fácilmente al codificarlo correctamente para su visualización. Sin embargo, no veo cómo es posible para el archivo descargado.

Por ejemplo, presento una hoja de cálculo de Excel con Content-Type: text/csv , un usuario de soporte descarga el archivo y lo abre en Excel para ver el CSV y se le advierte que "la extensión del archivo no coincide con el contenido. ¿Quieren abrirlo de todos modos? ? " a lo que hacen clic en "sí" porque están tratando de averiguar por qué está mal formado y mi hoja de cálculo maliciosa está abierta.

Incluso si eliminamos el requisito de extensión de archivo, un usuario de soporte puede intentar abrirlo en Excel de todos modos, ya que se supone que el contenido es un CSV.

Solutions

No puedo pensar en ninguna solución robusta;

  • Primero, entrene a los usuarios de soporte técnico para abrir en el editor de texto sin formato, pero los usuarios son falibles)
  • Evite la descarga de contenido que no sean datos de caracteres, pero los datos de caracteres aún pueden ser un vector de ataque, es decir, un archivo .bat y no cumplen con los requisitos
  • Codifique el contenido y visualícelo en la pantalla para copiar / pegar, asegurándose así de que solo sea texto, los archivos podrían ser grandes y actualmente utilizan la transmisión desde DB a la corriente de salida para mantener bajo el gasto de memoria.
  • Confíe en nuestros usuarios y que ellos mantengan seguros sus certificados de cliente

¿Es solo que los requisitos siempre estarán en desacuerdo con la seguridad y no hay forma de descargar archivos enviados por el usuario de manera segura?

    
pregunta James 31.03.2016 - 18:02
fuente

3 respuestas

2

En mi humilde opinión, su problema clave es que no está validando el contenido que se está cargando. Ya que solo estamos hablando de JSON y CSV aquí, es trivial escribir código para validarlos. No detectará todos los problemas, pero obtendrá la mayoría de ellos. Y al menos puede decirle al usuario que realiza la carga que cometió un error en el momento de la carga, en lugar de decirle a un consumidor de contenido más tarde que no puede tener el contenido.

Como mínimo sugeriría validar el conjunto de caracteres y la estructura del archivo, y verificar que coincida con el tipo MIM enviado. Sin embargo, existe la complicación de que no todas las cosas que se consideran como CSV cumplen con RFC 4180, y RFC 4180 en realidad describe muchas variantes del formato de archivo CSV (en particular, cómo se representan los símbolos utilizados para los metadatos cuando ocurrir dentro de los datos).

Recomendaría encarecidamente no permitir que nadie descargue contenido que no haya sido verificado a través de su navegador. Como debería ser posible representar el contenido utilizando UTF-8 o UTF-16, es trivial crear una representación del contenido con los caracteres no compatibles reemplazados y mostrados en un PRE ... / Bloque PRE dentro de una página html (con las htmlentities traducidas también).

    
respondido por el symcbean 01.04.2016 - 18:05
fuente
1

Voy a asumir que sus trabajadores de soporte descargarán estos archivos utilizando un navegador web.

Si va a mostrar el archivo en línea en el navegador:

  1. Debes deshabilitar el rastreo de contenido. Un usuario malintencionado podría intentar cargar un script con un tipo de contenido falso, y algunos navegadores intentan "rastrear" el tipo de contenido real y ejecutarlo. Establezca el encabezado de respuesta X-Content-Type-Options: nosniff en su servidor

  2. Desea alojar el contenido del usuario en un nombre de dominio totalmente diferente al sitio que usa para obtenerlo. Por ejemplo, google utiliza googleusercontent.com para los datos cargados por el usuario para gmail.com. Esto evitaría que una carga maliciosa robe o sobrescriba sus cookies en su dominio

Si no:

  1. Configure su servidor para que envíe el archivo como un archivo adjunto, no en línea, de modo que no se pueda ejecutar un script malicioso en el navegador. Content-Disposition: attachment; filename="filename.csv" response header

  2. Si usa el navegador IE, puede usar un protocolo personalizado para forzar que el archivo se abra en una aplicación específica (por ejemplo, el Bloc de notas). Consulte enlace

Ambos:

  1. Puede usar bibliotecas en su servidor para validar que los documentos cargados están bien formados. Jackson para JSON y Super CSV para CSV con Java
respondido por el Neil McGuigan 31.03.2016 - 21:33
fuente
1

Según entiendo su pregunta, el problema real es:

  

Los usuarios pueden cargar bytes arbitrarios y luego engañar a mi personal de la mesa de ayuda para que abra esos datos como un archivo en Excel.

     

¿Qué pasaría si, por ejemplo, los bytes no contienen un CSV sino un archivo Excel con un virus de macro?

     

¿Qué puedo hacer?

Bueno. Usted podría <<>

  • no tienen Excel instalado en sus estaciones de trabajo
  • restringir la ejecución de macros
  • compruebe la verosimilitud en el servidor ("es este texto sin formato? ¿Es csv o json parsable?"), lo que produce un error.
  • a medida que se firmen los envíos, facture a su cliente que lo envió por todos los cortes que resulten de un abuso o ataque.
respondido por el Tobi Nary 31.03.2016 - 21:45
fuente

Lea otras preguntas en las etiquetas