Skip to main content

V3.2.4 Session Binding

Requirement:#

Verify that session tokens are generated using approved cryptographic algorithms. (C6)

Explanation:#

Cryptographic Security: ГСнСрация сСссионных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… аспСктов бСзопасности Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. БСссионныС Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π²ΠΎ врСмя ΠΈΡ… взаимодСйствия с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Для прСдотвращСния нСсанкционированного доступа ΠΈ Π°Ρ‚Π°ΠΊ, связанных с сСссиями, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ с использованиСм ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… криптографичСских Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Approved Cryptographic Algorithms: Π’ этом Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΈ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ удСляСтся использованию "ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ…" криптографичСских Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². ΠžΠ΄ΠΎΠ±Ρ€Π΅Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ - это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ всСсторонний Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°Π½Π½Ρ‹Π΅ бСзопасными сообщСством спСциалистов ΠΏΠΎ бСзопасности ΠΈ организациями, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌΠΈΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ отраслСвых стандартов. ИспользованиС ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сниТаСт риск ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… уязвимостСй ΠΈ обСспСчиваСт Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ сСссионных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ².Β 

1 Hash Functions:

  • SHA-256 (Secure Hash Algorithm 256-bit)
  • SHA-3 (Secure Hash Algorithm 3)

2 Key Derivation Functions:

  • PBKDF2 (Password-Based Key Derivation Function 2)
  • bcrypt (Adaptive Password Hashing algorithm)
  • scrypt (Memory-hard function)

3 Encryption Algorithms:

  • AES (Advanced Encryption Standard) 256 bits
  • RSA (Rivest–Shamir–Adleman) 2048 bits

4 Random Number Generators:

  • Cryptographically Secure Pseudorandom Number Generators (CSPRNG), such as those provided by the operating system or cryptographic libraries.

Avoiding Weak Algorithms: Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ криптографичСских Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ слабыми ΠΈΠ»ΠΈ уязвимыми. Π‘Π»Π°Π±Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ Π°Ρ‚Π°ΠΊΠ°ΠΌ, ΠΊΠ°ΠΊ brute force, cryptographic collisions ΠΈΠ»ΠΈ key recovery. ИспользованиС Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ…, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² обСспСчиваСт высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ бСзопасности сСссионных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ ΠΈΡ… ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ извСстным Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌ Π°Ρ‚Π°ΠΊ

  1. Password Hashing:Β MD5 or SHA-1 for storing user passwords
  2. Symmetric Encryption:Β DES (Data Encryption Standard) or 3DES (Triple DES)
  3. Asymmetric Encryption: RSA-512 or RSA-1024
  4. Hash Functions: MD5 or SHA-1
  5. Key Exchange:Diffie-Hellman with small key sizes
  6. Random Number Generators: Predictable random number generators
  7. Custom Cryptographic Algorithms:Β Β custom cryptographic algorithms

Randomness and Entropy: БСссионныС Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с большим ΡƒΠΏΠΎΡ€ΠΎΠΌ Π½Π° ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΠ½Ρ‚Ρ€ΠΎΠΏΠΈΡŽ. Π’ΠΎΠΊΠ΅Π½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ нСпрСдсказуСмыми ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. Высокая энтропия Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ большой Π½Π°Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ затрудняСт ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ ΠΈΠ»ΠΈ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅.

Length and Complexity: Π”Π»ΠΈΠ½Π° ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сСссионных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ³Ρ€Π°ΡŽΡ‚ Ρ€ΠΎΠ»ΡŒ Π² обСспСчСнии ΠΈΡ… бСзопасности. Π‘ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ бСзопасности, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ количСство Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ растСт ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Π»ΠΈΠ½Ρ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, использованиС Π² Ρ‚ΠΎΠΊΠ΅Π½Π΅ сочСтания Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… символов ΠΈ Π·Π½Π°ΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Ρ‰Π΅ большС ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ.

Secure Implementation: Помимо использования ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², рСализация криптографичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ бСзопасной. Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сСссионных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π°Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ сСбя ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ΠΌ криптографичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. РСализация собствСнных криптографичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ появлСнию уязвимостСй ΠΈ ослаблСнию ΠΎΠ±Ρ‰Π΅ΠΉ бСзопасности Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ².

Remediation:#

Π§Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ сСанса Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с использованиСм ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… криптографичСских Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ бСзопасный Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ AES-256 ΠΈΠ»ΠΈ SHA-256. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Β  Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сСссионного Ρ‚ΠΎΠΊΠ΅Π½Π° Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ…ΡΡˆ-функция SHA-256.

 УстановитС Flask ΠΈ криптографичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΒ 

pip install Flask cryptography
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Β  Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сСссионного Ρ‚ΠΎΠΊΠ΅Π½Π° Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ…ΡΡˆ-функция SHA-256
import secrets
import hashlib
from flask import Flask, request, session
app = Flask(__name__)
app.secret_key = secrets.token_hex(16) # Replace with a strong secret key for production
@app.route('/login', methods=['POST'])
def login():
# Assuming you have a login mechanism that authenticates users
# After successful authentication, generate a session token and store it in the session
user_id = 'user123' # Replace with the actual user identifier obtained from authentication
session_token = generate_session_token(user_id)
session['session_token'] = session_token
return 'Login successful!'
def generate_session_token(user_id):
# Generate a cryptographically secure random token
random_token = secrets.token_hex(32)
# Combine the user_id and random_token and hash it using SHA-256
session_token = hashlib.sha256((user_id + random_token).encode('utf-8')).hexdigest()
return session_token
@app.route('/protected_data')
def protected_data():
# Check if the session exists and validate the session token
if 'session_token' in session:
user_id = 'user123' # Replace with the actual user identifier
expected_session_token = generate_session_token(user_id)
if session['session_token'] == expected_session_token:
return f'Welcome, User ID: {user_id}. This is protected data!'
else:
return 'Unauthorized access. Please login first.'
else:
return 'Unauthorized access. Please login first.'
@app.route('/logout')
def logout():
# Clear the session on logout to terminate the user's session
session.clear()
return 'Logged out successfully.'
if __name__ == '__main__':
app.run(debug=True)

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ secrets.token_hex() ΠΈΠ· модуля secrets для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ криптографичСски Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ случайного сСссионного ΠΊΠ»ΡŽΡ‡Π° ΠΈ объСдинСния Π΅Π³ΠΎ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π—Π°Ρ‚Π΅ΠΌ эта комбинация Ρ…Π΅ΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SHA-256 для получСния Ρ‚ΠΎΠΊΠ΅Π½Π° сСссии. Π’ΠΎΠΊΠ΅Π½ хранится Π² сСссии, ΠΈ ΠΏΡ€ΠΈ доступС ΠΊ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ происходит Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ бСзопасный Ρ‚ΠΎΠΊΠ΅Π½ сСанса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Node.js ΠΈ криптомодуля:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ бСзопасного Ρ‚ΠΎΠΊΠ΅Π½Π° сСанса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Node.js ΠΈ криптомодуля
const crypto = require('crypto');
function generateSessionToken() {
return crypto.randomBytes(32).toString('hex');
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ crypto.randomBytes() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ 32 случайных Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΡƒΡŽ строку. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ Π² Node.js Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ AES-256, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ считаСтся Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ.

Additional:#

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

https://proglib.io/p/veb-autentifikaciya-fayly-cookies-ili-tokeny-2021-08-14

https://proglib.io/p/json-tokens

https://tproger.ru/translations/user-session-security/

https://github.com/OWASP/wstg/blob/master/Testing_for_APIs.md#specific-testing--token-based-authentication