V3.4.3 Cookie-based Session Management
Requirement:#
Verify that cookie-based session tokens utilize the 'SameSite' attribute to limit exposure to cross-site request forgery attacks. (C6)
Explanation:#
Атрибут 'SameSite' является важным элементом безопасности для HTTP cookies, который помогает предотвратить CSRF-атаки. CSRF-атаки возникают, когда злоумышленник обманывает браузер пользователя, заставляя его сделать запрос на сайт, где пользователь аутентифицирован. Поскольку браузер автоматически включает все соответствующие файлы cookie (включая сессионные) при каждом запросе к сайту, злоумышленник может воспользоваться этим поведением для выполнения несанкционированных действий от имени пользователя.
Например, можно представить ситуацию, когда аутентифицированный пользователь посещает вредоносный сайт. Вредоносный сайт содержит скрытые запросы (например, теги изображений, iframes), которые выполняют действия на целевом сайте, где пользователь аутентифицирован (например, перевод средств, изменение настроек счета). Поскольку браузер включает в эти скрытые запросы сессионный cookie пользователя, целевой сайт обрабатывает эти запросы так, как будто это законные действия пользователя.
Атрибут 'SameSite' помогает снизить этот риск, контролируя время отправки cookies браузером. Он имеет три возможных значения:
SameSite=None: Это значение позволяет отправлять cookies в межсайтовых контекстах, но только если запрос инициирован тем же сайтом. Это рекомендуемое значение для сессионных cookies, которые должны работать на разных сайтах (например, в Single Sign-On системах).
SameSite=Lax: Это значение позволяет отправлять cookies в межсайтовом контексте только при навигации по сайту верхнего уровня (т.е. при полной загрузке страницы). Оно не позволяет отправлять файлы cookie в запросах с сайтов третьих лиц, что помогает защититься от многих CSRF-атак.
SameSite=Strict: Это значение полностью предотвращает отправку cookie в межсайтовых контекстах. Cookie будет отправлен только в том случае, если запрос исходит с того же сайта. Данная настройка обеспечивает максимальный уровень защиты от CSRF-атак.
Для выполнения этого требования необходимо убедиться, что все сессионные токены на основе cookie (например, аутентификационные cookie) настроены с соответствующим атрибутом 'SameSite', чтобы ограничить их подверженность CSRF-атакам. В зависимости от требований приложения для минимизации риска CSRF-уязвимостей следует использовать либо 'SameSite=Lax', либо 'SameSite=Strict'.
Remediation:#
Step 1: Understand your application's requirements:
Определите, требует ли ваше приложение межсайтового доступа к cookies. Если в приложении используется Single Sign-On (SSO) или другая межсайтовая функциональность, то может потребоваться атрибут 'SameSite=None'. В противном случае для большинства случаев рекомендуется использовать атрибут 'SameSite=Lax' или 'SameSite=Strict'.
Step 2: Update your code to set the 'SameSite' attribute:
Внесите необходимые изменения в код для установки атрибута 'SameSite' при создании или изменении файлов cookie. Пример кода, приведенный в предыдущем ответе, демонстрирует, как установить атрибут 'SameSite' с помощью Flask. В зависимости от используемого веб-фреймворка или платформы реализация может отличаться, но концепция остается неизменной.
Step 3: Test with HTTPS:
Убедитесь, что ваше приложение работает по протоколу HTTPS. Атрибут 'SameSite' эффективен только в сочетании с защищенными соединениями (HTTPS). Убедитесь, что ваше приложение правильно настроено на использование SSL/TLS.
Step 4: Testing and Verification:
После обновления кода и настройки HTTPS тщательно протестируйте приложение, чтобы убедиться в следующем:
- Cookie Creation: Убедитесь, что файлы cookie создаются с установленным атрибутом 'SameSite'. Проверьте заголовки HTTP-response в инструментах разработчика браузера, чтобы убедиться в наличии атрибута 'SameSite' в заголовке 'Set-Cookie'.
- Same-Site Behavior: Убедитесь, что файлы cookie отправляются при запросах, исходящих с одного и того же сайта (например, при навигации внутри вашего приложения). Также проверьте, что файлы cookie не отправляются при межсайтовых запросах (например, при отправке запросов с другого сайта).
- Functionality Testing: Протестируйте критически важные функциональные возможности приложения, включая управление сессиями, аутентификацию пользователей и другие функции, работа которых зависит от cookies. Убедитесь, что атрибут 'SameSite' не нарушает ожидаемого поведения.
- Cross-Browser Testing: Протестируйте приложение в нескольких браузерах, чтобы убедиться в согласованном поведении атрибута 'SameSite'.
- Security Testing: Проведите тестирование безопасности, включая CSRF-тестирование, чтобы убедиться, что атрибут 'SameSite' эффективно предотвращает CSRF-атаки.
Пример кода на PHP:
Пример для Nginx
При таких настройках Nginx будет добавлять атрибут 'SameSite' к указанным cookies в заголовке Set-Cookie для ответов, соответствующих заданному блоку местоположения (в данном случае это запросы к файлам с расширениями .php или .html). Атрибут 'SameSite' гарантирует, что cookie-файлы не будут отправлены с межсайтовыми запросами, что помогает предотвратить CSRF-атаки.
Additional:#
https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite