Skip to main content

V3.2.3 Session Binding

Requirement:#

Verify the application only stores session tokens in the browser using secure methods such as appropriately secured cookies (see section 3.4) or HTML 5 session storage.

Explanation:#

Сессионные токены используются для сохранения состояния сессии пользователя на стороне сервера и позволяют пользователям взаимодействовать с приложением без необходимости повторной аутентификации при каждом действии. Безопасное хранение сессионных токенов очень важно для предотвращения несанкционированного доступа к учетной записи пользователя и защиты конфиденциальных данных.

Требование гласит, что приложение должно хранить сессионные токены только в браузере пользователя, используя безопасные методы, такие как:

Securely Secured Cookies: При использовании файлов cookie для хранения сессионных токенов они должны быть снабжены соответствующими атрибутами безопасности. Это включает в себя использование атрибута HttpOnly для предотвращения доступа клиентских скриптов к cookie, атрибута Secure для обеспечения передачи cookie только по защищенным HTTPS-соединениям и атрибута SameSite для защиты от cross-site request forgery (CSRF) атак.

HTML5 Session Storage: В HTML5 появилась функция "session storage", которая позволяет разработчикам хранить на стороне клиента данные, которые остаются доступными в течение текущего просмотра сессии. При использовании сессионного хранилища HTML5 для хранения сессионных токенов необходимо убедиться, что конфиденциальная информация не хранится в "local storage" (которое сохраняется во время сессий браузера), а ограничивается "session storage" (очищается при завершении сессии браузера).****

Remediation:#

Чтобы обеспечить безопасное хранение сессионных токенов в браузере, выполните следующие действия:


  • При использовании файлов cookie для хранения сессионных токенов обязательно устанавливайте атрибуты HttpOnly и Secure для повышения уровня безопасности.
  • Атрибут HttpOnly предотвращает доступ к cookie сценариев на стороне клиента, что снижает риск кражи сессионного токена в результате cross-site scripting (XSS) атак.
  • Атрибут Secure обеспечивает передачу файлов cookie только по защищенным HTTPS-соединениям, предотвращая перехват сессионных токенов по незашифрованным каналам.
  • Установите для атрибута SameSite значение Lax или Strict для защиты от атакой cross-site request forgery (CSRF).

  • Определите подходящее время истечения срока действия для сессионных токена cookie. Более короткое время истечения срока действия уменьшает возможность злоумышленников повторно использовать украденные токены.
  • Реализуйте механизм регенерации сессионных токенов по истечении определенного периода времени или при наступлении определенных событий безопасности (например, изменение привилегий пользователя, смена пароля).

**** 

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

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

  • Если для хранения сессионных токенов или другой конфиденциальной информации используется хранилище сеансов HTML5, убедитесь, что оно используется надлежащим образом, и отличите его от "local storage".
  • Регулярно очищайте сессионное хранилище, чтобы предотвратить сохранение данных за пределами текущего браузерного сессии.

  • Регулярно проводить тестирование системы безопасности, включая оценку уязвимостей, тестирование на проникновение и анализ кода, для выявления и устранения уязвимостей управления сессиями.****

  • Реализовать механизм безопасного выхода из системы, позволяющий аннулировать и отзывать токены сеансов при явном выходе пользователей из системы или при неактивности сеансов в течение определенного периода времени.****

  • Внедрите протоколирование и мониторинг для обнаружения подозрительной активности, связанной с управлением сессиями. Разработать план реагирования на инциденты для быстрого реагирования на возможные нарушения.

Пример сохранения сессионного токена в безопасном файле cookie с помощью Node.js и промежуточного программного обеспечения cookie-parser:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.post('/login', (req, res) => {
// Authenticate the user
const authenticated = authenticateUser(req.body.username, req.body.password);
if (authenticated) {
// Generate a new session token
const sessionToken = generateSessionToken();
// Store the session token in a cookie
res.cookie('sessionToken', sessionToken, {
httpOnly: true,
secure: true,
sameSite: 'strict'
});
res.send('Login successful');
} else {
res.send('Login failed');
}
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});

В этом примере метод res.cookie() используется для сохранения маркера сеанса в файле cookie. Для параметра httpOnly установлено значение true, чтобы предотвратить доступ к файлу cookie с помощью JavaScript, а для параметра secure установлено значение true, чтобы отправлять файл cookie только через соединения HTTPS. Для параметра sameSite установлено значение «строгий», чтобы предотвратить отправку файла cookie в межсайтовых запросах.

Пример на языке Python, демонстрирующий, как устанавливать и извлекать маркеры сеанса с помощью защищенных файлов cookie:

from flask import Flask, request, make_response
app = Flask(__name__)
# In a real-world application, use a more secure method to generate session tokens.
# For demonstration purposes, we'll use a simple hardcoded token.
SESSION_TOKEN = "my_session_token"
# Route to set the session token in a secure cookie.
@app.route("/set_session_token", methods=["GET"])
def set_session_token():
response = make_response("Session token set successfully.")
response.set_cookie("session_token", SESSION_TOKEN, secure=True, httponly=True, samesite="Lax")
return response
# Route to retrieve the session token from the secure cookie.
@app.route("/get_session_token", methods=["GET"])
def get_session_token():
session_token = request.cookies.get("session_token")
if session_token == SESSION_TOKEN:
return "Session token is valid."
else:
return "Invalid session token."
if __name__ == "__main__":
app.run(debug=True)

В этом примере мы используем веб-фреймворк Flask для создания простого веб-приложения с двумя маршрутами.  set_session_token устанавливает сессионный токен в защищенный cookie с атрибутами secure, httponly и samesite. get_session_token извлекает сессионный токен из защищенного cookie и проверяет его на соответствие жестко заданному сессионному токену (SESSION_TOKEN).

Additional:#

https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Secure_and_HttpOnly_cookies

https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html

https://owasp.org/www-community/vulnerabilities/Insufficient_Session-ID_Length