1. Descripción técnica
Una OS Command Injection aparece cuando una aplicación incorpora una entrada controlada por el usuario a una orden del sistema operativo y la entrega a un intérprete sin separar correctamente datos y sintaxis. El límite de confianza se rompe entre la entrada externa y el proceso que ejecuta la orden.
No toda ejecución de comandos es una inyección. Si la aplicación ofrece deliberadamente un parámetro que representa una orden completa, el problema puede ser una exposición directa de funcionalidad peligrosa. Si intenta ejecutar un programa fijo pero permite introducir separadores, sustituciones o argumentos con efectos secundarios, existe una inyección dentro de la orden prevista.
1.1. Mecanismo
// renderizando diagrama…
Los metacaracteres dependen del intérprete. En una shell de Unix, ;, &&, |, sustituciones y redirecciones pueden alterar el flujo. Sin embargo, una lista de caracteres prohibidos no resuelve todos los casos, porque algunas utilidades aceptan opciones que también ejecutan programas.
2. Impacto
El atacante puede leer o modificar archivos, iniciar conexiones, ejecutar herramientas disponibles y utilizar las credenciales accesibles para el proceso. El alcance queda limitado inicialmente por la identidad y el aislamiento del servicio. Una aplicación ejecutada como usuario sin privilegios no produce root de forma automática.
3. Condiciones necesarias
- Una entrada externa alcanza la construcción de una orden.
- La aplicación invoca una shell o una utilidad con comportamiento controlable.
- La validación no impide modificar la semántica prevista.
- El proceso tiene permisos o acceso a recursos útiles para el atacante.
Codificar la entrada en Base64 o URL encoding no la neutraliza. Esas transformaciones cambian su representación, pero la cadena recupera su significado cuando el servidor la decodifica antes de ejecutarla.
4. Validación y detección
Primero se utiliza una orden inocua y determinista, como consultar la identidad o producir un valor reconocible. Una respuesta distinta no basta: hay que descartar que el texto sólo haya sido reflejado por la aplicación.
En revisión de código se buscan funciones de ejecución de procesos y concatenaciones de entrada externa. También deben revisarse scripts invocados mediante sudo, tareas programadas y wrappers que delegan argumentos en otras herramientas.
5. Explotación documentada en los writeups
5.1. 004-flower
Una expresión PHP codificada en Base64 termina evaluando system($_GET['cmd']). El parámetro cmd se convierte en la entrada reutilizable para ejecutar órdenes.
5.2. 007-pwned
Un script asigna el mensaje recibido a msg y luego ejecuta $msg. Introducir una ruta de shell reemplaza el uso esperado del mensaje por un programa.
5.3. 012-whitedoor
La aplicación intenta permitir sólo ls, pero acepta ls; segundo_comando. El separador satisface la comprobación inicial y añade otra orden.
5.4. 015-insomnia
El parámetro logfile se inserta en una orden. Un punto y coma termina el argumento esperado y comienza una conexión saliente.
5.5. 016-method
El valor enviado por POST llega directamente al ejecutor. La salida de id diferencia ejecución real de un reflejo de texto.
6. Mitigación
- Evitar la shell y utilizar APIs que reciban el ejecutable y cada argumento por separado.
- Sustituir entradas libres por identificadores que el servidor traduzca a operaciones fijas.
- Validar contra una lista de valores permitidos y rechazar opciones adicionales.
- Ejecutar el servicio con privilegios mínimos y dentro de un aislamiento apropiado.
- Registrar la orden lógica solicitada sin almacenar secretos en los logs.
El escapado puede servir como defensa secundaria cuando no existe otra opción, pero debe corresponder exactamente al intérprete y al contexto donde se insertará el valor.
7. Clasificación
- CWE: CWE-78
- Vector: entrada externa incorporada a una orden del sistema
- Impacto principal: ejecución de comandos con la identidad del proceso vulnerable