Improper Neutralization of Special Elements used in an OS Command
User input is passed unsanitized to system shell commands, allowing attackers to execute arbitrary commands on the server.
Cómo corregir esta vulnerabilidad
Estrategias de prevención para OS Command Injection basadas en 3 reglas de detección de Shoulder.
Use exec.Command with explicit arguments, never shell invocation
package main import ( "net/http" "os/exec" - ) - - func handler(w http.ResponseWriter, r *http.Request) { - cmd := r.URL.Query().Get("cmd") - // Vulnerable: shell invocation with user input - output, _ := exec.Command("sh", "-c", cmd).Output() + "regexp" + ) + + var safePattern = regexp.MustCompile(`^[a-zA-Z0-9._-]+$`) + + func handler(w http.ResponseWriter, r *http.Request) { + filename := r.URL.Query().Get("file") + // Validate input + if !safePattern.MatchString(filename) { + http.Error(w, "Invalid filename", http.StatusBadRequest) + return + } + // Safe: explicit command with validated argument + output, _ := exec.Command("cat", filename).Output() w.Write(output) }
Use execFile/spawn with array arguments instead of exec with string commands
- const { exec } = require('child_process'); - - app.get('/convert', (req, res) => { - const filename = req.query.file; - exec(`convert ${filename} output.png`, (err, stdout) => { + const { execFile } = require('child_process'); + + app.get('/convert', (req, res) => { + const filename = req.query.file; + execFile('convert', [filename, 'output.png'], (err, stdout) => { res.send('Converted'); }); });
Use subprocess.run with list arguments and shell=False
import subprocess from flask import request @app.route('/convert') def convert(): filename = request.args.get('file') - subprocess.run(f'convert {filename} output.png', shell=True) + subprocess.run(['convert', filename, 'output.png'], check=True) return 'Done'
Encuentra vulnerabilidades en tu código
Usa Shoulder para escanear tu código en busca de patrones Command Injection. 3 reglas.
# Scan with Shoulder CLI npx @shoulderdev/cli trust --cwe=78 # Or scan entire project npx @shoulderdev/cli trust .
Reglas de Detección (3)
Qué buscar en las revisiones de código
Estos patrones indican vulnerabilidades potenciales de Command Injection. Búscalos durante las revisiones de código y auditorías de seguridad.
Patrones de revisión manual
Al revisar código manualmente, busca estos patrones peligrosos.
query = + concatenación de cadenasexecute(f"... or execute("..." +raw_query, rawQuery, executeRaw${ or #{ dentro de cadenas SQLCómo piensan los expertos en seguridad
El modelo mental que usan los profesionales de seguridad al revisar esta vulnerabilidad.
Mapea los puntos de entrada
Parámetros de URL, cuerpos POST, encabezados, cookies, subidas de archivos.
Rastrea el flujo de datos
Sigue la entrada a través del código. ¿Se sanea?
Identifica los sumideros
Where queries are executed: execute(), query()
Verifica los límites de confianza
Vigila los datos almacenados que se usan en consultas.
Escanea tu base de código para Command Injection
Shoulder CLI encuentra patrones vulnerables en toda tu base de código.