¿Qué hacer con respecto a la vulnerabilidad en un producto SaaS que compro?

1

Trabajo para una universidad, donde formo parte del equipo responsable de integrar un Sistema de Gestión de Aprendizaje SaaS (por ejemplo: Moodle, Canvas) con el resto de los sistemas de la universidad.

Hace dos meses, identifiqué un ataque CSRF, disponible para cualquier persona que pueda agregar materiales del curso al sistema (en su mayoría profesores, pero también a otros profesores académicos y tutores). El problema es que los materiales del curso pueden contener javascript y cualquier usuario administrador que vea los materiales del curso (por ejemplo, en respuesta a una solicitud de soporte) ejecutará el javascript. Como el sistema ahora cuenta con una API REST (¡documentada públicamente!), Es posible que dicho javascript, entre otras cosas, haga que cualquier usuario sea un administrador del sistema. En particular, el sitio web utiliza la API REST en todo momento, lo que significa que javascript debe poder realizar llamadas a la API. He desarrollado demostraciones de explotación funcional, por lo que estoy seguro de que funciona y de lo fácil que es hacerlo.

Se lo informé al proveedor, y su respuesta inmediata fue: 'Los profesores son usuarios de confianza, esto funciona como está diseñado'. A lo que mi respuesta furiosa fue "No confío en que los profesores sean administradores de sistemas". De acuerdo con una consulta de base de datos simple, tenemos unos ~ 4000 usuarios en el sistema que podrían cargar materiales de javascript, de un total de ~ 50000 usuarios. Dos meses después, aún siguen con su respuesta original.

Estoy un poco preocupado por el sistema de mi propia institución: implementé algunos scripts de monitoreo externos para decirme si aparecen administradores inesperados y tenemos copias de seguridad fuera de línea, que es casi todo lo que puedo hacer. Sin embargo, también me molesta que este exploit afecte a todas las instalaciones de este tipo en todo el mundo, y es un sistema comúnmente ejecutado (probablemente > 1000 instancias).

Como esto es SaaS, no tenemos suficiente acceso al sistema para poder bloquearlo nosotros mismos.

Tengo un grupo de preguntas relacionadas:

  1. ¿Este ataque es aceptable o, al menos, común entre los sistemas de grandes empresas?
  2. Creo que envolver el contenido generado por el usuario en un iframe con el atributo sandbox bloquearía este ataque (siempre que los administradores usen navegadores actualizados), utilizando CORS para evitar solicitudes a la API REST. ¿Es esto seguro? ¿De lo contrario es posible hacer seguro el javascript subido por el usuario?
  3. Si el proveedor se niega a arreglarlo, ¿cuáles son mis próximos movimientos? ¿Se recomienda la divulgación pública, dado que es bastante fácil de explotar una vez que se conoce?

EDIT : para responder a los comentarios:

Admito que estoy un poco confuso sobre la diferencia entre csrf y xss, a pesar de leer artículos sobre el mismo. Por esta definición es XSS en el sentido de que 'ejecuta de alguna manera un script' , pero es CSRF en el sentido de que tiene que 'usar una sesión / cookie ya registrada de la víctima'. Además, el token es el token que es clave para el exploit.

Aquí hay algunos detalles más sobre cómo funciona la explotación / mitigación, por (2). Aunque tienes razón; Esto realmente debería ser una pregunta separada.

El ataque consiste en incluir una solicitud fetch en el javascript proporcionado que realiza una solicitud PATCH REST contra la API apropiada, en cuyo caso la cookie de la víctima se usa como autenticación para la API. Las solicitudes que no son GET requieren un encabezado personalizado (un token 'xsrf'), pero es posible que el javascript proporcionado raspe ese token de otra página. En cuanto a la mitigación propuesta: los contenidos del curso, incluidos todos los javascript proporcionados por el usuario, están actualmente envueltos en un solo div . Propongo reemplazar el div con un iframe que recupera los contenidos del usuario por separado (o usa un srcdoc ), y tiene un atributo de caja de arena sin el indicador allow-same-origin . Eso significaría que la secuencia de comandos no tendría acceso a la cookie de autenticación y, de todos modos, no podría realizar solicitudes de recuperación a la API debido a CORS.

    
pregunta Amanda Ellaway 28.11.2018 - 02:04
fuente

2 respuestas

1
  

¿Este ataque es aceptable, o al menos común entre los sistemas de grandes empresas?

No, esto no es aceptable en absoluto. Y espero que no sea común.

  

Creo que envolver el contenido generado por el usuario en un iframe con el atributo sandbox bloquearía este ataque (siempre que los administradores utilicen navegadores actualizados), utilizando CORS para evitar solicitudes a la API REST. ¿Es esto seguro?

En teoría, un iframe completamente aislado podría ayudar. Pero, como señala, el soporte para el atributo sandbox no es perfecto . Solo se necesita un administrador con un navegador antiguo para que seas propietario.

  

¿De lo contrario es posible hacer seguro el javascript subido por el usuario?

Podrías echar un vistazo a cómo los sitios como JS Fiddle resuelven este problema. Hacen eco del contenido generado por el usuario desde un dominio diferente, lo que permite aprovechar la SOP de los navegadores para su protección.

Pero si está comprando SaaS, no debería ser su función solucionar este problema.

  

Si el proveedor se niega a arreglarlo, ¿cuáles son mis próximos movimientos? ¿Se recomienda la divulgación pública, dado que es bastante fácil de explotar una vez que se conoce?

En su papel como cliente, le recomendaría que consulte a los abogados del caso. Si su contrato es bueno, la compañía que entrega el sistema lo está incumpliendo. Si está pagando por un producto con diferentes niveles de permiso, debe realizar una entrega. Actualmente, no lo son.

En su rol de investigador que encontró una vulnerabilidad de seguridad, recomendaría divulgación responsable . Entre otras cosas, debe darle al proveedor una fecha límite clara antes de que divulgue.

  

Admito que estoy un poco confuso sobre la diferencia entre csrf y xss.

Como han señalado otros, lo que describe se almacena XSS y no CSRF.

    
respondido por el Anders 28.11.2018 - 16:41
fuente
0

Se han realizado discusiones similares aquí ( Mi antiguo trabajo tiene vulnerabilidades de seguridad masivas en su producto, pero no les importa ) y here ( ¿Cómo divulgar la vulnerabilidad de la seguridad de manera ética? ) sobre la divulgación ética de vulnerabilidades de seguridad.

  

Los profesores son usuarios de confianza, esto funciona según lo diseñado.

¿Ellos entendieron completamente tu ataque? Mi opinión es tratar de convencerlos sobre la importancia de la vulnerabilidad que encontraste. Si continúan ignorándote, deberías divulgarlo públicamente como se describe en los enlaces anteriores.

    
respondido por el jimouris 29.11.2018 - 10:23
fuente

Lea otras preguntas en las etiquetas