Skip to main content

V4.2.2 Operation Level Access Control

Requirement:#

Verify that the application or framework enforces a strong anti-CSRF mechanism to protect authenticated functionality, and effective anti-automation or anti-CSRF protects unauthenticated functionality.

Explanation:#

Веб-приложение не выполняет или не может в достаточной мере проверить, был ли правильно сформирован запрос пользователем, является ли он действительный и непротиворечивый.

Когда веб-сервер предназначен для получения запроса от клиента без какого-либо механизма проверки того, что он был отправлен намеренно, злоумышленник может обманом заставить клиента сделать непреднамеренный запрос к веб-серверу, который будет рассматриваться как подлинный запрос. Это можно сделать с помощью URL-адреса, загрузки изображения, XMLHttpRequest и т. д., что может привести к раскрытию данных или непреднамеренному выполнению кода.

Remediation:#

Вот несколько шагов для устранения атак с подделкой межсайтовых запросов (CSRF):

  • Используйте токены CSRF: создайте уникальный токен для каждого сеанса пользователя и сохраните его на сервере. При отправке формы токен включается как скрытое поле и проверяется на сервере, чтобы гарантировать, что он был отправлен тем же пользователем, который запросил форму.
  • Проверьте заголовки Origin и Referrer: убедитесь, что заголовки Origin и Referrer соответствуют ожидаемым значениям. Это помогает предотвратить атаки CSRF, использующие методы, отличные от GET или POST.
  • Использовать файлы cookie SameSite. Установите для атрибута SameSite всех файлов cookie значение Lax или Strict. Это помогает предотвратить атаки CSRF, позволяя отправлять файлы cookie только с запросами из одного и того же источника.
  • Внедрение мер по борьбе с автоматизацией. Внедрение мер по борьбе с автоматизацией для обнаружения и предотвращения автоматизированных атак. Например, для предотвращения автоматических атак можно использовать ограничение скорости, CAPTCHA или IP-фильтрацию.

Вот пример кода на Python, который реализует первые два шага:

Пример использования CSRF-токена
from flask import Flask, request, render_template
app = Flask(__name__)
app.secret_key = 'secret_key'
def generate_csrf_token():
"""Generate a unique token for each user session."""
token = str(random.getrandbits(256))
session['csrf_token'] = token
return token
@app.route('/form', methods=['GET'])
def form():
"""Display a form for the user to fill out."""
csrf_token = generate_csrf_token()
return render_template('form.html', csrf_token=csrf_token)
@app.route('/submit', methods=['POST'])
def submit():
"""Submit the form and process the data."""
# Validate the CSRF token
if request.form['csrf_token'] != session.get('csrf_token'):
return "Invalid CSRF token.", 400
# Validate the Origin and Referrer headers
if request.headers.get('Origin') != 'https://example.com':
return "Invalid Origin header.", 400
if request.headers.get('Referer') != 'https://example.com/form':
return "Invalid Referrer header.", 400
# Process the form data
# ...
return "Form data submitted successfully."

Этот код реализует использование токенов CSRF и проверку заголовков Origin и Referrer. Код использует веб-фреймворк Flask и функцию render_template для отображения формы со скрытым полем, содержащим токен CSRF. Код проверяет, что токен, отправленный с формой, соответствует токену, хранящемуся в сеансе пользователя. Код также проверяет соответствие заголовков Origin и Referrer ожидаемым значениям. Атрибут SameSite в файлах cookie и меры по борьбе с автоматизацией должны быть реализованы в соответствии с конкретными требованиями вашего приложения.

Additional:#

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