Vulnerabilidad en el marco de JavaScript popular (Angularjs)

17

Encontré un error que te permite escapar de la caja de arena de la plantilla de AngularJS. Angular es un lenguaje de plantillas basado en el bigote. Te permite poner expresiones que son evaluadas en tu html. Por ejemplo, {{1 + 1}} se representa en 2

El sandbox lo hace para que los usuarios no puedan acceder a las ventanas / constructores desde dentro de Angular dentro de las expresiones. No puedes hacer {{{} .constructor = ...}} por ejemplo. Esto se debe a que esas operaciones se consideran inseguras si el sitio también guarda plantillas desde la entrada del usuario. Abre el sitio a XSS.

Al revisar el código fuente, descubrí que hay una comprobación de obj === {} .constructor que se puede omitir.

Básicamente, todo se reduce a evitar esto:

if (obj) {
    if (obj === (0).constructor || obj === (false).constructor || obj ===     ''.constructor ||
      obj === {}.constructor || obj === [].constructor || obj ===     Function.constructor) {
      throw $parseMinErr('isecaf',
      'Assigning to a constructor is disallowed! Expression: {0}',      fullExpression);
    }
}

Pude superar esas comprobaciones ocultando mis llamadas de constructor dentro de otro objeto (literal de objeto o literal de matriz).

Como objeto literal:

{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert('Evaluated Object Literal')');}}

O como una matriz:

{{x = [''.constructor.prototype]; x[0].charAt=[].join; $eval('x=alert('Evaluated Array')');}}

¿Cómo pueden mejorarse las verificaciones anteriores para que estos casos fallen?

En su lugar, intenté cambiar los obj === {} .constructor cheques a instanceof y eso hace que los cheques funcionen, pero creo que puede introducir sus propios problemas de seguridad. Me gustaría enviar una solicitud de extracción, pero espero que otros investigadores de seguridad contribuyan a la conversación para que la caja de arena sea lo más fuerte posible.

Este es mi problema publicado en el proyecto Angular para referencia: enlace

Aquí hay material relacionado: enlace

Aquí hay un jsFiddle: enlace

    
pregunta ialexander 22.07.2016 - 01:49
fuente

1 respuesta

4

Usuarios angulares: Deje de guardar la entrada de usuario SIN SANTADO .

Tengo sentimientos encontrados sobre la respuesta a mi propia pregunta. A partir de la versión 1.6 de Angular, el equipo de Angular ha decidido eliminar el sandbox por completo. La caja de arena (aunque no es perfecta) le brindó al usuario un nivel superficial de protección contra sus propias elecciones al crear una aplicación Angular. La caja de arena era muy buena y cada vez mejor. Pero la caja de arena tampoco fue destinada a ser un límite de seguridad. Estaba allí para tratar de ayudar a hacer cumplir los principios de diseño limpio.

Con el sandbox desaparecido, el usuario angular se verá obligado a pensar en las implicaciones de seguridad de guardar información del usuario no confiable y sin saneamiento. Lo que personalmente creo que es una buena cosa. Si, y solo si, las personas se dan cuenta de que con la actualización podrían tener problemas de seguridad más amplios que anteriormente habían ignorado. Esperamos que esta publicación ayude a crear cierta conciencia cuando las personas están buscando 'seguridad angular 1.6'.

La respuesta a esta pregunta es que Angular ha eliminado el sandbox en la versión 1.6 para abordar el hecho de que los usuarios estaban usando el sandbox como un mecanismo de seguridad donde nunca se pretendió que fuera.

publicación del blog de eliminación de Angular Sandbox

    
respondido por el ialexander 11.10.2016 - 13:38
fuente

Lea otras preguntas en las etiquetas