Skip to main content

V12.3.3 File Execution

Requirement:#

Verify that user-submitted filename metadata is validated or ignored to prevent the disclosure or execution of remote files via Remote File Inclusion (RFI) or Server-side Request Forgery (SSRF) attacks.

Explanation:#

Требование защищает от раскрытия или выполнения удаленных файлов с помощью атак Remote File Inclusion (RFI) или Server-side Request Forgery (SSRF). Данное требование направлено на обеспечение правильной проверки или игнорирования метаданных имен файлов, передаваемых пользователем, для снижения риска атак такого типа.

1 User-Submitted Filename Metadata:

  • Это относится к информации, предоставляемой пользователями, которая влияет на названия файлов, с которыми взаимодействует приложение. Сюда входят имена файлов, полученные при загрузке файлов, URL-адресов или других входных данных, где имена файлов являются частью данных.

2 Remote File Inclusion (RFI):

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

3 Server-side Request Forgery (SSRF):

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

Remediation:#

Для выполнения данного требования и предотвращения RFI- и SSRF-атак:

1 Validate User Inputs:

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

2 Whitelist Allowed Sources:

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

3 Limit Access to Remote Resources:

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

4 URL Whitelisting and Validation:

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

5 Content-Type Validation:

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

6 Input Validation:

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

7 Security Testing:

  • Проведение тестирования безопасности, включая оценку уязвимостей и тестирование на проникновение, для выявления и устранения потенциальных уязвимостей RFI и SSRF.

Пример приложения Flask, в котором учтены проблемы безопасности и соблюдены лучшие практики предотвращения уязвимостей Server-Side Request Forgery (SSRF). Этот пример включает проверку ввода, "белые списки" URL, проверку содержимого и правильную обработку ошибок:

Пример безопасной реализации бэкэнда
import requests
from flask import Flask, request, abort
app = Flask(__name__)
# Define a whitelist of trusted domains
ALLOWED_DOMAINS = ["example.com", "trusted-site.com"]
@app.route("/load-file")
def load_file():
# Get the filename parameter from the query string
filename = request.args.get("filename")
# Check if the filename parameter is provided
if not filename:
return "Filename parameter missing", 400
# Extract the domain from the provided URL
try:
domain = filename.split("//")[1].split("/")[0]
except IndexError:
return "Invalid filename", 400
# Check if the domain is in the whitelist
if domain not in ALLOWED_DOMAINS:
return "Unauthorized domain", 403
# Load the file content using the requests library
try:
response = requests.get(filename)
response.raise_for_status() # Raise an exception if the request is not successful
except requests.exceptions.RequestException as e:
return str(e), 500
# Validate content type (customize based on expected content types)
content_type = response.headers.get("content-type", "").lower()
if not content_type.startswith("text/") and not content_type.startswith("image/"):
return "Invalid content type", 400
# Return the file content
return response.content, 200
if __name__ == "__main__":
app.run()

В этом коде:

  • Список ALLOWED_DOMAINS содержит доверенные домены, которым разрешено получать файлы. Измените этот список таким образом, чтобы в него вошли те домены, которым вы доверяете.
  • Приложение проверяет, отсутствует ли предоставленный параметр filename и находится ли извлекаемый домен в разрешенном белом списке.
  • С помощью метода raise_for_status() вызывается исключение в случае неуспешного выполнения HTTP-запроса, что позволяет правильно обработать ошибки.
  • Тип содержимого ответа проверяется, разрешая только определенные типы содержимого, такие как текст и изображения. Вы можете настроить эту проверку в соответствии с ожидаемыми типами содержимого вашего приложения.
  • Код возвращает соответствующие HTTP-ответы для различных сценариев, включая неавторизованные домены, недопустимые типы содержимого и внутренние ошибки сервера.

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

Additional:#

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