Кенни МакДермид

В Rails cookies.signed и cookies.encrypted — это отличный способ защитить файлы cookie от несанкционированного доступа на стороне клиента, но его следует использовать с осторожностью, поскольку значения могут быть скопированы между файлами cookie.

Фон печенья Rails

Подписанные файлы cookie были добавлены в Rails в версии 3.0.0. Файл cookie можно установить с помощью cookies.signed[:cookie_name] = 'value' , и в результате в браузере будет создан файл cookie в форме
InZhbHVlIg==-d6652a13105f05b9d165eb501e3a1eedfaaa4048.

Это значение состоит из двух частей. Перед -- находится значение в кодировке base64, и его может прочитать любой пользователь. Часть после -- представляет собой подпись, сгенерированную из секретного ключа приложения.

В Rails 4 добавлена ​​возможность создавать зашифрованные ключи. Они создаются с помощьюcookies.encrypted[:cookie_name])

Это также создает файл cookie -- в клиенте, за исключением того, что значения в кодировке base64 также зашифрованы, поэтому они не могут быть прочитаны пользователями.

Проблема

В обоих приведенных выше методах результирующие файлы cookie клиента содержат только значение без ссылки на имя. Это позволяет копировать подписанные данные между файлами cookie, потенциально создавая уязвимость в системе безопасности. Это также может позволить пользователям подписывать/шифровать произвольные данные, если ваше приложение устанавливает файл cookie с использованием пользовательских данных.

Кажется, об этой проблеме впервые сообщили Rails в проблеме, созданной Эммой Борханян в 2014 году, но я не смог найти ни кода, ни обсуждений по исправлению.

Влияние

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

Хотя эта проблема может позволить вам изменить или сгенерировать файл cookie сеанса, платформы аутентификации защищены от этого, также проверяя часть секрета пользователя перед принятием идентификатора сеанса.

Вывод

Хотя в настоящее время это не является распространенной ошибкой, скорее всего, это связано с тем, что защищенные файлы cookie не используются, а не с тем, что они используются правильно.

Чего не делать:

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

Первоначально опубликовано на www.immun.io 1 сентября 2015 г.