Mi cookie no cambia!


#1

Hola,
estoy utilizando restful_authentication en un proyecto. El problema es
que al hacer login 2 veces con el mismo usuario, el contenido de la
cookie que se genera es el mismo, con lo cual si algún usuario
malintencionado “econtrara por casualidad” dicha cookie podría operar
como usuario registrado en dicho proyecto.

He comprobado en otros proyectos y, siguiendo el mismo procedimiento, la
cookie generada es distinta, por lo que deduzco que debo tener algún
error.

He buceado bastante abajo en las tripas del problema este, pero supongo
que he pasado algo por alto. Seguramente sea alguna tontería pero no
samos con ella. Si alguien sabe como arreglar esto, agradezco toda la
ayuda :wink:

Gracias y un saludo


#2

A mi me paso algo parecido, quizá esto te ayude, pero no estoy seguro
de que sea el mismo problema por lo que comentas:

http://rails_security.lighthouseapp.com/projects/15332/tickets/40-rails-edge-and-passenger

Saludos!


#3

Mike W. dijo [Wed, Apr 15, 2009 at 12:17:33PM +0200]:

He buceado bastante abajo en las tripas del problema este, pero supongo
que he pasado algo por alto. Seguramente sea alguna tontería pero no
samos con ella. Si alguien sabe como arreglar esto, agradezco toda la
ayuda :wink:

La galleta no tiene por qué cambiar, porque la sesión subyacente no ha
cambiado - Una galleta es una identificación de un conjunto de
interacciones a lo largo del tiempo entre determinado navegador y
determinado cliente. La galleta es sólo la llave para una especie de
tabla (cuya implementación depende de cómo tienes configurada tu
aplicación), y los valores que le corresponden son los que cambiarán -
La sesión, por ejemplo, dejará de tener datos de determinado usuario y
tendrá ahora los de otro cuando sales y vuelves a entrar al sistema.

Las expiraciones por inactividad (y cuestiones similares) deben ser
verificadas en tus controladores (probablemente en
application_controller), no dependas de la expiración de la galleta.

Respecto a tu temor de que alguien “encuentre” galletas ajenas,
tampoco es algo a lo que debes prestar demasiada atención - Estas son
generads por funciones criptográficas óptimas para estas necesidades;
desconozco exactamente cuales, pero me aventuro a decir que es el SHA1
o MD5 de algún valor aleatorio - Esto asegura un espacio de búsqueda
de 2^32 (o lo que es lo mismo, de 1:4,294,967,296), con una
distribución homogénea e impredecible.

Saludos,


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#4

Hola,

A mi me paso algo parecido, quizá esto te ayude, pero no estoy seguro
de que sea el mismo problema por lo que comentas:

http://rails_security.lighthouseapp.com/projects/15332/tickets/40-rails-edge-and-passenger

Me temo que ese no es el problema que tengo. Yo puedo logearme
correctamente, pero la cookie generada para un usuario es siempre la
misma.

Gunnar W. wrote:

Las expiraciones por inactividad (y cuestiones similares) deben ser
verificadas en tus controladores (probablemente en
application_controller), no dependas de la expiración de la galleta.

No dependo de ella, ese es el problema. Yo hago log out, la cookie del
navegador se borra y la sesión se resetea. Cuando vuelvo a hacer log in,
la cookie generada es idéntica.

Respecto a tu temor de que alguien “encuentre” galletas ajenas,
tampoco es algo a lo que debes prestar demasiada atención - Estas son
generads por funciones criptográficas óptimas para estas necesidades;
desconozco exactamente cuales, pero me aventuro a decir que es el SHA1
o MD5 de algún valor aleatorio - Esto asegura un espacio de búsqueda
de 2^32 (o lo que es lo mismo, de 1:4,294,967,296), con una
distribución homogénea e impredecible.

No me preocupa que alguien se la encuentre, si no más bien que la
capturen y se la queden. Es un ataque básico que el comportamiento
normal de rails tiene solucionado, ya que la cookie generada por una
aplicación rails varía de un login a otro (excepto en el caso de mi
aplicación claro).

Gracias por responder :slight_smile: Sigo buscando.

Un saludo


#5

2009/4/15 Mike W. removed_email_address@domain.invalid:

estoy utilizando restful_authentication en un proyecto. El problema es
que al hacer login 2 veces con el mismo usuario, el contenido de la
cookie que se genera es el mismo, con lo cual si algún usuario
malintencionado “econtrara por casualidad” dicha cookie podría operar
como usuario registrado en dicho proyecto.

Es asi, si usas el cookie store el digest es funcion de los datos y el
secret. Si te incordia el tema creo que has de cambiar de session
store.


#6

Mike W. dijo [Wed, Apr 15, 2009 at 05:17:54PM +0200]:

Las expiraciones por inactividad (y cuestiones similares) deben ser
verificadas en tus controladores (probablemente en
application_controller), no dependas de la expiración de la galleta.

No dependo de ella, ese es el problema. Yo hago log out, la cookie del
navegador se borra y la sesión se resetea. Cuando vuelvo a hacer log in,
la cookie generada es idéntica.

Ok… Vamos de nuevo sobre de ello. ¿Cómo estás guardando las sesiones
de tu usuario? Te recomiendo fuertemente no usar directamente la
galleta (vía ActionController::Cookies), sino que la sesión (vía el
atributo «session», disponible desde tus controladores). Lo único que
debes indicar a la sesión es la llave con que debe identificar a su
galleta - En mi caso, tengo esto al principio de application.rb:

Pick a unique cookie name to distinguish our session data from

others’
session :session_key => ‘_comas_session_id’

Y respecto a la interacción de galletas, no tienen nada que ver con
los datos que guardan - Entré, salí del sistema un par de veces. La
galleta fue invariablemente:

Cookie: lang=es; _comas_session_id=cc2195274c62855b7968d0ba5fb9d119

Desde el navegador, borré la galleta. Repito el baile, y ahora hace:

Cookie: lang=es; _comas_session_id=e615b9d4b1e72e6a933d23cb7d70e1a1

Guardo mis sesiones en la base de datos - Mi config/environment.rb
tiene:

Use the database for sessions instead of the file system

(create the session table with ‘rake db:sessions:create’)

config.action_controller.session_store = :active_record_store
config.action_controller.session = {
:session_key => “_comas_session_id”,
:secret => “9ffb62fa7055a3f4009b824be282fc38” }

Si revisas en la BD, en la tabla ‘sessions’, la galleta es el
session_id. A cada solicitud (aún si es sólo un ‘reload’) se actualiza
el atributo ‘data’ - Y, claro, la longitud de ‘data’ crece conforme
hagas cosas que se guarden en la sesión.

No me preocupa que alguien se la encuentre, si no más bien que la
capturen y se la queden. Es un ataque básico que el comportamiento
normal de rails tiene solucionado, ya que la cookie generada por una
aplicación rails varía de un login a otro (excepto en el caso de mi
aplicación claro).

…La galleta no tiene por qué variar de un login a otro - Varía de un
navegador a otro. No guardas ninguna información relativa al usuario
en la galleta, sino que dentro del atributo ‘data’ de la sesión a la
que se refiere ésta. Y, sí, si yo entro como ‘gwolf’ veinte veces
desde computadoras diferentes, las veinte veces mi galleta debe ser
distinta. Lo que tú notaste, claro, es digno de alarma. La galleta no
debe ser calculada en función de tu usuario!

Saludos,


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#7

Xavier N. dijo [Thu, Apr 16, 2009 at 10:40:55PM +0200]:

2009/4/16 Gunnar W. removed_email_address@domain.invalid:

Y respecto a la interacción de galletas, no tienen nada que ver con
los datos que guardan

Depende.

En este thread se asumen cookie-based sessions que es el default en
Rails recientes.

…Y ahí tienes datos de sobra para saber que hay situaciones en que
no es lo conveniente :wink:


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#8

Hola, vayamos por partes:

Gunnar W. wrote:

Ok… Vamos de nuevo sobre de ello. ¿Cómo estás guardando las sesiones
de tu usuario? Te recomiendo fuertemente no usar directamente la
galleta (vía ActionController::Cookies), sino que la sesión (vía el
atributo «session», disponible desde tus controladores). Lo único que
debes indicar a la sesión es la llave con que debe identificar a su
galleta - En mi caso, tengo esto al principio de application.rb:

Pick a unique cookie name to distinguish our session data from

others’
session :session_key => ‘_comas_session_id’

Estoy usando el atributo session. También tengo un :session_key en
application.rb

Y respecto a la interacción de galletas, no tienen nada que ver con
los datos que guardan - Entré, salí del sistema un par de veces. La
galleta fue invariablemente:

Cookie: lang=es; _comas_session_id=cc2195274c62855b7968d0ba5fb9d119

Desde el navegador, borré la galleta. Repito el baile, y ahora hace:

Cookie: lang=es; _comas_session_id=e615b9d4b1e72e6a933d23cb7d70e1a1

Guardo mis sesiones en la base de datos - Mi config/environment.rb
tiene:

Use the database for sessions instead of the file system

(create the session table with ‘rake db:sessions:create’)

config.action_controller.session_store = :active_record_store
config.action_controller.session = {
:session_key => “_comas_session_id”,
:secret => “9ffb62fa7055a3f4009b824be282fc38” }

Si revisas en la BD, en la tabla ‘sessions’, la galleta es el
session_id. A cada solicitud (aún si es sólo un ‘reload’) se actualiza
el atributo ‘data’ - Y, claro, la longitud de ‘data’ crece conforme
hagas cosas que se guarden en la sesión.

No me he explicado bien. El problema es que el atributo ‘data’ no cambia
en mi caso. Ni al hacer reload, ni al borrar la cookie y entrar de
nuevo, ni al cerrar el navegador y abrirlo de nuevo ni al cambiar de
navegador. Lógicamente, si hago algún cambio a mano en ‘session’
(guardar el color favorito del usuario en la session) el campo data
cambia, pero la próxima vez que haga login y guarde de nuevo el
atributo, el contenido de ‘data’ volverá a ser el mismo que ahora.

Para más datos, he probado a usar tanto active_record_store (base de
datos) como la opción por defecto.

¿Alguna idea?

Un saludo


#9

Hola,
sigo peleándome con esto pero no llego a ninguna conclusión válida, ya
que el contenido de mi cookie sigue sin cambiar. ¿Alguna idea?

Gracias y un saludo


#10

2009/4/30 Mike W. removed_email_address@domain.invalid:

Hola,
sigo peleándome con esto pero no llego a ninguna conclusión válida, ya
que el contenido de mi cookie sigue sin cambiar. ¿Alguna idea?

De este thread, si alguna cosa ha de quedar es que esto depende del
storage.

Que storage estas usando.


#11

2009/4/16 Gunnar W. removed_email_address@domain.invalid:

Y respecto a la interacción de galletas, no tienen nada que ver con
los datos que guardan

Depende.

En este thread se asumen cookie-based sessions que es el default en
Rails recientes.


#12

2009/5/6 Mike W. removed_email_address@domain.invalid:

Estoy usando el storage por defecto de rails (CookieStore).

Con ese storage en efecto da lo mismo, en algun mensaje explique por
que sucede asi.

Probé con ActiveRecordStore, pero mi problema seguía siendo el mismo.

Seguramente te liarias con la prueba. Con ese storage el cliente
recibe un session ID que se genera aleatoriamente para cada nueva
sesion.


#13

Xavier N. wrote:

2009/4/30 Mike W. removed_email_address@domain.invalid:

Hola,
sigo peleándome con esto pero no llego a ninguna conclusión válida, ya
que el contenido de mi cookie sigue sin cambiar. ¿Alguna idea?

De este thread, si alguna cosa ha de quedar es que esto depende del
storage.

Que storage estas usando.

Estoy usando el storage por defecto de rails (CookieStore). Probé con
ActiveRecordStore, pero mi problema seguía siendo el mismo.

Un saludo