¿Es aquí donde entra en juego un nonce?

2

Estoy revisando el sitio web que desarrolló un amigo y estaba buscando errores e inquietudes generales. Al revisar, noté que él es muy pesado en las llamadas ajax que usan JSON a una API RESTful que mantiene en un servidor diferente.

Si bien algunas llamadas son simplemente cosas que devuelven contenido, otras son más sensibles para obtener los atributos de un usuario autenticado. Para determinar la autenticación, pasa un ID de usuario (almacenado como GUID) en la llamada a la API. El código de ese servidor luego valida que este ID de usuario existe y actúa en consecuencia.

Fui a casa más tarde y tomé la misma llamada con su GUID y pude hacer todo tipo de cosas desagradables basadas en ese GUID. Dijo "bueno, ¿quién obtendría el GUID? Las posibilidades de adivinarlo no son probables, y todas mis llamadas se realizan a través de https".

En base a esto, ¿diría que las posibilidades de que alguien robe un GUID son bajas y está bien? ¿O debería estar manejando esto mejor? Quizás generando un nonce [desde el servidor en el que está la API] y luego transmitiéndolo también en las llamadas ajax para evitar la repetición como lo hice yo.

Tal vez me equivoque en algunas áreas, así que no me moleste, pero me encantaría saberlo.

¡Gracias!

    
pregunta NullHypothesis 10.03.2014 - 20:29
fuente

1 respuesta

3

Este es un diseño roto porque un GUID no debe ser secreto, sin embargo, según entiendo, proporciona un acceso idéntico al ingreso de su nombre de usuario y contraseña en el sitio web.

En teoría el diseño es sólido. Proteja el GUID como si fuera la contraseña del usuario y el caso cerrado.

En la práctica esto presenta muchos problemas.

Ejemplo: empiezo a trabajar en su empresa hoy. Me piden que escriba una función de búsqueda para que pueda encontrar a otros usuarios por dirección de correo electrónico. Probablemente codificaría los resultados de la búsqueda como una página que muestra una lista de enlaces a perfiles, que contiene algo como <a href="/user/${user.id}">${user.name}</a> . Al verificar qué columnas usar, descubro que el campo id se llama guid y el campo de nombre se llama fullName . Pruebo esto Funciona. Presiono el código.

Sin darme cuenta, acabo de filtrar el GUID del usuario que básicamente proporciona acceso completo a la cuenta. Ahora puede secuestrar cualquier cuenta de la que yo sepa la dirección de correo electrónico.

En este momento, el programador puede tener constantemente en mente que saber que el GUID proporciona acceso completo a la cuenta, pero en unos pocos meses ya no será algo en lo que piense mucho. Dado que es, supongo, la única forma única de apuntar a una cuenta, debe usarla en muchos lugares. Especialmente para la interacción del usuario, esto puede ser un problema (quizás los usuarios pueden formar compañías o grupos, compartir carpetas, lo que sea).

Una mejor manera sería separar la identificación y la autenticación. El GUID identifica un usuario, mientras que un token de seguridad autentica un usuario. Esto completa las partes de Identificación, Autenticación y Autorización (IAA) de un sistema de seguridad: el sistema decide la Autorización basada en la Identificación después de verificar la Autentificación. Por esta razón, además de las contraseñas, también necesitamos para completar un nombre de usuario en los sitios web. Usar solo uno u otro es generalmente una mala idea.

Todos los lugares donde se usa el GUID actualmente deben reemplazarse con los tokens de seguridad recién generados. Por ejemplo, una solicitud podría tener este aspecto: /API/2.0/doAction?GUID=${user.guid}&token=${some_security_token} . Tenga en cuenta que estos tokens deben ser completamente aleatorios (las probabilidades de adivinar deben estar alrededor de 1 en 2 ^ 128 ).

Hay muchas formas de generar estos tokens de seguridad. Muchos sitios web generan sesiones, pero también puede utilizar un campo de base de datos adicional. Cada vez que se realizan llamadas a la API, el usuario se autentica mediante este campo aleatorio. El campo debe llamarse algo que deje en claro que no se supone que otros deben saberlo.

Una vez más, en teoría no hace una gran diferencia en el diseño del sistema, ya sea que use un GUID aleatorio u otro campo generado aleatoriamente para la autenticación, pero en la práctica creo que sí previene muchos errores de seguridad grandes, especialmente cuando el sitio tiene algún tipo de interacción del usuario (pero también si no lo tiene, por ejemplo, una función de restablecimiento de contraseña puede exponer accidentalmente el GUID después de ingresar un nombre de usuario o una dirección de correo electrónico). Simplemente reduce el número de posibilidades de ataque.

    
respondido por el Luc 10.03.2014 - 21:28
fuente

Lea otras preguntas en las etiquetas