Skip to main content

V12.6.1 SSRF Protection

Requirement:#

Verify that the web or application server is configured with an allow list of resources or systems to which the server can send requests or load data/files from.

Explanation:#

Атака  Server-Side Request Forgery (SSRF) происходит, когда злоумышленник обманом заставляет сервер выполнять нежелательные запросы к внутренним ресурсам или внешним системам, к которым сервер не должен иметь доступа. Данное требование направлено на обеспечение того, чтобы веб-сервер или сервер приложений был настроен с разрешенным списком (также известным как "whitelist") ресурсов или систем, которым разрешено отправлять запросы или загружать данные/файлы из них.

1 Allow List (Whitelist):

  • Allow List, также известный как "белый список", представляет собой предопределенный список доверенных ресурсов, доменов, IP-адресов или систем, с которыми серверу явно разрешено взаимодействовать или к которым он имеет доступ. Разрешены только запросы к этим доверенным ресурсам, а любые запросы к ресурсам, не включенным в список, отклоняются.

2 Protection Against SSRF:

  • Атаки SSRF подразумевают манипулирование сервером с целью выполнения запросов к внутренним сервисам, чувствительным API или внешним системам, что может привести к несанкционированному раскрытию данных или уязвимостям в системе безопасности. Использование Allow List, позволяет ограничить взаимодействие сервера только с определенными, доверенными ресурсами, что минимизирует риск SSRF-атак.

3 Confined Scope:

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

4 Prevention of Data Leakage:

  • Применяя allow list, сервер предотвращает утечку конфиденциальных данных, обеспечивая взаимодействие только с теми ресурсами, которые предназначены для доступа. Это снижает риск случайного раскрытия конфиденциальной информации злоумышленникам.

5 Minimized Attack Surface:

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

6 Explicit Authorization:

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

Remediation:#

Чтобы выполнить требование выполните следующее:

1 Define an Allow List:

  • Определите доверенные ресурсы, домены, IP-адреса или системы, с которыми должно взаимодействовать ваше приложение. Создайте полный и постоянно обновляемый allow list.

2 Configure Server Settings:

  • Настройте параметры сервера таким образом, чтобы все исходящие запросы от приложения попадали в allow list. Блокируйте запросы к ресурсам, не включенным в список.

3 Use Absolute URLs:

  • Убедитесь, что в allow list используются абсолютные URL-адреса для большей точности и контроля. Это не позволит злоумышленникам использовать относительные URL-адреса для обхода allow list.

4 Validate and Sanitize User Input:

  • Обеспечьте строгую проверку и очистку вводимых данных, чтобы предотвратить внедрение злоумышленниками вредоносных URL-адресов или попытки манипулирования allow list ресурсов через пользовательский ввод.

5 Regularly Update the Allow List:

  • Регулярно обновляйте allow list запросов в зависимости от изменений в требованиях к приложению и доверенным ресурсам.

6 Monitor for Unauthorized Requests:

  • Внедрите механизмы мониторинга для обнаружения и регистрации всех попыток запросов, нарушающих allow list. Эти журналы помогут выявить потенциальные попытки атак SSRF и отреагировать на них.
Пример защиты от SSRF с помощью  allow list в веб-приложении
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
# Define the allowed domains or IPs
ALLOWED_DOMAINS = ['trusted-api.com', 'api.example.com', '127.0.0.1']
@app.route('/')
def index():
return "SSRF Protection Example"
@app.route('/fetch_data', methods=['POST'])
def fetch_data():
url = request.form.get('url')
# Check if the URL's domain or IP is in the allowed list
parsed_url = urlparse(url)
if parsed_url.netloc not in ALLOWED_DOMAINS:
return "Unauthorized URL", 403
# Fetch data from the allowed URL
response = requests.get(url)
data = response.text
return jsonify(data=data)
if __name__ == '__main__':
app.run(debug=True)

Теперь ваше приложение готово к работе. Оно содержит endpoint /fetch_data, который получает данные с указанного URL после проверки наличия домена или IP-адреса URL в allow list. Если URL не входит в allow list, то конечная точка возвращает сообщение "Unauthorized URL" с кодом состояния 403.

Обратите внимание, что данный пример представляет собой пример защиты от SSRF с помощью allow list. В реальных условиях необходимо применять более надежную проверку вводимых данных, обрабатывать различные форматы URL и использовать дополнительные меры безопасности.

Additional:#