Skip to main content

V4.2.1 Operation Level Access Control

Requirement:#

Verify that sensitive data and APIs are protected against Insecure Direct Object Reference (IDOR) attacks targeting creation, reading, updating and deletion of records, such as creating or updating someone else's record, viewing everyone's records, or deleting all records.

Explanation:#

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмы Π½Π΅ ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ записи Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡƒΡ‚Π΅ΠΌ измСнСния значСния ΠΊΠ»ΡŽΡ‡Π°, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅.

Remediation:#

Π’ΠΎΡ‚ нСсколько шагов для устранСния Π°Ρ‚Π°ΠΊ Insecure Direct Object Reference (IDOR):

  • Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ: ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π΅ΡΡ‚ΡŒ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для доступа ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ API.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π²Π²ΠΎΠ΄Π°: провСряйтС Π²Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ нСсанкционированный доступ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ API. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈ Π΄Π»ΠΈΠ½Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ находятся Π² ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅.
  • Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…: ΡˆΠΈΡ„Ρ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… сохранСниСм ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ. Π­Ρ‚ΠΎ затрудняСт доступ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ° ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ, Ссли ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ нСсанкционированный доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ систСмС.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹: вмСсто ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² для записСй ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π»Π΅Π³ΠΊΠΎ ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ услоТняСт Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΡƒ доступ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ API, угадывая ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.
  • ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ использования API: отслСТивайтС использованиС API ΠΈ Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² API. Π­Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° нСсанкционированный доступ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ API.
  • РСгулярно ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΎΡ†Π΅Π½ΠΊΠΈ бСзопасности: рСгулярно ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΎΡ†Π΅Π½ΠΊΠΈ бСзопасности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ уязвимости ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ…, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ смогут ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. ΠžΠ±ΡƒΡ‡Π°ΠΉΡ‚Π΅ сотрудников: ΠΎΠ±ΡƒΡ‡Π°ΠΉΡ‚Π΅ сотрудников ваТности бСзопасности ΠΈ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Ρ‹ бСзопасности ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ….Β 

Π­Ρ‚ΠΈ шаги ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ API-интСрфСйсы ΠΎΡ‚ Π°Ρ‚Π°ΠΊ с нСбСзопасной прямой ссылкой Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (IDOR), Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π±Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° послСдними рСкомСндациями ΠΏΠΎ бСзопасности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½Π° Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ шаги исправлСния:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ IDOR-Π°Ρ‚Ρ‚Π°ΠΊ
import hashlib
import random
def generate_random_id():
"""Generate a randomized ID for a record."""
random_bytes = str(random.getrandbits(256)).encode()
return hashlib.sha256(random_bytes).hexdigest()
def create_record(data, user_id):
"""Create a new record for the given data."""
# Check that the user has permission to create a record
if not has_permission(user_id, 'create_record'):
return "Permission denied."
# Validate the input data
if not validate_input(data):
return "Invalid input data."
# Encrypt the sensitive data before storing it
encrypted_data = encrypt_data(data)
# Use a randomized ID for the record
record_id = generate_random_id()
# Store the record in the database
store_record(record_id, encrypted_data)
def view_record(record_id, user_id):
"""View the record with the given ID."""
# Check that the user has permission to view the record
if not has_permission(user_id, 'view_record'):
return "Permission denied."
# Get the encrypted data for the record
encrypted_data = get_record(record_id)
# Decrypt the data and return it
return decrypt_data(encrypted_data)
def update_record(record_id, data, user_id):
"""Update the record with the given ID."""
# Check that the user has permission to update the record
if not has_permission(user_id, 'update_record'):
return "Permission denied."
# Validate the input data
if not validate_input(data):
return "Invalid input data."
# Encrypt the sensitive data before updating it
encrypted_data = encrypt_data(data)
# Update the record in the database
update_record(record_id, encrypted_data)
def delete_record(record_id, user_id):
"""Delete the record with the given ID."""
# Check that the user has permission to delete the record
if not has_permission(user_id, 'delete_record'):
return "Permission denied."
# Delete the record from the database
delete_record(record_id)

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π²Π²ΠΎΠ΄Π°, ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° использования API. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ has_permission, validate_input, encrypt_data, decrypt_data, store_record, get_record, update_record ΠΈ delete_record Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² соотвСтствии с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ трСбованиями вашСго прилоТСния.

Additional:#

https://cwe.mitre.org/data/definitions/639.html