Rails 3 ActiveRecordStore подделка сессии_id - PullRequest
4 голосов
/ 08 июля 2011

Я участвую в совместной разработке простого веб-приложения на Rails 3.0.9 , и я понял, что возможен фальсификация session_id посредством вредоносного запроса. Помните о том, что это мое первое приложение RoR, поэтому я могу быть совершенно неправ в своих представлениях.

Для текущей функциональности приложения требуются сеансы, поэтому я обратился к хранилищу сеансов ActiveRecordStore, установил и начал тестирование в примитивных рабочих процессах. Я заметил, что Rails Framework создает cookie с именем _session_id и значением некоторой случайной хеш-подобной строки (в таблице DB SESSION эта строка соответствует столбцу session_id).

Если это значение в файле cookie изменяется, например, с помощью Firebug, идентификатор текущего сеанса меняется на значение, указанное в данных cookie (проверяется с помощью request.session_options[:id]), и это изменение распространяется в таблицу базы данных, создавая новую запись сеанса с вышеупомянутые параметры.

Хотя это и не влияет на переменные сеанса, идентификатор сеанса отличается от своего обычного вида, похожего на хеш, с измененным пользователем.

Вот вопрос - как такое поведение можно обнаружить или, предпочтительно, предотвратить?

1 Ответ

5 голосов
/ 08 июля 2011

Чтобы ответить на ваш вопрос, важно понять механизм генерации идентификатора сеанса. (из документов )

Идентификатор сеанса состоит из хэш-значения случайной строки. Случайная строка - это текущее время, случайное число от 0 до 1, номер идентификатора процесса интерпретатора Ruby (также в основном случайное число) и постоянная строка. В настоящее время невозможно использовать идентификаторы сессии Rails. На сегодняшний день MD5 бескомпромиссен, но имели место коллизии, поэтому теоретически возможно создать еще один входной текст с таким же значением хеш-функции. Но на сегодняшний день это никак не повлияло на безопасность.

Таким образом, идентификатор сеанса спроектирован так, чтобы его было трудно угадать криптографически. Злоумышленник может изменить session_id, но идея заключается в том, что он никогда не сможет угадать действительный сеанс.

Как это можно предотвратить?

Исходя из вышеизложенной логики, если вы сократите время истечения вашего сеанса, будет значительно меньше "живых" сессий. Таким образом, злоумышленнику еще сложнее случайным образом выбрать пригодный идентификатор.

Как можно обнаружить это поведение?

Самый простой способ - регистрировать все запросы с недействительными (не просроченными) идентификаторами сеанса. Если вы видите значительный поток таких запросов, возможно, кто-то пытается получить сеанс, который не является его собственным.

...