Skip to main content

V12.3.5 File Execution

Requirement:#

Verify that untrusted file metadata is not used directly with system API or libraries, to protect against OS command injection.

Explanation:#

Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ Π°Ρ‚Π°ΠΊ OS command injection, гарантируя, Ρ‡Ρ‚ΠΎ Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с систСмными API ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ. Π”Π°Π½Π½ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ Π½Π° ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌΠΈ врСдоносных ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС.

Remediation:#

Для выполнСния этого трСбования ΠΈ прСдотвращСния OS command injection Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  1. Input Validation and Sanitization.

ΠŸΡ€ΠΎΠ²Π΅ΡΡ‚ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для систСмных API ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

  1. Use Safe APIs.

По возмоТности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ высокоуровнСвыС ΠΈ бСзопасныС API, прСдоставляСмыС языком программирования ΠΈΠ»ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ ΠΎΡ‚ прямого взаимодСйствия с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой.

  1. Avoid Dynamic Command Construction.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ динамичСского построСния ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡƒΡ‚Π΅ΠΌ объСдинСния нСдостовСрных Π΄Π°Π½Π½Ρ‹Ρ… с ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΌΠΈ строками. ВмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ запросы ΠΈΠ»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ построСния ΠΊΠΎΠΌΠ°Π½Π΄.

  1. Use Proper Escaping.

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ экранированы ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ для прСдотвращСния ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π°Ρ‚Π°ΠΊ.

  1. Whitelisting Allowed Values.

ΠŸΡ€ΠΈ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ "Π±Π΅Π»Ρ‹Π΅ списки" для опрСдСлСния допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½Π΅ соотвСтствуСт "Π±Π΅Π»ΠΎΠΌΡƒ списку".

  1. Content Security.

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ содСрТимого, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² извСстных ΠΈ бСзопасных мСстах.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠ΅Ρ€Ρ‹ для выполнСния трСбования ΠΏΠΎ Π·Π°Ρ‰ΠΈΡ‚Π΅ ΠΎΡ‚ Π°Ρ‚Π°ΠΊΠΈ OS command injection:

import os
import shlex
from flask import Flask, request, Response
app = Flask(__name__)
ALLOWED_EXTENSIONS = ["txt", "pdf", "docx"] # Example list of allowed file extensions
def is_allowed_extension(filename):
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route("/download")
def download_file():
# Get the filename parameter from the query string
filename = request.args.get("filename")
if not filename:
return "Filename parameter missing", 400
# Validate filename and extension
if not is_allowed_extension(filename):
return "Invalid file extension", 400
# Sanitize the filename before constructing the command
sanitized_filename = shlex.quote(filename)
# Construct and execute the safe command
command = f"cat {sanitized_filename}" # Example command to read file content
try:
content = os.popen(command).read() # Execute command safely
response = Response(content, content_type="text/plain")
response.headers["Content-Disposition"] = f'attachment; filename="{filename}"'
return response
except Exception as e:
return str(e), 500
if __name__ == "__main__":
app.run()

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

  • Ѐункция is_allowed_extension провСряСт, Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² список Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ.
  • download_file выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ бСзопасны для использования.
  • ΠžΡ‡ΠΈΡ‰Π΅Π½Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для построСния ΠΈ бСзопасного выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ os.popen.
  • Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° считываСтся ΠΈ возвращаСтся Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, очистка ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок, исходя ΠΈΠ· Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ прилоТСния ΠΈ сообраТСний бСзопасности.

Additional:#

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