Command Injection
Inyección de comandos
Descripción
La inyección de comandos es una brecha de seguridad que permite la ejecución no autorizada de comandos dentro del sistema operativo de un servidor. Ocurre cuando una aplicación transfiere inadvertidamente entradas de usuario no verificadas (de formularios, cookies, encabezados HTTP, etc.) directamente al shell del sistema. Esto permite a los atacantes ejecutar sus propios comandos, generalmente con los mismos permisos que la aplicación vulnerable. Los ataques de inyección de comandos son posibles en gran medida debido a una validación insuficiente de la entrada.
Ejemplos
Java
String userInput = request.getParameter("input");
Runtime.getRuntime().exec("ls " + userInput);
Javascript
const userInput = req.body.input;
const exec = require('child_process').exec;
exec('ls ' + userInput, (error, stdout, stderr) => {
console.log(stdout);
});
Php
$userInput = $_GET['input'];
system('ls ' . $userInput);
Recomendación
Para mitigar la vulnerabilidad de inyección de comandos, aquí hay algunas recomendaciones:
-
Evitar la ejecución de entradas proporcionadas por el usuario: Absténgase de ejecutar datos proporcionados por el usuario directamente dentro de comandos o shells del sistema. Valide y utilice listas blancas u opciones predefinidas siempre que sea posible.
-
Evitar la concatenación: Evite concatenar directamente la entrada del usuario en los comandos del sistema, en su lugar, pásela en una lista separada de argumentos.
-
Validación y saneamiento de entradas: Valide y sanee siempre las entradas de los usuarios. Asegúrese de que cualquier dato proporcionado por el usuario y pasado al shell del sistema o a las funciones de ejecución de comandos esté saneado y restringido a los caracteres o patrones esperados.
-
Principio de privilegio mínimo: Ejecute su aplicación o servicios con los mínimos privilegios posibles requeridos para realizar las acciones necesarias. Evite ejecutar servicios con privilegios de superusuario o administrador.
Ejemplos
Java
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the file name: ");
String userInput = scanner.nextLine(); // Takes user input
// Sanitize user input to prevent command injection
String sanitizedInput = userInput.replaceAll("[^A-Za-z0-9]", ""); // Example sanitization
// Command execution
ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l", sanitizedInput);
// Redirect error stream to output
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
Php
<?php
// User-supplied filename
$userInput = $_POST['filename']; // Example: 'file.txt'
// Validate and sanitize user input
if (preg_match('/^[a-zA-Z0-9_\.]+$/', $userInput)) { // Validate against alphanumeric and dot
// Safely escape the user input to prevent command injection
$escapedInput = escapeshellarg($userInput);
// Command execution using the sanitized input
$command = "ls -l " . $escapedInput;
$output = shell_exec($command);
echo "<pre>$output</pre>";
} else {
echo "Invalid filename input!";
}
?>
Enlaces
Estándares
- CWE_TOP_25:
- CWE_20
- CWE_78
- GDPR:
- ART_5
- ART_32
- PCI_STANDARDS:
- REQ_6_2
- REQ_6_3
- REQ_11_3
- SOC2_CONTROLS:
- CC_2_1
- CC_3_4
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213
- SECURITY255